Author: uwe Date: 2008-03-01 20:07:46 +0100 (Sat, 01 Mar 2008) New Revision: 3123
Added: trunk/util/lxbios/nvramtool.1 trunk/util/lxbios/nvramtool.c trunk/util/lxbios/nvramtool.spec Removed: trunk/util/lxbios/lxbios.1 trunk/util/lxbios/lxbios.c trunk/util/lxbios/lxbios.spec Log: Rename lxbios to nvramtool, step 2 (rename files).
Signed-off-by: Uwe Hermann uwe@hermann-uwe.de Acked-by: Stefan Reinauer stepan@coresystems.de
Deleted: trunk/util/lxbios/lxbios.1 =================================================================== --- trunk/util/lxbios/lxbios.1 2008-03-01 19:06:32 UTC (rev 3122) +++ trunk/util/lxbios/lxbios.1 2008-03-01 19:07:46 UTC (rev 3123) @@ -1,255 +0,0 @@ -."***************************************************************************\ -." nvramtool.1 -." $Id$ -."*************************************************************************** -." Copyright (C) 2002, 2003 The Regents of the University of California. -." Produced at the Lawrence Livermore National Laboratory. -." Written by David S. Peterson dsp@llnl.gov dave_peterson@pobox.com. -." UCRL-CODE-2003-012 -." All rights reserved. -." -." This file is part of nvramtool, a utility for reading/writing coreboot -." parameters and displaying information from the coreboot table. -." For details, see http://coreboot.org/nvramtool. -." -." Please also read the file DISCLAIMER which is included in this software -." distribution. -." -." This program is free software; you can redistribute it and/or modify it -." under the terms of the GNU General Public License (as published by the -." Free Software Foundation) version 2, dated June 1991. -." -." This program is distributed in the hope that it will be useful, but -." WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF -." MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and -." conditions of the GNU General Public License for more details. -." -." You should have received a copy of the GNU General Public License along -." with this program; if not, write to the Free Software Foundation, Inc., -." 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -."***************************************************************************/ -.TH NVRAMTOOL 1 "January 2008" Linux -.SH NAME -nvramtool - read/write coreboot-related information -.SH SYNOPSIS -.B "nvramtool [OPTS] [-n] -r NAME" -.br -.B "nvramtool [OPTS] -e NAME" -.br -.B "nvramtool [OPTS] -a" -.br -.B "nvramtool [OPTS] -w NAME=VALUE" -.br -.B "nvramtool [OPTS] -p INPUT_FILE" -.br -.B "nvramtool [OPTS] -i" -.br -.B "nvramtool [OPTS] -c [VALUE]" -.br -.B "nvramtool [OPTS] -l [ARG]" -.br -.B "nvramtool [OPTS] -d" -.br -.B "nvramtool [OPTS] -Y" -.br -.B "nvramtool [OPTS] -b OUTPUT_FILE" -.br -.B "nvramtool [OPTS] -B INPUT_FILE" -.br -.B "nvramtool [OPTS] -x" -.br -.B "nvramtool [OPTS] -X DUMPFILE" -.br -.B "nvramtool [OPTS] -v" -.br -.B "nvramtool [OPTS] -h" -.SH DESCRIPTION -.B "nvramtool" -is a utility for reading/writing coreboot parameters and displaying -information from the coreboot table. - -The coreboot table resides in low physical memory. It is created at boot -time by coreboot, and contains various system information such as the type -of mainboard in use. It specifies locations in the CMOS (nonvolatile RAM) -where the coreboot parameters are stored. - -This program is intended for (x86-based) systems that use coreboot. For -information about coreboot, see -.br -http://www.coreboot.org/. -.SH PARAMETERS -.TP -.B "[-n] -r NAME" -Show the value of the coreboot parameter given by -.B "NAME." -If -.B "-n" -is specified, show only the value. Otherwise show both parameter name and -value. -.TP -.B "-e NAME" -Show all possible values for parameter given by -.B "NAME." -.TP -.B "-a" -Show the names and values for all coreboot parameters. -.TP -.B "-w NAME=VALUE" -Assign -.B "VALUE" -to coreboot parameter given by -.B "NAME." -.TP -.B "-p INPUT_FILE" -Assign values to coreboot parameters according to the contents of -.B "INPUT_FILE." -The format of this file is described below. -.TP -.B "-i" -This is similar to the -.B "-p" -option, except that the contents of the input file are taken from standard -input. -.TP -.B "-c [VALUE]" -If -.B "VALUE" -is present then set the CMOS checksum for the coreboot parameters to -.B "VALUE." -Otherwise, show the checksum value. -.TP -.B "-l [ARG]" -If -.B "ARG" -is present then show information from the coreboot table as specified by -.B "ARG." -Otherwise show all possible values for -.B "ARG." -.TP -.B "-d" -Do a low-level dump of the coreboot table. -.TP -.B "-Y" -Write CMOS layout information to standard output. If redirected to a file, -the layout information may be used as input for the -.B "'-y LAYOUT_FILE'" -option (see below). -.TP -.B "-b OUTPUT_FILE" -Write the contents of CMOS memory to the binary file -.B "OUTPUT_FILE." -The first 14 bytes of -.B "OUTPUT_FILE" -do not contain actual CMOS data, and are always written as zeros. This is -because the first 14 bytes of the CMOS area do not contain CMOS memory. These -bytes are involved with the functioning of the real time clock. -.TP -.B "-B INPUT_FILE" -Read binary data from -.B "INPUT_FILE" -and write the data to CMOS memory. The first 14 bytes of -.B "INPUT_FILE" -are skipped and data is written to CMOS starting at the 15th byte of the CMOS -area. This is because the first 14 bytes of the CMOS area do not contain CMOS -memory. These bytes are involved with the functioning of the real time clock. -.TP -.B "-x" -Show a hex dump of all CMOS data. The first 14 bytes of the dump do not -contain actual CMOS data, and are always shown as zeros. This is because the -first 14 bytes of the CMOS area do not contain CMOS memory. These bytes are -involved with the functioning of the real time clock. -.TP -.B "-X DUMPFILE" -Read binary data from -.B "DUMPFILE" -(presumably a CMOS dumpfile created using the -.B "-b OUTPUT_FILE" -option) and show a hex dump of the data. -.TP -.B "-v" -Show version information for this program. -.TP -.B "-h" -Show a help message for this program. -.SH "OPTIONS" -In all cases above, -.B "[OPTS]" -evaluates to the following: - -.B " [-y LAYOUT_FILE | -t]" - -The -.B "'-y LAYOUT_FILE'" -option tells nvramtool to obtain CMOS layout information from the contents of -.B "LAYOUT_FILE." -Likewise, the -.B "'-t'" -option tells nvramtool to obtain CMOS layout information from the CMOS option -table (contained within the coreboot table). If neither option is -specified, the CMOS option table is used by default. -.B "LAYOUT_FILE" -follows the format of the -.B "cmos.layout" -files provided by coreboot. - -If the coreboot installed on your system was built without specifying -.B "HAVE_OPTION_TABLE," -then the coreboot table will not contain a CMOS option table. In this case, -the -.B "'-y LAYOUT_FILE'" -option must be used. - -These two options are silently ignored when used in combination with other -options (such as -.B "-h," -for instance) for which they are not applicable. -.SH FILE FORMAT -For the -.B "-p" -option, -.B "INPUT_FILE" -must consist of a sequence of lines such that each line is either a blank -line, a comment, or an assignment. A blank line consists only of zero or -more whitespace characters (spaces and tabs). A comment is constructed as -follows: - -.B " [ws]#[text]" - -Here, -.B "[ws]" -indicates optional whitespace characters and -.B "[text]" -indicates optional text. Blank lines and comments are both ignored. An -assignment is constructed as follows: - -.B " [ws]NAME[ws]=[ws]VALUE[ws]" - -Here, -.B "NAME" -is the name of a coreboot parameter and -.B "VALUE" -is the value that will be assigned to -.B "NAME." -.B "VALUE" -is allowed to contain whitespace characters, but it must begin and end with -nonwhitespace characters. Note that each comment must appear on a line by -itself. If you attempt to add a comment to the end of an assignment, then the -comment will be interpreted as part of -.B "VALUE." -It is useful to observe that the output produced by both the -.B "-a" -and the -.B "'[-n] NAME'" -options (without -.B "-n" -specified) adheres to this file format. -.SH BUGS -This program does not implement any type of synchronization to ensure that -different processes don't stomp on each other when trying to access the -nonvolatile RAM simultaneously. Therefore, corruption of the BIOS parameter -values may occur if multiple instances of this program are executed -concurrently. -.SH AUTHORS -David S. Peterson dsp@llnl.gov dave_peterson@pobox.com -.br -Stefan Reinauer stepan@openbios.org
Deleted: trunk/util/lxbios/lxbios.c =================================================================== --- trunk/util/lxbios/lxbios.c 2008-03-01 19:06:32 UTC (rev 3122) +++ trunk/util/lxbios/lxbios.c 2008-03-01 19:07:46 UTC (rev 3123) @@ -1,754 +0,0 @@ -/*****************************************************************************\ - * nvramtool.c - * $Id$ - ***************************************************************************** - * Copyright (C) 2002-2005 The Regents of the University of California. - * Produced at the Lawrence Livermore National Laboratory. - * Written by Dave Peterson dsp@llnl.gov dave_peterson@pobox.com. - * UCRL-CODE-2003-012 - * All rights reserved. - * - * This file is part of nvramtool, a utility for reading/writing coreboot - * parameters and displaying information from the coreboot table. - * For details, see http://coreboot.org/nvramtool. - * - * Please also read the file DISCLAIMER which is included in this software - * distribution. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License (as published by the - * Free Software Foundation) version 2, dated June 1991. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and - * conditions of the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -*****************************************************************************/ - -#include "common.h" -#include "opts.h" -#include "lbtable.h" -#include "layout.h" -#include "layout_file.h" -#include "input_file.h" -#include "cmos_ops.h" -#include "cmos_lowlevel.h" -#include "reg_expr.h" -#include "hexdump.h" - -typedef void (*op_fn_t) (void); - -static void op_show_version (void); -static void op_show_usage (void); -static void op_lbtable_show_info (void); -static void op_lbtable_dump (void); -static void op_show_param_values (void); -static void op_cmos_show_one_param (void); -static void op_cmos_show_all_params (void); -static void op_cmos_set_one_param (void); -static void op_cmos_set_params_stdin (void); -static void op_cmos_set_params_file (void); -static void op_cmos_checksum (void); -static void op_show_layout (void); -static void op_write_cmos_dump (void); -static void op_read_cmos_dump (void); -static void op_show_cmos_hex_dump (void); -static void op_show_cmos_dumpfile (void); -static int list_one_param (const char name[], int show_name); -static int list_all_params (void); -static void list_param_enums (const char name[]); -static void set_one_param (const char name[], const char value[]); -static void set_params (FILE *f); -static void parse_assignment (char arg[], const char **name, - const char **value); -static int list_cmos_entry (const cmos_entry_t *e, int show_name); -static uint16_t convert_checksum_value (const char value[]); - -static const op_fn_t op_fns[] = - { op_show_version, - op_show_usage, - op_lbtable_show_info, - op_lbtable_dump, - op_show_param_values, - op_cmos_show_one_param, - op_cmos_show_all_params, - op_cmos_set_one_param, - op_cmos_set_params_stdin, - op_cmos_set_params_file, - op_cmos_checksum, - op_show_layout, - op_write_cmos_dump, - op_read_cmos_dump, - op_show_cmos_hex_dump, - op_show_cmos_dumpfile - }; - -static const hexdump_format_t cmos_dump_format = - { 16, 2, "", " | ", " ", " | ", '.', NULL }; - -/**************************************************************************** - * main - ****************************************************************************/ -int main (int argc, char *argv[]) - { cmos_layout_get_fn_t fn; - - parse_nvramtool_args(argc, argv); - - if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].found) - { set_layout_filename( - nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].param); - fn = get_layout_from_file; - } - else - fn = get_layout_from_cmos_table; - - register_cmos_layout_get_fn(fn); - op_fns[nvramtool_op.op](); - return 0; - } - -/**************************************************************************** - * op_show_version - * - * -v - * - * Show version information for this program. - ****************************************************************************/ -static void op_show_version (void) - { printf("This is %s version %s.\n", prog_name, prog_version); } - -/**************************************************************************** - * op_show_usage - * - * -h - * - * Show a usage message for this program. - ****************************************************************************/ -static void op_show_usage (void) - { usage(stdout); } - -/**************************************************************************** - * op_lbtable_show_info - * - * -l [ARG] - * - * If ARG is present, show coreboot table information specified by ARG. - * Else show all possible values for ARG. - ****************************************************************************/ -static void op_lbtable_show_info (void) - { if (nvramtool_op.param == NULL) - list_lbtable_choices(); - else - { get_lbtable(); - list_lbtable_item(nvramtool_op.param); - } - } - -/**************************************************************************** - * op_lbtable_dump - * - * -d - * - * Do low-level dump of coreboot table. - ****************************************************************************/ -static void op_lbtable_dump (void) - { get_lbtable(); - dump_lbtable(); - } - -/**************************************************************************** - * op_show_param_values - * - * -e NAME option - * - * Show all possible values for parameter NAME. - ****************************************************************************/ -static void op_show_param_values (void) - { get_cmos_layout(); - list_param_enums(nvramtool_op.param); - } - -/**************************************************************************** - * op_cmos_show_one_param - * - * [-n] -r NAME - * - * Show parameter NAME. If -n is specified, show value only. Else show name - * and value. - ****************************************************************************/ -static void op_cmos_show_one_param (void) - { int result; - - get_cmos_layout(); - result = list_one_param(nvramtool_op.param, - !nvramtool_op_modifiers[NVRAMTOOL_MOD_SHOW_VALUE_ONLY].found); - cmos_checksum_verify(); - - if (result) - exit(1); - } - -/**************************************************************************** - * op_cmos_show_all_params - * - * -a - * - * Show names and values for all parameters. - ****************************************************************************/ -static void op_cmos_show_all_params (void) - { int result; - - get_cmos_layout(); - result = list_all_params(); - cmos_checksum_verify(); - - if (result) - exit(1); - } - -/**************************************************************************** - * op_cmos_set_one_param - * - * -w NAME=VALUE - * - * Set parameter NAME to VALUE. - ****************************************************************************/ -static void op_cmos_set_one_param (void) - { const char *name, *value; - - get_cmos_layout(); - - /* Separate 'NAME=VALUE' syntax into two strings representing NAME and - * VALUE. - */ - parse_assignment(nvramtool_op.param, &name, &value); - - set_one_param(name, value); - } - -/**************************************************************************** - * op_cmos_set_params_stdin - * - * -i - * - * Set parameters according to standard input. - ****************************************************************************/ -static void op_cmos_set_params_stdin (void) - { get_cmos_layout(); - set_params(stdin); - } - -/**************************************************************************** - * op_cmos_set_params_file - * - * -p INPUT_FILE - * - * Set parameters according to INPUT_FILE. - ****************************************************************************/ -static void op_cmos_set_params_file (void) - { FILE *f; - - if ((f = fopen(nvramtool_op.param, "r")) == NULL) - { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", - prog_name, nvramtool_op.param, strerror(errno)); - exit(1); - } - - get_cmos_layout(); - set_params(f); - fclose(f); - } - -/**************************************************************************** - * op_cmos_checksum - * - * -c [VALUE] - * - * If VALUE is present, set coreboot CMOS checksum to VALUE. Else show - * checksum value. - ****************************************************************************/ -static void op_cmos_checksum (void) - { uint16_t checksum; - - get_cmos_layout(); - - if (nvramtool_op.param == NULL) - { set_iopl(3); - checksum = cmos_checksum_read(); - set_iopl(0); - printf("0x%x\n", checksum); - } - else - { checksum = convert_checksum_value(nvramtool_op.param); - set_iopl(3); - cmos_checksum_write(checksum); - set_iopl(0); - } - } - -/**************************************************************************** - * op_show_layout - * - * -Y - * - * Write CMOS layout information to standard output. - ****************************************************************************/ -static void op_show_layout (void) - { get_cmos_layout(); - write_cmos_layout(stdout); - } - -/**************************************************************************** - * op_write_cmos_dump - * - * -b OUTPUT_FILE - * - * Write the contents of CMOS memory to a binary file. - ****************************************************************************/ -static void op_write_cmos_dump (void) - { unsigned char data[CMOS_SIZE]; - FILE *f; - - if ((f = fopen(nvramtool_op.param, "w")) == NULL) - { fprintf(stderr, "%s: Can not open file %s for writing: %s\n", - prog_name, nvramtool_op.param, strerror(errno)); - exit(1); - } - - set_iopl(3); - cmos_read_all(data); - set_iopl(0); - - if (fwrite(data, 1, CMOS_SIZE, f) != CMOS_SIZE) - { fprintf(stderr, "%s: Error writing CMOS data to file %s: %s\n", - prog_name, nvramtool_op.param, strerror(errno)); - exit(1); - } - - fclose(f); - } - -/**************************************************************************** - * op_read_cmos_dump - * - * -B INPUT_FILE - * - * Read binary data from a file and write the data to CMOS memory. - ****************************************************************************/ -static void op_read_cmos_dump (void) - { unsigned char data[CMOS_SIZE]; - size_t nr_bytes; - FILE *f; - - if ((f = fopen(nvramtool_op.param, "r")) == NULL) - { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", - prog_name, nvramtool_op.param, strerror(errno)); - exit(1); - } - - if ((nr_bytes = fread(data, 1, CMOS_SIZE, f)) != CMOS_SIZE) - { fprintf(stderr, "%s: Error: Only able to read %d bytes of CMOS data " - "from file %s. CMOS data is unchanged.\n", prog_name, - (int) nr_bytes, nvramtool_op.param); - exit(1); - } - - fclose(f); - set_iopl(3); - cmos_write_all(data); - set_iopl(0); - } - -/**************************************************************************** - * op_show_cmos_hex_dump - * - * -x - * - * Write a hex dump of CMOS memory to standard output. - ****************************************************************************/ -static void op_show_cmos_hex_dump (void) - { unsigned char data[CMOS_SIZE]; - - set_iopl(3); - cmos_read_all(data); - set_iopl(0); - hexdump(data, CMOS_SIZE, 0, stdout, &cmos_dump_format); - } - -/**************************************************************************** - * op_show_cmos_dumpfile - * - * -X DUMP_FILE - * - * Read binary data from a file (presumably a CMOS dump file) and display a - * hex dump of the CMOS data from the file. - ****************************************************************************/ -static void op_show_cmos_dumpfile (void) - { unsigned char data[CMOS_SIZE]; - size_t nr_bytes; - FILE *f; - - if ((f = fopen(nvramtool_op.param, "r")) == NULL) - { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", - prog_name, nvramtool_op.param, strerror(errno)); - exit(1); - } - - nr_bytes = fread(data, 1, CMOS_SIZE, f); - fclose(f); - hexdump(data, nr_bytes, 0, stdout, &cmos_dump_format); - } - -/**************************************************************************** - * list_one_param - * - * Attempt to list one CMOS parameter given by 'name'. 'show_name' is a - * boolean value indicating whether the parameter name should be displayed - * along with its value. Return 1 if error was encountered. Else return OK. - ****************************************************************************/ -static int list_one_param (const char name[], int show_name) - { const cmos_entry_t *e; - - if (is_checksum_name(name) || ((e = find_cmos_entry(name)) == NULL)) - { fprintf(stderr, "%s: CMOS parameter %s not found.\n", prog_name, name); - exit(1); - } - - if (e->config == CMOS_ENTRY_RESERVED) - { fprintf(stderr, "%s: Parameter %s is reserved.\n", prog_name, name); - exit(1); - } - - return (list_cmos_entry(e, show_name) != 0); - } - -/**************************************************************************** - * list_all_params - * - * Attempt to list all CMOS parameters. Return 1 if error was encountered. - * Else return OK. - ****************************************************************************/ -static int list_all_params (void) - { const cmos_entry_t *e; - int result; - - result = OK; - - for (e = first_cmos_entry(); e != NULL; e = next_cmos_entry(e)) - { if ((e->config == CMOS_ENTRY_RESERVED) || is_checksum_name(e->name)) - continue; - - if (list_cmos_entry(e, TRUE)) - result = 1; - } - - return result; - } - -/**************************************************************************** - * list_param_enums - * - * List all possible values for CMOS parameter given by 'name'. - ****************************************************************************/ -static void list_param_enums (const char name[]) - { const cmos_entry_t *e; - const cmos_enum_t *p; - - if (is_checksum_name(name) || (e = find_cmos_entry(name)) == NULL) - { fprintf(stderr, "%s: CMOS parameter %s not found.\n", prog_name, name); - exit(1); - } - - switch (e->config) - { case CMOS_ENTRY_ENUM: - for (p = first_cmos_enum_id(e->config_id); - p != NULL; - p = next_cmos_enum_id(p)) - printf("%s\n", p->text); - - break; - - case CMOS_ENTRY_HEX: - printf("Parameter %s requires a %u-bit unsigned integer.\n", name, - e->length); - break; - - case CMOS_ENTRY_RESERVED: - printf("Parameter %s is reserved.\n", name); - break; - - default: - BUG(); - } - } - -/**************************************************************************** - * set_one_param - * - * Set the CMOS parameter given by 'name' to 'value'. The 'name' parameter - * is case-sensitive. If we are setting an enum parameter, then 'value' is - * interpreted as a case-sensitive string that must match the option name - * exactly. If we are setting a 'hex' parameter, then 'value' is treated as - * a string representation of an unsigned integer that may be specified in - * decimal, hex, or octal. - ****************************************************************************/ -static void set_one_param (const char name[], const char value[]) - { const cmos_entry_t *e; - unsigned long long n; - - if (is_checksum_name(name) || (e = find_cmos_entry(name)) == NULL) - { fprintf(stderr, "%s: CMOS parameter %s not found.", prog_name, name); - exit(1); - } - - switch (prepare_cmos_write(e, value, &n)) - { case OK: - break; - - case CMOS_OP_BAD_ENUM_VALUE: - fprintf(stderr, "%s: Bad value for parameter %s.", prog_name, name); - goto fail; - - case CMOS_OP_NEGATIVE_INT: - fprintf(stderr, - "%s: This program does not support assignment of negative " - "numbers to coreboot parameters.", prog_name); - goto fail; - - case CMOS_OP_INVALID_INT: - fprintf(stderr, "%s: %s is not a valid integer.", prog_name, value); - goto fail; - - case CMOS_OP_RESERVED: - fprintf(stderr, - "%s: Can not modify reserved coreboot parameter %s.", - prog_name, name); - goto fail; - - case CMOS_OP_VALUE_TOO_WIDE: - fprintf(stderr, - "%s: Can not write value %s to CMOS parameter %s that is " - "only %d bits wide.", prog_name, value, name, e->length); - goto fail; - - case CMOS_OP_NO_MATCHING_ENUM: - fprintf(stderr, - "%s: coreboot parameter %s has no matching enums.", - prog_name, name); - goto fail; - - case CMOS_AREA_OUT_OF_RANGE: - fprintf(stderr, - "%s: The CMOS area specified by the layout info for " - "coreboot parameter %s is out of range.", prog_name, name); - goto fail; - - case CMOS_AREA_OVERLAPS_RTC: - fprintf(stderr, - "%s: The CMOS area specified by the layout info for " - "coreboot parameter %s overlaps the realtime clock area.", - prog_name, name); - goto fail; - - case CMOS_AREA_TOO_WIDE: - fprintf(stderr, - "%s: The CMOS area specified by the layout info for " - "coreboot parameter %s is too wide.", - prog_name, name); - goto fail; - - default: - fprintf(stderr, - "%s: Unknown error encountered while attempting to modify " - "coreboot parameter %s.", prog_name, name); - goto fail; - } - - /* write the value to nonvolatile RAM */ - set_iopl(3); - cmos_write(e->bit, e->length, n); - cmos_checksum_write(cmos_checksum_compute()); - set_iopl(0); - return; - -fail: - fprintf(stderr, " CMOS write not performed.\n"); - exit(1); - } - -/**************************************************************************** - * set_params - * - * Set coreboot parameters according to the contents of file 'f'. - ****************************************************************************/ -static void set_params (FILE *f) - { /* First process the input file. Then perform writes only if there were - * no problems processing the input. Either all values will be written - * successfully or no values will be written. - */ - do_cmos_writes(process_input_file(f)); - } - -/**************************************************************************** - * parse_assignment - * - * Parse the string 'arg' (which supposedly represents an assignment) into a - * NAME and a VALUE. If 'arg' does not conform to the proper assignment - * syntax, exit with a usage message. Otherwise, on return, 'arg' is broken - * into substrings representing NAME and VALUE, and *name and *value are set - * to point to these two substrings. - ****************************************************************************/ -static void parse_assignment (char arg[], const char **name, - const char **value) - { static const size_t N_MATCHES = 4; - regmatch_t match[N_MATCHES]; - regex_t assignment; - - compile_reg_exprs(REG_EXTENDED | REG_NEWLINE, 1, assignment_regex, - &assignment); - - /* Does 'arg' conform to proper assignment syntax? If not, exit with a - * usage message. - */ - if (regexec(&assignment, arg, N_MATCHES, match, 0)) - usage(stderr); - - /* Ok, we found a valid assignment. Break it into two strings - * representing NAME and VALUE. - */ - arg[match[1].rm_eo] = '\0'; - arg[match[2].rm_eo] = '\0'; - *name = &arg[match[1].rm_so]; - *value = &arg[match[2].rm_so]; - - free_reg_exprs(1, &assignment); - } - -/**************************************************************************** - * list_cmos_entry - * - * Attempt to list the CMOS entry represented by 'e'. 'show_name' is a - * boolean value indicating whether the parameter name should be displayed - * along with its value. On success, return OK. On error, print an error - * message and return 1. - ****************************************************************************/ -static int list_cmos_entry (const cmos_entry_t *e, int show_name) - { const cmos_enum_t *p; - unsigned long long value; - - /* sanity check CMOS entry */ - switch (prepare_cmos_read(e)) - { case OK: - break; - - case CMOS_OP_RESERVED: - BUG(); - - case CMOS_AREA_OUT_OF_RANGE: - fprintf(stderr, "%s: Can not read coreboot parameter %s because " - "layout info specifies out of range CMOS area.\n", prog_name, - e->name); - return 1; - - case CMOS_AREA_OVERLAPS_RTC: - fprintf(stderr, "%s: Can not read coreboot parameter %s because " - "layout info specifies CMOS area that overlaps realtime " - "clock area.\n", prog_name, e->name); - return 1; - - case CMOS_AREA_TOO_WIDE: - fprintf(stderr, "%s: Can not read coreboot parameter %s because " - "layout info specifies CMOS area that is too wide.\n", - prog_name, e->name); - return 1; - - default: - fprintf(stderr, "%s: Unknown error encountered while attempting to " - "read coreboot parameter %s\n", prog_name, e->name); - return 1; - } - - /* read the value from CMOS */ - set_iopl(3); - value = cmos_read(e->bit, e->length); - set_iopl(0); - - /* display the value */ - switch (e->config) - { case CMOS_ENTRY_ENUM: - if ((p = find_cmos_enum(e->config_id, value)) == NULL) - { if (show_name) - printf("# Bad value -> %s = 0x%llx\n", e->name, value); - else - printf("Bad value -> 0x%llx\n", value); - } - else - { if (show_name) - printf("%s = %s\n", e->name, p->text); - else - printf("%s\n", p->text); - } - - break; - - case CMOS_ENTRY_HEX: - if (show_name) - printf("%s = 0x%llx\n", e->name, value); - else - printf("0x%llx\n", value); - - break; - - case CMOS_ENTRY_RESERVED: - default: - BUG(); - } - - return OK; - } - -/**************************************************************************** - * convert_checksum_value - * - * 'value' is the string representation of a checksum value that the user - * wishes to set using the -c option. Convert the string to a 16-bit - * unsigned integer and return the result. Exit with an error message if - * 'value' is invalid. - ****************************************************************************/ -static uint16_t convert_checksum_value (const char value[]) - { unsigned long n; - const char *p; - uint16_t result; - int negative; - - for (p = value; isspace(*p); p++); - - negative = (*p == '-'); - n = strtoul(value, (char **) &p, 0); - - if (*p) - { fprintf(stderr, "%s: Checksum value %s is not a valid integer.\n", - prog_name, value); - exit(1); - } - - if (negative) - { fprintf(stderr, - "%s: Checksum must be an unsigned integer.\n", prog_name); - exit(1); - } - - result = (uint16_t) n; - - if (result != n) - { fprintf(stderr, - "%s: Checksum value must fit within 16 bits.\n", prog_name); - exit(1); - } - - return result; - }
Deleted: trunk/util/lxbios/lxbios.spec =================================================================== --- trunk/util/lxbios/lxbios.spec 2008-03-01 19:06:32 UTC (rev 3122) +++ trunk/util/lxbios/lxbios.spec 2008-03-01 19:07:46 UTC (rev 3123) @@ -1,50 +0,0 @@ -## -# $Id$ -## - -Name: nvramtool -Version: 2.0.1 -Release: 0 - -Summary: coreboot utility program -Group: System Environment/Base -License: GPL -Provides: nvramtool - -BuildRoot: %{_tmppath}/%{name}-%{version} - -Source0: %{name}-%{version}.tgz - -%description -nvramtool is a utility for reading/writing coreboot parameters and displaying -information from the coreboot table. - -At boot time, coreboot places a table (known as the coreboot table) in low -physical memory. The contents of this table are preserved even after -coreboot transfers control to the kernel and the kernel initializes itself. -The coreboot table contains various system information such as the type of -mainboard in use. It also specifies locations in the CMOS (nonvolatile RAM) -where the coreboot parameters are stored. - -%prep -%setup -n %{name}-%{version} - -%build -make - -%install -rm -rf "$RPM_BUILD_ROOT" -mkdir -p "$RPM_BUILD_ROOT/usr/bin" -mkdir -p "$RPM_BUILD_ROOT/usr/man/man1" -cp nvramtool "$RPM_BUILD_ROOT/usr/bin" -cp nvramtool.1.gz $RPM_BUILD_ROOT/usr/man/man1 - -%clean -rm -rf "$RPM_BUILD_ROOT" - -%files -%defattr(-,root,root,0755) -%doc ChangeLog README -%doc README -/usr/bin/nvramtool -/usr/man/man1/nvramtool.1.gz
Copied: trunk/util/lxbios/nvramtool.1 (from rev 3122, trunk/util/lxbios/lxbios.1) =================================================================== --- trunk/util/lxbios/nvramtool.1 (rev 0) +++ trunk/util/lxbios/nvramtool.1 2008-03-01 19:07:46 UTC (rev 3123) @@ -0,0 +1,255 @@ +."***************************************************************************\ +." nvramtool.1 +." $Id$ +."*************************************************************************** +." Copyright (C) 2002, 2003 The Regents of the University of California. +." Produced at the Lawrence Livermore National Laboratory. +." Written by David S. Peterson dsp@llnl.gov dave_peterson@pobox.com. +." UCRL-CODE-2003-012 +." All rights reserved. +." +." This file is part of nvramtool, a utility for reading/writing coreboot +." parameters and displaying information from the coreboot table. +." For details, see http://coreboot.org/nvramtool. +." +." Please also read the file DISCLAIMER which is included in this software +." distribution. +." +." This program is free software; you can redistribute it and/or modify it +." under the terms of the GNU General Public License (as published by the +." Free Software Foundation) version 2, dated June 1991. +." +." This program is distributed in the hope that it will be useful, but +." WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF +." MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and +." conditions of the GNU General Public License for more details. +." +." You should have received a copy of the GNU General Public License along +." with this program; if not, write to the Free Software Foundation, Inc., +." 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +."***************************************************************************/ +.TH NVRAMTOOL 1 "January 2008" Linux +.SH NAME +nvramtool - read/write coreboot-related information +.SH SYNOPSIS +.B "nvramtool [OPTS] [-n] -r NAME" +.br +.B "nvramtool [OPTS] -e NAME" +.br +.B "nvramtool [OPTS] -a" +.br +.B "nvramtool [OPTS] -w NAME=VALUE" +.br +.B "nvramtool [OPTS] -p INPUT_FILE" +.br +.B "nvramtool [OPTS] -i" +.br +.B "nvramtool [OPTS] -c [VALUE]" +.br +.B "nvramtool [OPTS] -l [ARG]" +.br +.B "nvramtool [OPTS] -d" +.br +.B "nvramtool [OPTS] -Y" +.br +.B "nvramtool [OPTS] -b OUTPUT_FILE" +.br +.B "nvramtool [OPTS] -B INPUT_FILE" +.br +.B "nvramtool [OPTS] -x" +.br +.B "nvramtool [OPTS] -X DUMPFILE" +.br +.B "nvramtool [OPTS] -v" +.br +.B "nvramtool [OPTS] -h" +.SH DESCRIPTION +.B "nvramtool" +is a utility for reading/writing coreboot parameters and displaying +information from the coreboot table. + +The coreboot table resides in low physical memory. It is created at boot +time by coreboot, and contains various system information such as the type +of mainboard in use. It specifies locations in the CMOS (nonvolatile RAM) +where the coreboot parameters are stored. + +This program is intended for (x86-based) systems that use coreboot. For +information about coreboot, see +.br +http://www.coreboot.org/. +.SH PARAMETERS +.TP +.B "[-n] -r NAME" +Show the value of the coreboot parameter given by +.B "NAME." +If +.B "-n" +is specified, show only the value. Otherwise show both parameter name and +value. +.TP +.B "-e NAME" +Show all possible values for parameter given by +.B "NAME." +.TP +.B "-a" +Show the names and values for all coreboot parameters. +.TP +.B "-w NAME=VALUE" +Assign +.B "VALUE" +to coreboot parameter given by +.B "NAME." +.TP +.B "-p INPUT_FILE" +Assign values to coreboot parameters according to the contents of +.B "INPUT_FILE." +The format of this file is described below. +.TP +.B "-i" +This is similar to the +.B "-p" +option, except that the contents of the input file are taken from standard +input. +.TP +.B "-c [VALUE]" +If +.B "VALUE" +is present then set the CMOS checksum for the coreboot parameters to +.B "VALUE." +Otherwise, show the checksum value. +.TP +.B "-l [ARG]" +If +.B "ARG" +is present then show information from the coreboot table as specified by +.B "ARG." +Otherwise show all possible values for +.B "ARG." +.TP +.B "-d" +Do a low-level dump of the coreboot table. +.TP +.B "-Y" +Write CMOS layout information to standard output. If redirected to a file, +the layout information may be used as input for the +.B "'-y LAYOUT_FILE'" +option (see below). +.TP +.B "-b OUTPUT_FILE" +Write the contents of CMOS memory to the binary file +.B "OUTPUT_FILE." +The first 14 bytes of +.B "OUTPUT_FILE" +do not contain actual CMOS data, and are always written as zeros. This is +because the first 14 bytes of the CMOS area do not contain CMOS memory. These +bytes are involved with the functioning of the real time clock. +.TP +.B "-B INPUT_FILE" +Read binary data from +.B "INPUT_FILE" +and write the data to CMOS memory. The first 14 bytes of +.B "INPUT_FILE" +are skipped and data is written to CMOS starting at the 15th byte of the CMOS +area. This is because the first 14 bytes of the CMOS area do not contain CMOS +memory. These bytes are involved with the functioning of the real time clock. +.TP +.B "-x" +Show a hex dump of all CMOS data. The first 14 bytes of the dump do not +contain actual CMOS data, and are always shown as zeros. This is because the +first 14 bytes of the CMOS area do not contain CMOS memory. These bytes are +involved with the functioning of the real time clock. +.TP +.B "-X DUMPFILE" +Read binary data from +.B "DUMPFILE" +(presumably a CMOS dumpfile created using the +.B "-b OUTPUT_FILE" +option) and show a hex dump of the data. +.TP +.B "-v" +Show version information for this program. +.TP +.B "-h" +Show a help message for this program. +.SH "OPTIONS" +In all cases above, +.B "[OPTS]" +evaluates to the following: + +.B " [-y LAYOUT_FILE | -t]" + +The +.B "'-y LAYOUT_FILE'" +option tells nvramtool to obtain CMOS layout information from the contents of +.B "LAYOUT_FILE." +Likewise, the +.B "'-t'" +option tells nvramtool to obtain CMOS layout information from the CMOS option +table (contained within the coreboot table). If neither option is +specified, the CMOS option table is used by default. +.B "LAYOUT_FILE" +follows the format of the +.B "cmos.layout" +files provided by coreboot. + +If the coreboot installed on your system was built without specifying +.B "HAVE_OPTION_TABLE," +then the coreboot table will not contain a CMOS option table. In this case, +the +.B "'-y LAYOUT_FILE'" +option must be used. + +These two options are silently ignored when used in combination with other +options (such as +.B "-h," +for instance) for which they are not applicable. +.SH FILE FORMAT +For the +.B "-p" +option, +.B "INPUT_FILE" +must consist of a sequence of lines such that each line is either a blank +line, a comment, or an assignment. A blank line consists only of zero or +more whitespace characters (spaces and tabs). A comment is constructed as +follows: + +.B " [ws]#[text]" + +Here, +.B "[ws]" +indicates optional whitespace characters and +.B "[text]" +indicates optional text. Blank lines and comments are both ignored. An +assignment is constructed as follows: + +.B " [ws]NAME[ws]=[ws]VALUE[ws]" + +Here, +.B "NAME" +is the name of a coreboot parameter and +.B "VALUE" +is the value that will be assigned to +.B "NAME." +.B "VALUE" +is allowed to contain whitespace characters, but it must begin and end with +nonwhitespace characters. Note that each comment must appear on a line by +itself. If you attempt to add a comment to the end of an assignment, then the +comment will be interpreted as part of +.B "VALUE." +It is useful to observe that the output produced by both the +.B "-a" +and the +.B "'[-n] NAME'" +options (without +.B "-n" +specified) adheres to this file format. +.SH BUGS +This program does not implement any type of synchronization to ensure that +different processes don't stomp on each other when trying to access the +nonvolatile RAM simultaneously. Therefore, corruption of the BIOS parameter +values may occur if multiple instances of this program are executed +concurrently. +.SH AUTHORS +David S. Peterson dsp@llnl.gov dave_peterson@pobox.com +.br +Stefan Reinauer stepan@openbios.org
Copied: trunk/util/lxbios/nvramtool.c (from rev 3122, trunk/util/lxbios/lxbios.c) =================================================================== --- trunk/util/lxbios/nvramtool.c (rev 0) +++ trunk/util/lxbios/nvramtool.c 2008-03-01 19:07:46 UTC (rev 3123) @@ -0,0 +1,754 @@ +/*****************************************************************************\ + * nvramtool.c + * $Id$ + ***************************************************************************** + * Copyright (C) 2002-2005 The Regents of the University of California. + * Produced at the Lawrence Livermore National Laboratory. + * Written by Dave Peterson dsp@llnl.gov dave_peterson@pobox.com. + * UCRL-CODE-2003-012 + * All rights reserved. + * + * This file is part of nvramtool, a utility for reading/writing coreboot + * parameters and displaying information from the coreboot table. + * For details, see http://coreboot.org/nvramtool. + * + * Please also read the file DISCLAIMER which is included in this software + * distribution. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License (as published by the + * Free Software Foundation) version 2, dated June 1991. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and + * conditions of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +*****************************************************************************/ + +#include "common.h" +#include "opts.h" +#include "lbtable.h" +#include "layout.h" +#include "layout_file.h" +#include "input_file.h" +#include "cmos_ops.h" +#include "cmos_lowlevel.h" +#include "reg_expr.h" +#include "hexdump.h" + +typedef void (*op_fn_t) (void); + +static void op_show_version (void); +static void op_show_usage (void); +static void op_lbtable_show_info (void); +static void op_lbtable_dump (void); +static void op_show_param_values (void); +static void op_cmos_show_one_param (void); +static void op_cmos_show_all_params (void); +static void op_cmos_set_one_param (void); +static void op_cmos_set_params_stdin (void); +static void op_cmos_set_params_file (void); +static void op_cmos_checksum (void); +static void op_show_layout (void); +static void op_write_cmos_dump (void); +static void op_read_cmos_dump (void); +static void op_show_cmos_hex_dump (void); +static void op_show_cmos_dumpfile (void); +static int list_one_param (const char name[], int show_name); +static int list_all_params (void); +static void list_param_enums (const char name[]); +static void set_one_param (const char name[], const char value[]); +static void set_params (FILE *f); +static void parse_assignment (char arg[], const char **name, + const char **value); +static int list_cmos_entry (const cmos_entry_t *e, int show_name); +static uint16_t convert_checksum_value (const char value[]); + +static const op_fn_t op_fns[] = + { op_show_version, + op_show_usage, + op_lbtable_show_info, + op_lbtable_dump, + op_show_param_values, + op_cmos_show_one_param, + op_cmos_show_all_params, + op_cmos_set_one_param, + op_cmos_set_params_stdin, + op_cmos_set_params_file, + op_cmos_checksum, + op_show_layout, + op_write_cmos_dump, + op_read_cmos_dump, + op_show_cmos_hex_dump, + op_show_cmos_dumpfile + }; + +static const hexdump_format_t cmos_dump_format = + { 16, 2, "", " | ", " ", " | ", '.', NULL }; + +/**************************************************************************** + * main + ****************************************************************************/ +int main (int argc, char *argv[]) + { cmos_layout_get_fn_t fn; + + parse_nvramtool_args(argc, argv); + + if (nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].found) + { set_layout_filename( + nvramtool_op_modifiers[NVRAMTOOL_MOD_USE_CMOS_LAYOUT_FILE].param); + fn = get_layout_from_file; + } + else + fn = get_layout_from_cmos_table; + + register_cmos_layout_get_fn(fn); + op_fns[nvramtool_op.op](); + return 0; + } + +/**************************************************************************** + * op_show_version + * + * -v + * + * Show version information for this program. + ****************************************************************************/ +static void op_show_version (void) + { printf("This is %s version %s.\n", prog_name, prog_version); } + +/**************************************************************************** + * op_show_usage + * + * -h + * + * Show a usage message for this program. + ****************************************************************************/ +static void op_show_usage (void) + { usage(stdout); } + +/**************************************************************************** + * op_lbtable_show_info + * + * -l [ARG] + * + * If ARG is present, show coreboot table information specified by ARG. + * Else show all possible values for ARG. + ****************************************************************************/ +static void op_lbtable_show_info (void) + { if (nvramtool_op.param == NULL) + list_lbtable_choices(); + else + { get_lbtable(); + list_lbtable_item(nvramtool_op.param); + } + } + +/**************************************************************************** + * op_lbtable_dump + * + * -d + * + * Do low-level dump of coreboot table. + ****************************************************************************/ +static void op_lbtable_dump (void) + { get_lbtable(); + dump_lbtable(); + } + +/**************************************************************************** + * op_show_param_values + * + * -e NAME option + * + * Show all possible values for parameter NAME. + ****************************************************************************/ +static void op_show_param_values (void) + { get_cmos_layout(); + list_param_enums(nvramtool_op.param); + } + +/**************************************************************************** + * op_cmos_show_one_param + * + * [-n] -r NAME + * + * Show parameter NAME. If -n is specified, show value only. Else show name + * and value. + ****************************************************************************/ +static void op_cmos_show_one_param (void) + { int result; + + get_cmos_layout(); + result = list_one_param(nvramtool_op.param, + !nvramtool_op_modifiers[NVRAMTOOL_MOD_SHOW_VALUE_ONLY].found); + cmos_checksum_verify(); + + if (result) + exit(1); + } + +/**************************************************************************** + * op_cmos_show_all_params + * + * -a + * + * Show names and values for all parameters. + ****************************************************************************/ +static void op_cmos_show_all_params (void) + { int result; + + get_cmos_layout(); + result = list_all_params(); + cmos_checksum_verify(); + + if (result) + exit(1); + } + +/**************************************************************************** + * op_cmos_set_one_param + * + * -w NAME=VALUE + * + * Set parameter NAME to VALUE. + ****************************************************************************/ +static void op_cmos_set_one_param (void) + { const char *name, *value; + + get_cmos_layout(); + + /* Separate 'NAME=VALUE' syntax into two strings representing NAME and + * VALUE. + */ + parse_assignment(nvramtool_op.param, &name, &value); + + set_one_param(name, value); + } + +/**************************************************************************** + * op_cmos_set_params_stdin + * + * -i + * + * Set parameters according to standard input. + ****************************************************************************/ +static void op_cmos_set_params_stdin (void) + { get_cmos_layout(); + set_params(stdin); + } + +/**************************************************************************** + * op_cmos_set_params_file + * + * -p INPUT_FILE + * + * Set parameters according to INPUT_FILE. + ****************************************************************************/ +static void op_cmos_set_params_file (void) + { FILE *f; + + if ((f = fopen(nvramtool_op.param, "r")) == NULL) + { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", + prog_name, nvramtool_op.param, strerror(errno)); + exit(1); + } + + get_cmos_layout(); + set_params(f); + fclose(f); + } + +/**************************************************************************** + * op_cmos_checksum + * + * -c [VALUE] + * + * If VALUE is present, set coreboot CMOS checksum to VALUE. Else show + * checksum value. + ****************************************************************************/ +static void op_cmos_checksum (void) + { uint16_t checksum; + + get_cmos_layout(); + + if (nvramtool_op.param == NULL) + { set_iopl(3); + checksum = cmos_checksum_read(); + set_iopl(0); + printf("0x%x\n", checksum); + } + else + { checksum = convert_checksum_value(nvramtool_op.param); + set_iopl(3); + cmos_checksum_write(checksum); + set_iopl(0); + } + } + +/**************************************************************************** + * op_show_layout + * + * -Y + * + * Write CMOS layout information to standard output. + ****************************************************************************/ +static void op_show_layout (void) + { get_cmos_layout(); + write_cmos_layout(stdout); + } + +/**************************************************************************** + * op_write_cmos_dump + * + * -b OUTPUT_FILE + * + * Write the contents of CMOS memory to a binary file. + ****************************************************************************/ +static void op_write_cmos_dump (void) + { unsigned char data[CMOS_SIZE]; + FILE *f; + + if ((f = fopen(nvramtool_op.param, "w")) == NULL) + { fprintf(stderr, "%s: Can not open file %s for writing: %s\n", + prog_name, nvramtool_op.param, strerror(errno)); + exit(1); + } + + set_iopl(3); + cmos_read_all(data); + set_iopl(0); + + if (fwrite(data, 1, CMOS_SIZE, f) != CMOS_SIZE) + { fprintf(stderr, "%s: Error writing CMOS data to file %s: %s\n", + prog_name, nvramtool_op.param, strerror(errno)); + exit(1); + } + + fclose(f); + } + +/**************************************************************************** + * op_read_cmos_dump + * + * -B INPUT_FILE + * + * Read binary data from a file and write the data to CMOS memory. + ****************************************************************************/ +static void op_read_cmos_dump (void) + { unsigned char data[CMOS_SIZE]; + size_t nr_bytes; + FILE *f; + + if ((f = fopen(nvramtool_op.param, "r")) == NULL) + { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", + prog_name, nvramtool_op.param, strerror(errno)); + exit(1); + } + + if ((nr_bytes = fread(data, 1, CMOS_SIZE, f)) != CMOS_SIZE) + { fprintf(stderr, "%s: Error: Only able to read %d bytes of CMOS data " + "from file %s. CMOS data is unchanged.\n", prog_name, + (int) nr_bytes, nvramtool_op.param); + exit(1); + } + + fclose(f); + set_iopl(3); + cmos_write_all(data); + set_iopl(0); + } + +/**************************************************************************** + * op_show_cmos_hex_dump + * + * -x + * + * Write a hex dump of CMOS memory to standard output. + ****************************************************************************/ +static void op_show_cmos_hex_dump (void) + { unsigned char data[CMOS_SIZE]; + + set_iopl(3); + cmos_read_all(data); + set_iopl(0); + hexdump(data, CMOS_SIZE, 0, stdout, &cmos_dump_format); + } + +/**************************************************************************** + * op_show_cmos_dumpfile + * + * -X DUMP_FILE + * + * Read binary data from a file (presumably a CMOS dump file) and display a + * hex dump of the CMOS data from the file. + ****************************************************************************/ +static void op_show_cmos_dumpfile (void) + { unsigned char data[CMOS_SIZE]; + size_t nr_bytes; + FILE *f; + + if ((f = fopen(nvramtool_op.param, "r")) == NULL) + { fprintf(stderr, "%s: Can not open file %s for reading: %s\n", + prog_name, nvramtool_op.param, strerror(errno)); + exit(1); + } + + nr_bytes = fread(data, 1, CMOS_SIZE, f); + fclose(f); + hexdump(data, nr_bytes, 0, stdout, &cmos_dump_format); + } + +/**************************************************************************** + * list_one_param + * + * Attempt to list one CMOS parameter given by 'name'. 'show_name' is a + * boolean value indicating whether the parameter name should be displayed + * along with its value. Return 1 if error was encountered. Else return OK. + ****************************************************************************/ +static int list_one_param (const char name[], int show_name) + { const cmos_entry_t *e; + + if (is_checksum_name(name) || ((e = find_cmos_entry(name)) == NULL)) + { fprintf(stderr, "%s: CMOS parameter %s not found.\n", prog_name, name); + exit(1); + } + + if (e->config == CMOS_ENTRY_RESERVED) + { fprintf(stderr, "%s: Parameter %s is reserved.\n", prog_name, name); + exit(1); + } + + return (list_cmos_entry(e, show_name) != 0); + } + +/**************************************************************************** + * list_all_params + * + * Attempt to list all CMOS parameters. Return 1 if error was encountered. + * Else return OK. + ****************************************************************************/ +static int list_all_params (void) + { const cmos_entry_t *e; + int result; + + result = OK; + + for (e = first_cmos_entry(); e != NULL; e = next_cmos_entry(e)) + { if ((e->config == CMOS_ENTRY_RESERVED) || is_checksum_name(e->name)) + continue; + + if (list_cmos_entry(e, TRUE)) + result = 1; + } + + return result; + } + +/**************************************************************************** + * list_param_enums + * + * List all possible values for CMOS parameter given by 'name'. + ****************************************************************************/ +static void list_param_enums (const char name[]) + { const cmos_entry_t *e; + const cmos_enum_t *p; + + if (is_checksum_name(name) || (e = find_cmos_entry(name)) == NULL) + { fprintf(stderr, "%s: CMOS parameter %s not found.\n", prog_name, name); + exit(1); + } + + switch (e->config) + { case CMOS_ENTRY_ENUM: + for (p = first_cmos_enum_id(e->config_id); + p != NULL; + p = next_cmos_enum_id(p)) + printf("%s\n", p->text); + + break; + + case CMOS_ENTRY_HEX: + printf("Parameter %s requires a %u-bit unsigned integer.\n", name, + e->length); + break; + + case CMOS_ENTRY_RESERVED: + printf("Parameter %s is reserved.\n", name); + break; + + default: + BUG(); + } + } + +/**************************************************************************** + * set_one_param + * + * Set the CMOS parameter given by 'name' to 'value'. The 'name' parameter + * is case-sensitive. If we are setting an enum parameter, then 'value' is + * interpreted as a case-sensitive string that must match the option name + * exactly. If we are setting a 'hex' parameter, then 'value' is treated as + * a string representation of an unsigned integer that may be specified in + * decimal, hex, or octal. + ****************************************************************************/ +static void set_one_param (const char name[], const char value[]) + { const cmos_entry_t *e; + unsigned long long n; + + if (is_checksum_name(name) || (e = find_cmos_entry(name)) == NULL) + { fprintf(stderr, "%s: CMOS parameter %s not found.", prog_name, name); + exit(1); + } + + switch (prepare_cmos_write(e, value, &n)) + { case OK: + break; + + case CMOS_OP_BAD_ENUM_VALUE: + fprintf(stderr, "%s: Bad value for parameter %s.", prog_name, name); + goto fail; + + case CMOS_OP_NEGATIVE_INT: + fprintf(stderr, + "%s: This program does not support assignment of negative " + "numbers to coreboot parameters.", prog_name); + goto fail; + + case CMOS_OP_INVALID_INT: + fprintf(stderr, "%s: %s is not a valid integer.", prog_name, value); + goto fail; + + case CMOS_OP_RESERVED: + fprintf(stderr, + "%s: Can not modify reserved coreboot parameter %s.", + prog_name, name); + goto fail; + + case CMOS_OP_VALUE_TOO_WIDE: + fprintf(stderr, + "%s: Can not write value %s to CMOS parameter %s that is " + "only %d bits wide.", prog_name, value, name, e->length); + goto fail; + + case CMOS_OP_NO_MATCHING_ENUM: + fprintf(stderr, + "%s: coreboot parameter %s has no matching enums.", + prog_name, name); + goto fail; + + case CMOS_AREA_OUT_OF_RANGE: + fprintf(stderr, + "%s: The CMOS area specified by the layout info for " + "coreboot parameter %s is out of range.", prog_name, name); + goto fail; + + case CMOS_AREA_OVERLAPS_RTC: + fprintf(stderr, + "%s: The CMOS area specified by the layout info for " + "coreboot parameter %s overlaps the realtime clock area.", + prog_name, name); + goto fail; + + case CMOS_AREA_TOO_WIDE: + fprintf(stderr, + "%s: The CMOS area specified by the layout info for " + "coreboot parameter %s is too wide.", + prog_name, name); + goto fail; + + default: + fprintf(stderr, + "%s: Unknown error encountered while attempting to modify " + "coreboot parameter %s.", prog_name, name); + goto fail; + } + + /* write the value to nonvolatile RAM */ + set_iopl(3); + cmos_write(e->bit, e->length, n); + cmos_checksum_write(cmos_checksum_compute()); + set_iopl(0); + return; + +fail: + fprintf(stderr, " CMOS write not performed.\n"); + exit(1); + } + +/**************************************************************************** + * set_params + * + * Set coreboot parameters according to the contents of file 'f'. + ****************************************************************************/ +static void set_params (FILE *f) + { /* First process the input file. Then perform writes only if there were + * no problems processing the input. Either all values will be written + * successfully or no values will be written. + */ + do_cmos_writes(process_input_file(f)); + } + +/**************************************************************************** + * parse_assignment + * + * Parse the string 'arg' (which supposedly represents an assignment) into a + * NAME and a VALUE. If 'arg' does not conform to the proper assignment + * syntax, exit with a usage message. Otherwise, on return, 'arg' is broken + * into substrings representing NAME and VALUE, and *name and *value are set + * to point to these two substrings. + ****************************************************************************/ +static void parse_assignment (char arg[], const char **name, + const char **value) + { static const size_t N_MATCHES = 4; + regmatch_t match[N_MATCHES]; + regex_t assignment; + + compile_reg_exprs(REG_EXTENDED | REG_NEWLINE, 1, assignment_regex, + &assignment); + + /* Does 'arg' conform to proper assignment syntax? If not, exit with a + * usage message. + */ + if (regexec(&assignment, arg, N_MATCHES, match, 0)) + usage(stderr); + + /* Ok, we found a valid assignment. Break it into two strings + * representing NAME and VALUE. + */ + arg[match[1].rm_eo] = '\0'; + arg[match[2].rm_eo] = '\0'; + *name = &arg[match[1].rm_so]; + *value = &arg[match[2].rm_so]; + + free_reg_exprs(1, &assignment); + } + +/**************************************************************************** + * list_cmos_entry + * + * Attempt to list the CMOS entry represented by 'e'. 'show_name' is a + * boolean value indicating whether the parameter name should be displayed + * along with its value. On success, return OK. On error, print an error + * message and return 1. + ****************************************************************************/ +static int list_cmos_entry (const cmos_entry_t *e, int show_name) + { const cmos_enum_t *p; + unsigned long long value; + + /* sanity check CMOS entry */ + switch (prepare_cmos_read(e)) + { case OK: + break; + + case CMOS_OP_RESERVED: + BUG(); + + case CMOS_AREA_OUT_OF_RANGE: + fprintf(stderr, "%s: Can not read coreboot parameter %s because " + "layout info specifies out of range CMOS area.\n", prog_name, + e->name); + return 1; + + case CMOS_AREA_OVERLAPS_RTC: + fprintf(stderr, "%s: Can not read coreboot parameter %s because " + "layout info specifies CMOS area that overlaps realtime " + "clock area.\n", prog_name, e->name); + return 1; + + case CMOS_AREA_TOO_WIDE: + fprintf(stderr, "%s: Can not read coreboot parameter %s because " + "layout info specifies CMOS area that is too wide.\n", + prog_name, e->name); + return 1; + + default: + fprintf(stderr, "%s: Unknown error encountered while attempting to " + "read coreboot parameter %s\n", prog_name, e->name); + return 1; + } + + /* read the value from CMOS */ + set_iopl(3); + value = cmos_read(e->bit, e->length); + set_iopl(0); + + /* display the value */ + switch (e->config) + { case CMOS_ENTRY_ENUM: + if ((p = find_cmos_enum(e->config_id, value)) == NULL) + { if (show_name) + printf("# Bad value -> %s = 0x%llx\n", e->name, value); + else + printf("Bad value -> 0x%llx\n", value); + } + else + { if (show_name) + printf("%s = %s\n", e->name, p->text); + else + printf("%s\n", p->text); + } + + break; + + case CMOS_ENTRY_HEX: + if (show_name) + printf("%s = 0x%llx\n", e->name, value); + else + printf("0x%llx\n", value); + + break; + + case CMOS_ENTRY_RESERVED: + default: + BUG(); + } + + return OK; + } + +/**************************************************************************** + * convert_checksum_value + * + * 'value' is the string representation of a checksum value that the user + * wishes to set using the -c option. Convert the string to a 16-bit + * unsigned integer and return the result. Exit with an error message if + * 'value' is invalid. + ****************************************************************************/ +static uint16_t convert_checksum_value (const char value[]) + { unsigned long n; + const char *p; + uint16_t result; + int negative; + + for (p = value; isspace(*p); p++); + + negative = (*p == '-'); + n = strtoul(value, (char **) &p, 0); + + if (*p) + { fprintf(stderr, "%s: Checksum value %s is not a valid integer.\n", + prog_name, value); + exit(1); + } + + if (negative) + { fprintf(stderr, + "%s: Checksum must be an unsigned integer.\n", prog_name); + exit(1); + } + + result = (uint16_t) n; + + if (result != n) + { fprintf(stderr, + "%s: Checksum value must fit within 16 bits.\n", prog_name); + exit(1); + } + + return result; + }
Copied: trunk/util/lxbios/nvramtool.spec (from rev 3122, trunk/util/lxbios/lxbios.spec) =================================================================== --- trunk/util/lxbios/nvramtool.spec (rev 0) +++ trunk/util/lxbios/nvramtool.spec 2008-03-01 19:07:46 UTC (rev 3123) @@ -0,0 +1,50 @@ +## +# $Id$ +## + +Name: nvramtool +Version: 2.0.1 +Release: 0 + +Summary: coreboot utility program +Group: System Environment/Base +License: GPL +Provides: nvramtool + +BuildRoot: %{_tmppath}/%{name}-%{version} + +Source0: %{name}-%{version}.tgz + +%description +nvramtool is a utility for reading/writing coreboot parameters and displaying +information from the coreboot table. + +At boot time, coreboot places a table (known as the coreboot table) in low +physical memory. The contents of this table are preserved even after +coreboot transfers control to the kernel and the kernel initializes itself. +The coreboot table contains various system information such as the type of +mainboard in use. It also specifies locations in the CMOS (nonvolatile RAM) +where the coreboot parameters are stored. + +%prep +%setup -n %{name}-%{version} + +%build +make + +%install +rm -rf "$RPM_BUILD_ROOT" +mkdir -p "$RPM_BUILD_ROOT/usr/bin" +mkdir -p "$RPM_BUILD_ROOT/usr/man/man1" +cp nvramtool "$RPM_BUILD_ROOT/usr/bin" +cp nvramtool.1.gz $RPM_BUILD_ROOT/usr/man/man1 + +%clean +rm -rf "$RPM_BUILD_ROOT" + +%files +%defattr(-,root,root,0755) +%doc ChangeLog README +%doc README +/usr/bin/nvramtool +/usr/man/man1/nvramtool.1.gz