mirror of
https://github.com/ipxe/ipxe
synced 2025-12-11 05:51:37 +03:00
[smbios] Allow reading an entire SMBIOS data structure as a setting
The general syntax for SMBIOS settings: smbios/<instance>.<type>.<offset>.<length> is currently extended such that a <length> of zero indicates that the byte at <offset> contains a string index, and an <offset> of zero indicates that the <length> contains a literal string index. Since the byte at offset zero can never contain a string index, and a literal string index can never have a zero value, the combination of both <length> and <offset> being zero is currently invalid and will always return "not found". Extend the syntax such that the combination of both <length> and <offset> being zero may be used to read the entire data structure. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -117,8 +117,16 @@ static int smbios_fetch ( struct settings *settings __unused,
|
|||||||
* <offset> contains a string index. An <offset> of
|
* <offset> contains a string index. An <offset> of
|
||||||
* zero indicates that the <length> contains a literal
|
* zero indicates that the <length> contains a literal
|
||||||
* string index.
|
* string index.
|
||||||
|
*
|
||||||
|
* Since the byte at offset zero can never contain a
|
||||||
|
* string index, and a literal string index can never
|
||||||
|
* be zero, the combination of both <length> and
|
||||||
|
* <offset> being zero indicates that the entire
|
||||||
|
* structure is to be read.
|
||||||
*/
|
*/
|
||||||
if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
|
if ( ( tag_len == 0 ) && ( tag_offset == 0 ) ) {
|
||||||
|
tag_len = sizeof ( buf );
|
||||||
|
} else if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
|
||||||
index = ( ( tag_offset == 0 ) ?
|
index = ( ( tag_offset == 0 ) ?
|
||||||
tag_len : buf[tag_offset] );
|
tag_len : buf[tag_offset] );
|
||||||
if ( ( rc = read_smbios_string ( &structure, index,
|
if ( ( rc = read_smbios_string ( &structure, index,
|
||||||
|
|||||||
Reference in New Issue
Block a user