Add a module for retrieving SMBIOS information
PATCH v3 1/1 Add a module for retrieving SMBIOS information
The following are two use cases from Rajat Jain <[email protected]>:
1) We have a board that boots Linux and this board itself can be plugged into one of different chassis types. We need to pass different parameters to the kernel based on the "CHASSIS_TYPE" information that is passed by the bios in the DMI / SMBIOS tables.
2) We may have a USB stick that can go into multiple boards, and the exact kernel to be loaded depends on the machine information (PRODUCT_NAME etc) passed via the DMI.
---
Changes since v2:
* Switched to language like "string set" and "SMBIOS structure" to use terminology consistent with the specification.
To address points suggested by Andrei Borzenkov:
* Dropped ChangeLog text from the commit message.
* Changed to long options in the documentation.
* Renamed --variable to --set.
* Exit with an error when given out-of-range option values instead of resetting the option.
* Functions were added to retrieve data types that should avoid alignment and endianness issues.
* Force string set searches to terminate at end of table.
* Each data type now has a separate size/bounds test.
* Error messages have better explanations.
docs/grub.texi | 65 +++++++ grub-core/Makefile.core.def | 7 + grub-core/commands/smbios.c | 445 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 517 insertions(+) create mode 100644 grub-core/commands/smbios.c
docs/grub.texi +65 -0
@@ -3830,6 +3830,7 @@ you forget a command, you can run the command @command{help} * sha256sum:: Compute or check SHA256 hash * sha512sum:: Compute or check SHA512 hash * sleep:: Wait for a specified number of seconds +* smbios:: Retrieve SMBIOS information * source:: Read a configuration file in same context * test:: Check file types and compare values * true:: Do nothing, successfully
@@ -4944,6 +4945,70 @@ if timeout was interrupted by @key{ESC}. @end deffn +@node smbios +@subsection smbios + +@deffn Command smbios @ + [@option{--type} @var{type}] @ + [@option{--handle} @var{handle}] @ + [@option{--match} @var{match}] @ + [(@option{--get-byte} | @option{--get-word} | @option{--get-dword} | @ + @option{--get-qword} | @option{--get-string}) @ + @var{offset} [@option{--set} @var{variable}]] +Retrieve SMBIOS information. This command is only available on x86 and EFI +systems. + +When run with no options, @command{smbios} will print the SMBIOS structures to +the console as the header values, a hex dump, and a string set. The following +options can filter which structures are printed. + +@itemize @bullet +@item +Specifying @option{--type} will only print structures with a matching +@var{type}. The type can be any value from 0 to 255. +@item +Specifying @option{--handle} will only print structures with a matching +@var{handle}. The handle can be any value from 0 to 65535. +@item +Specifying @option{--match} will only print entry number @var{match} in the +list of filtered structures; e.g. @code{smbios --type 4 --match 2} will print +the second Process Information (Type 4) structure. The list is always ordered +the same as the hardware's SMBIOS table. The match number must be positive. +@end itemize + +The remaining options print the value of a specific field in the first filtered +SMBIOS structure. Only one of these options may be specified. + +@itemize @bullet +@item +When given @option{--get-byte}, print the value of the byte +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-word}, print the value of the word (two bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-dword}, print the value of the dword (four bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-qword}, print the value of the qword (eight bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-string}, print the string with its index found +at @var{offset} bytes into the first filtered SMBIOS structure. +@end itemize + +If any of the options in the above list were given, a variable name can be +specified with @option{--set} to store the value instead of printing it. + +For example, this will store and display the system manufacturer string. + +@example +smbios --type 1 --get-string 4 --set system_manufacturer +echo $system_manufacturer +@end example +@end deffn + + @node source @subsection source
grub-core/Makefile.core.def +7 -0
@@ -1011,6 +1011,13 @@ module = { }; module = { + name = smbios; + common = commands/smbios.c; + enable = efi; + enable = x86; +}; + +module = { name = suspend; ieee1275 = commands/ieee1275/suspend.c; enable = i386_ieee1275;
grub-core/commands/smbios.c new file +445 -0
445 lines not on this page · raw message
Signature · 1 line
2.1.0
Quoted 57 lines · David Michael
The following are two use cases from Rajat Jain<[email protected]>:
1) We have a board that boots Linux and this board itself can be plugged into one of different chassis types. We need to pass different parameters to the kernel based on the "
CHASSIS_TYPE" information that is passed by the bios in the DMI / SMBIOS tables.2) We may have a USB stick that can go into multiple boards, and the exact kernel to be loaded depends on the machine information (
PRODUCT_NAMEetc) passed via the DMI.
---Changes since v2:
* Switched to language like "string set" and "SMBIOS structure" to use terminology consistent with the specification.
To address points suggested by Andrei Borzenkov:
* Dropped ChangeLog text from the commit message.
* Changed to long options in the documentation.
* Renamed --variable to --set.
* Exit with an error when given out-of-range option values instead of resetting the option.
* Functions were added to retrieve data types that should avoid alignment and endianness issues.
* Force string set searches to terminate at end of table.
* Each data type now has a separate size/bounds test.
* Error messages have better explanations.
docs/grub.texi | 65 +++++++ grub-core/Makefile.core.def | 7 + grub-core/commands/smbios.c | 445 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 517 insertions(+)create mode 100644
grub-core/commands/smbios.cdocs/grub.texi +4
-0@@ -3830,6 +3830,7 @@ you forget a command, you can run the command @command{help} * sha256sum:: Compute or check SHA256 hash * sha512sum:: Compute or check SHA512 hash * sleep:: Wait for a specified number of seconds +* smbios:: Retrieve SMBIOS information * source:: Read a configuration file in same context * test:: Check file types and compare values * true:: Do nothing, successfully@@ -4944,6 +4945,70 @@ if timeout was interrupted by @key{ESC}. @end deffn +@node smbios +@subsection smbios +
docs/grub.texi if timeout was interrupted by @key{ESC}. · line 4960
Quoted 10 lines
docs/grub.texi +10
-0+@deffn Command smbios @ + [@option{--type} @var{type}] @ + [@option{--handle} @var{handle}] @ + [@option{--match} @var{match}] @ + [(@option{--get-byte} | @option{--get-word} | @option{--get-dword} | @ + @option{--get-qword} | @option{--get-string}) @ + @var{offset} [@option{--set} @var{variable}]] +Retrieve SMBIOS information. This command is only available on x86 and EFI +systems. +
Could we avoid exposing such details as offset in structures? It's way too technical perhaps something like
smbios [--handle=HANDLE|--instance=N] [--set VAR] [TABLE.VARNAME]
where table and varname will be string identifiers and would be translated using dictionaries. TABLE.VARNAME as whole string can be the key, that format is just to avoid conflicts when similar fields are exported in different tables. You can just put the vars you care about in the dictionary.
Quoted 27 lines
docs/grub.texi +27
-0+/* + * In order for any of this module to function, it needs to find an entry point + * structure. This returns a pointer to a struct that identifies the fields of + * the EPS, or NULL if it cannot be located. + */ +static const struct grub_smbios_eps * +grub_smbios_locate_eps (void) +{ +#ifdef GRUB_MACHINE_EFI + static const grub_efi_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID; + const grub_efi_system_table_t *st = grub_efi_system_table; + const grub_efi_configuration_table_t *t = st->configuration_table; + unsigned int i; + + for (i = 0; i < st->num_table_entries; i++) + if (grub_memcmp (&smbios_guid, &t->vendor_guid, sizeof (smbios_guid)) == 0) + { + grub_dprintf ("smbios", "Found entry point structure at %p\n", + t->vendor_table); + return (const struct grub_smbios_eps *)t->vendor_table; + } + else + t++; +#else + grub_uint8_t *ptr; + + for (ptr = (grub_uint8_t *)0x000F0000;
docs/grub.texi if timeout was interrupted by @key{ESC}. · line 4997
Quoted 10 lines
docs/grub.texi +10
-0+ ptr < (grub_uint8_t *)0x00100000; + ptr += 16) + if (grub_memcmp (ptr, "_SM_", 4) == 0 + && grub_byte_checksum (ptr, ptr[5]) == 0) + { + grub_dprintf ("smbios", "Found entry point structure at %p\n", ptr); + return (const struct grub_smbios_eps *)ptr; + } +#endif +
This is already present in grub-core/efiemu/*/cfgtables.c. It should rather be moved to separate file than duplicated.
Quoted 22 lines
docs/grub.texi +22
-0+/* + * Given a pointer to an SMBIOS structure, return the unsigned little-endian + * value of the requested number of bytes. These functions avoid alignment and + * endianness issues. + */ +static inline grub_uint8_t +grub_smbios_get_byte (const grub_uint8_t *structure, grub_uint8_t offset) +{ + return structure[offset]; +} + +static inline grub_uint16_t +grub_smbios_get_word (const grub_uint8_t *structure, grub_uint8_t offset) +{ + return (grub_uint16_t)(grub_smbios_get_byte (structure, offset) | + ((grub_uint16_t)grub_smbios_get_byte (structure, offset + 1) << 8)); +} + +static inline grub_uint32_t +grub_smbios_get_dword (const grub_uint8_t *structure, grub_uint8_t offset) +{ + return (grub_uint32_t)(grub_smbios_get_word (structure, offset) |
docs/grub.texi if timeout was interrupted by @key{ESC}.
Quoted 10 lines
docs/grub.texi +10
-0+ ((grub_uint32_t)grub_smbios_get_word (structure, offset + 2) << 16)); +} + +static inline grub_uint64_t +grub_smbios_get_qword (const grub_uint8_t *structure, grub_uint8_t offset) +{ + return (grub_uint64_t)(grub_smbios_get_dword (structure, offset) | + ((grub_uint64_t)grub_smbios_get_dword (structure, offset + 4) << 32)); +} +
Why is endianness an issue? AFAIK SMBIOS is LE-only and so are all platforms that use it. GRUB has get_unaligned functions.
Quoted 19 lines
docs/grub.texi +19
-0+static grub_uint16_t +grub_smbios_dump_structure (const struct grub_smbios_eps *ep, + const grub_uint8_t *structure) +{ + const grub_uint8_t *ptr = structure; + const grub_uint8_t *table_end = (const grub_uint8_t *)eps_table_end (ep); + grub_uint8_t length = ptr[1]; + + /* Write the SMBIOS structure's mandatory four header bytes. */ + grub_printf ("Structure: Type=%u Length=%u Handle=%u\n", + ptr[0], length, grub_smbios_get_word (ptr, 2)); + + /* Dump of the formatted area (including the header) in hex. */ + grub_printf (" Hex Dump: "); + while (length-- > 0) + grub_printf ("%02x", *ptr++); + grub_printf ("\n"); + + /* Print each string found in the appended string set. */
docs/grub.texi
Quoted 10 lines
docs/grub.texi +10
-0+ if (*ptr == 0) + ptr++; + while (*ptr != 0 && ptr < table_end) + ptr += grub_printf (" String: %s\n", ptr) - sizeof (" String: ") + 1; + ptr++; + + /* Return the total number of bytes covered. */ + return ptr - structure; +} +
It's better to just dump the values GRUB knows about. Hex dump is probably to be avoided.
Quoted 22 lines
docs/grub.texi +22
-0+/* Reference: DMTF Standard DSP0134 2.7.1 Sections 6.1.2-6.1.3 */ + +/* + * Return or print a matched SMBIOS structure. Multiple entries can be matched + * if they are being printed. + * + * This method can use up to three criteria for selecting a structure: + * - The "type" field (use -1 to ignore) + * - The "handle" field (use -1 to ignore) + * - Which to return if several match (use 0 to print all matches) + * + * The parameter "print" was added for verbose debugging. When non-zero, the + * matched entries are printed to the console instead of returned. + */ +static const grub_uint8_t * +grub_smbios_match_structure (const struct grub_smbios_eps *ep, + const grub_int16_t type, + const grub_int32_t handle, + const grub_uint16_t match, + const grub_uint8_t print) +{ + const grub_uint8_t *ptr = (const grub_uint8_t *)eps_table_begin (ep);
docs/grub.texi
Quoted 10 lines
docs/grub.texi +10
-0+ const grub_uint8_t *table_end = (const grub_uint8_t *)eps_table_end (ep); + grub_uint16_t structures = ep->intermediate.structures; + grub_uint16_t structure = 0; + grub_uint16_t matches = 0; + + while (structure++ < structures && ptr < table_end) + { + grub_uint16_t structure_handle = grub_smbios_get_word (ptr, 2); + grub_uint8_t structure_type = ptr[0]; +
This needs to check that ptr[1] is not zero to avoid infinite loop.
docs/grub.texi
Quoted 6 lines
docs/grub.texi +6
-0+ /* Select a single structure from the given filtering options. */ + structure = grub_smbios_match_structure (eps, type, handle, match, 0); + if (structure == NULL) + return grub_error (GRUB_ERR_FILE_NOT_FOUND, + N_("no SMBIOS structure matched the given options")); +
It's not a file. Generic GRUB_ERR_IO is a better match.
В Fri, 27 Mar 2015 13:59:06 +0100
Vladimir 'φ-coder/phcoder' Serbinenko <[email protected]> пишет:
Quoted 8 lines
Could we avoid exposing such details as offset in structures? It's way too technical perhaps something like
smbios [--handle=HANDLE|--instance=N] [--set VAR] [TABLE.VARNAME] where table and varname will be string identifiers and would be translated using dictionaries. TABLE.VARNAME as whole string can be the key, that format is just to avoid conflicts when similar fields are exported in different tables. You can just put the vars you care about in the dictionary.
Do you mean something like "BIOS Information.BIOS Characteristics Extension Bytes"? Because otherwise where these names should come from and how users will know them? SMBIOS at the end is defined in terms of structure offsets. I suppose that any user of this command will know them.
Either we will limit ourselves to known names documented in grub manual, but even then documentation will have to say "foo.bar refers to table bar at offset XX". Not sure how is it better.
В Sun, 22 Mar 2015 22:01:49 -0400
David Michael <[email protected]> пишет:
grub-core/commands/smbios.c line 49
Quoted 3 lines
grub-core/commands/smbios.c new file +3
-0+struct __attribute__ ((packed))grub_smbios_eps + { +grub_uint8_t anchor[4 ];/* "_SM_" */
any plans to implement SMBIOS 3.0 (64 bit address) support?
Quoted 5 lines
grub-core/commands/smbios.c new file +5
-0+grub_uint8_t checksum; +grub_uint8_t length; +grub_uint8_t version_major; +grub_uint8_t version_minor; +grub_uint16_t maximum_structure_size;
grub-core/commands/smbios.c line 64
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+grub_uint8_t revision; +grub_uint8_t formatted[5 ]; +struct grub_smbios_ieps intermediate; + }; + +#define eps_table_begin (eps) ((grub_addr_t)((eps)->intermediate.table_address)) +#define eps_table_end (eps) \ + ((grub_addr_t)((eps)->intermediate.table_address + \ + (eps)->intermediate.table_length)) +
To make adding 64 bit SMBIOS easier, may be extract entry point and size (and other relevant fields) instead of referring to them directly. Then we'd just need to add additional search for 3.0 entry point and all other code won't need to be changed - tables themselves remain the same as far as I can tell.
...
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+ +static grub_err_t +grub_cmd_smbios (grub_extcmd_context_t ctxt, +int argc __attribute__ ((unused)), +char **argv __attribute__ ((unused))) +{ +struct grub_arg_list *state = ctxt->state; + +grub_int16_t type =-1 ; +grub_int32_t handle =-1 ;
grub-core/commands/smbios.c line 280
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+grub_uint16_t match =0 ; +grub_uint8_t offset =0 ; + +grub_int32_t option; +const grub_uint8_t *structure; +grub_uint8_t accessors; +grub_uint8_t i; +char buffer[24 ];/* 64-bit number -> maximum 20 decimal digits */ +const char *value = buffer; +
Could we avoid this aliasing? It is extremely confusing to see buffer used everywhere and then suddenly value in the last line. What is the reason?
grub-core/commands/smbios.c line 398
Quoted 6 lines
grub-core/commands/smbios.c new file +6
-0+ +/* Store or print the requested value. */ +if (state[8 ].set) + { +grub_env_set (state[8 ].arg, value); +grub_env_export (state[8 ].arg);
Why export variable here? It is up to user what to do with it later.
Quoted 12 lines
grub-core/commands/smbios.c new file +12
-0+static const struct grub_arg_option options[] = + { + {"type" ,'t' ,0 ,N_ ("Match entries with the given type." ), +N_ ("type" ),ARG_TYPE_INT }, + {"handle" ,'h' ,0 ,N_ ("Match entries with the given handle." ), +N_ ("handle" ),ARG_TYPE_INT }, + {"match" ,'m' ,0 ,N_ ("Select a structure when several match." ), +N_ ("match" ),ARG_TYPE_INT }, + {"get-byte" ,'b' ,0 ,N_ ("Get the byte's value at the given offset." ), +N_ ("offset" ),ARG_TYPE_INT }, + {"get-word" ,'w' ,0 ,N_ ("Get two bytes' value at the given offset." ), +N_ ("offset" ),ARG_TYPE_INT },
grub-core/commands/smbios.c line 429
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+ {"get-dword" ,'d' ,0 ,N_ ("Get four bytes' value at the given offset." ), + N_("offset"), ARG_TYPE_INT}, + {"get-qword", 'q', 0, N_("Get eight bytes' value at the given offset."), + N_("offset"), ARG_TYPE_INT}, + {"get-string", 's', 0, N_("Get the string specified at the given offset."), + N_("offset"), ARG_TYPE_INT}, + {"set", '\0', 0, N_("Store the value in the given variable name."), + N_("variable"), ARG_TYPE_STRING}, + {0, 0, 0, 0, 0, 0} + };
One non-trivial structure field that is rather awkward to get otherwise is UUID.
[+Arthur]
Hello Folks,
I'm trying to get a binary / raw copy of this patch but could not find one. David, is it possible to please send us a binary / raw copy of this patch?
Thanks,
Rajat
Quoted 94 lines
-----Original Message-----
From: Andrei Borzenkov [mailto:[email protected]]
Sent: Friday, March 27, 2015 8:24 AM
To: David Michael
Cc: [email protected]; Rajat Jain; Prarit Bhargava; Leif Lindholm; Sanjay Jain; Raghuraman Thirumalairajan; Stu Grossman
Subject: Re: [PATCH v3] Add a module for retrieving SMBIOS informationВ Sun, 22 Mar 2015 22:01:49 -0400
David Michael <[email protected]> пишет:grub-core/commands/smbios.c line 49
Quoted 3 lines
grub-core/commands/smbios.c new file +3
-0+struct __attribute__ ((packed))grub_smbios_eps + { +grub_uint8_t anchor[4 ];/* "_SM_" */ any plans to implement SMBIOS 3.0 (64 bit address) support?
Quoted 5 lines
grub-core/commands/smbios.c new file +5
-0+grub_uint8_t checksum; +grub_uint8_t length; +grub_uint8_t version_major; +grub_uint8_t version_minor; +grub_uint16_t maximum_structure_size;grub-core/commands/smbios.c line 64
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+grub_uint8_t revision; +grub_uint8_t formatted[5 ]; +struct grub_smbios_ieps intermediate; }; + +#define eps_table_begin (eps) +((grub_addr_t)((eps)->intermediate.table_address)) +#define eps_table_end (eps) \ + ((grub_addr_t)((eps)->intermediate.table_address + \ + (eps)->intermediate.table_length)) +To make adding 64 bit SMBIOS easier, may be extract entry point and size (and other relevant fields) instead of referring to them directly. Then we'd just need to add additional search for 3.0 entry point and all other code won't need to be changed - tables themselves remain the same as far as I can tell.
...Quoted 9 lines
grub-core/commands/smbios.c new file +9
-0+ +static grub_err_t +grub_cmd_smbios (grub_extcmd_context_t ctxt, +int argc __attribute__ ((unused)), +char **argv __attribute__ ((unused))) { +struct grub_arg_list *state = ctxt->state; + +grub_int16_t type =-1 ; +grub_int32_t handle =-1 ;grub-core/commands/smbios.c line 280
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+grub_uint16_t match =0 ; +grub_uint8_t offset =0 ; + +grub_int32_t option; +const grub_uint8_t *structure; +grub_uint8_t accessors; +grub_uint8_t i; +char buffer[24 ];/* 64-bit number -> maximum 20 decimal digits */ +const char *value = buffer; +Could we avoid this aliasing? It is extremely confusing to see buffer used everywhere and then suddenly value in the last line. What is the reason?
grub-core/commands/smbios.c line 398
Quoted 5 lines
grub-core/commands/smbios.c new file +5
-0+ +/* Store or print the requested value. */ if (state[8 ].set) + { +grub_env_set (state[8 ].arg, value); +grub_env_export (state[8 ].arg);Why export variable here? It is up to user what to do with it later.
Quoted 12 lines
grub-core/commands/smbios.c new file +12
-0+static const struct grub_arg_option options[] = + { + {"type" ,'t' ,0 ,N_ ("Match entries with the given type." ), +N_ ("type" ),ARG_TYPE_INT }, + {"handle" ,'h' ,0 ,N_ ("Match entries with the given handle." ), +N_ ("handle" ),ARG_TYPE_INT }, + {"match" ,'m' ,0 ,N_ ("Select a structure when several match." ), +N_ ("match" ),ARG_TYPE_INT }, + {"get-byte" ,'b' ,0 ,N_ ("Get the byte's value at the given offset." ), +N_ ("offset" ),ARG_TYPE_INT }, + {"get-word" ,'w' ,0 ,N_ ("Get two bytes' value at the given offset." ), +N_ ("offset" ),ARG_TYPE_INT },grub-core/commands/smbios.c line 429
Quoted 10 lines
grub-core/commands/smbios.c new file +10
-0+ {"get-dword" ,'d' ,0 ,N_ ("Get four bytes' value at the given offset." ), + N_("offset"), ARG_TYPE_INT}, + {"get-qword", 'q', 0, N_("Get eight bytes' value at the given offset."), + N_("offset"), ARG_TYPE_INT}, + {"get-string", 's', 0, N_("Get the string specified at the given offset."), + N_("offset"), ARG_TYPE_INT}, + {"set", '\0', 0, N_("Store the value in the given variable name."), + N_("variable"), ARG_TYPE_STRING}, + {0, 0, 0, 0, 0, 0} + };One non-trivial structure field that is rather awkward to get otherwise is UUID.
Quoted 5 lines · Rajat Jain
[+Arthur]
Hello Folks,
I'm trying to get a binary / raw copy of this patch but could not find one. David, is it possible to please send us a binary / raw copy of this patch?
I've attached a bare patch file.
For any future revisions: if your e-mail client lets you save e-mails as plain text, you should be able to apply these inline Git patches with something like "patch -p1 < email.txt" (or see "git am").
David
Add a module for retrieving SMBIOS information.
grub.texi +65 -0
@@ -3830,6 +3830,7 @@ * sha256sum:: Compute or check SHA256 hash * sha512sum:: Compute or check SHA512 hash * sleep:: Wait for a specified number of seconds +* smbios:: Retrieve SMBIOS information * source:: Read a configuration file in same context * test:: Check file types and compare values * true:: Do nothing, successfully
@@ -4944,6 +4945,70 @@ @end deffn +@node smbios +@subsection smbios + +@deffn Command smbios @ + [@option{--type} @var{type}] @ + [@option{--handle} @var{handle}] @ + [@option{--match} @var{match}] @ + [(@option{--get-byte} | @option{--get-word} | @option{--get-dword} | @ + @option{--get-qword} | @option{--get-string}) @ + @var{offset} [@option{--set} @var{variable}]] +Retrieve SMBIOS information. This command is only available on x86 and EFI +systems. + +When run with no options, @command{smbios} will print the SMBIOS structures to +the console as the header values, a hex dump, and a string set. The following +options can filter which structures are printed. + +@itemize @bullet +@item +Specifying @option{--type} will only print structures with a matching +@var{type}. The type can be any value from 0 to 255. +@item +Specifying @option{--handle} will only print structures with a matching +@var{handle}. The handle can be any value from 0 to 65535. +@item +Specifying @option{--match} will only print entry number @var{match} in the +list of filtered structures; e.g. @code{smbios --type 4 --match 2} will print +the second Process Information (Type 4) structure. The list is always ordered +the same as the hardware's SMBIOS table. The match number must be positive. +@end itemize + +The remaining options print the value of a specific field in the first filtered +SMBIOS structure. Only one of these options may be specified. + +@itemize @bullet +@item +When given @option{--get-byte}, print the value of the byte +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-word}, print the value of the word (two bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-dword}, print the value of the dword (four bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-qword}, print the value of the qword (eight bytes) +at @var{offset} bytes into the first filtered SMBIOS structure. +@item +When given @option{--get-string}, print the string with its index found +at @var{offset} bytes into the first filtered SMBIOS structure. +@end itemize + +If any of the options in the above list were given, a variable name can be +specified with @option{--set} to store the value instead of printing it. + +For example, this will store and display the system manufacturer string. + +@example +smbios --type 1 --get-string 4 --set system_manufacturer +echo $system_manufacturer +@end example +@end deffn + + @node source @subsection source
Makefile.core.def +7 -0
@@ -1023,6 +1023,13 @@ }; module = { + name = smbios; + common = commands/smbios.c; + enable = efi; + enable = x86; +}; + +module = { name = suspend; ieee1275 = commands/ieee1275/suspend.c; enable = i386_ieee1275;
commands/smbios.c new file +445 -0
445 lines not on this page · raw message
Thanks!
Quoted 23 lines
-----Original Message-----
From: David Michael [mailto:[email protected]]
Sent: Sunday, March 29, 2015 8:19 PM
To: Rajat Jain
Cc: [email protected]; Sanjay Jain; Raghuraman Thirumalairajan; Stu Grossman; Arthur Mesh
Subject: Re: [PATCH v3] Add a module for retrieving SMBIOS informationQuoted 5 lines · Rajat Jain
[+Arthur]
Hello Folks,
I'm trying to get a binary / raw copy of this patch but could not find one.
David, is it possible to please send us a binary / raw copy of this patch?
I've attached a bare patch file.
For any future revisions: if your e-mail client lets you save e-mails as plain text, you should be able to apply these inline Git patches with something like "patch -p1 < email.txt" (or see "git am").
David