iPXE
Macros | Functions | Variables
smbios_settings.c File Reference
#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <ipxe/settings.h>
#include <ipxe/init.h>
#include <ipxe/uuid.h>
#include <ipxe/smbios.h>

Go to the source code of this file.

Macros

#define SMBIOS_RAW_TAG(_type, _structure, _field)
 Construct SMBIOS raw-data tag. More...
 
#define SMBIOS_STRING_TAG(_type, _structure, _field)
 Construct SMBIOS string tag. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static int smbios_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of SMBIOS setting. More...
 
static int smbios_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of SMBIOS setting. More...
 
static void smbios_init (void)
 Initialise SMBIOS settings. More...
 
struct init_fn smbios_init_fn __init_fn (INIT_NORMAL)
 SMBIOS settings initialiser. More...
 
const struct setting uuid_setting __setting (SETTING_HOST, uuid)
 UUID setting obtained via SMBIOS. More...
 
const struct setting manufacturer_setting __setting (SETTING_HOST_EXTRA, manufacturer)
 Manufacturer name setting. More...
 
const struct setting product_setting __setting (SETTING_HOST_EXTRA, product)
 Product name setting. More...
 
const struct setting serial_setting __setting (SETTING_HOST_EXTRA, serial)
 Serial number setting. More...
 
const struct setting asset_setting __setting (SETTING_HOST_EXTRA, asset)
 Asset tag setting. More...
 
const struct setting board_serial_setting __setting (SETTING_HOST_EXTRA, board-serial)
 Board serial number setting (may differ from chassis serial number) More...
 

Variables

static const struct settings_scope smbios_settings_scope
 SMBIOS settings scope. More...
 
static struct settings_operations smbios_settings_operations
 SMBIOS settings operations. More...
 
static struct settings smbios_settings
 SMBIOS settings. More...
 

Macro Definition Documentation

◆ SMBIOS_RAW_TAG

#define SMBIOS_RAW_TAG (   _type,
  _structure,
  _field 
)
Value:
( ( (_type) << 16 ) | \
( offsetof ( _structure, _field ) << 8 ) | \
( sizeof ( ( ( _structure * ) 0 )->_field ) ) )
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:25

Construct SMBIOS raw-data tag.

Parameters
_typeSMBIOS structure type number
_structureSMBIOS structure data type
_fieldField within SMBIOS structure data type
Return values
tagSMBIOS setting tag

Definition at line 46 of file smbios_settings.c.

◆ SMBIOS_STRING_TAG

#define SMBIOS_STRING_TAG (   _type,
  _structure,
  _field 
)
Value:
( ( (_type) << 16 ) | \
( offsetof ( _structure, _field ) << 8 ) )
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:25

Construct SMBIOS string tag.

Parameters
_typeSMBIOS structure type number
_structureSMBIOS structure data type
_fieldField within SMBIOS structure data type
Return values
tagSMBIOS setting tag

Definition at line 59 of file smbios_settings.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ smbios_applies()

static int smbios_applies ( struct settings *settings  __unused,
const struct setting setting 
)
static

Check applicability of SMBIOS setting.

Parameters
settingsSettings block
settingSetting
Return values
appliesSetting applies within this settings block

Definition at line 70 of file smbios_settings.c.

71  {
72 
73  return ( setting->scope == &smbios_settings_scope );
74 }
A setting.
Definition: settings.h:24
static const struct settings_scope smbios_settings_scope
SMBIOS settings scope.
const struct settings_scope * scope
Setting scope (or NULL)
Definition: settings.h:50

References setting::scope, and smbios_settings_scope.

◆ smbios_fetch()

static int smbios_fetch ( struct settings settings,
struct setting setting,
void *  data,
size_t  len 
)
static

Fetch value of SMBIOS setting.

Parameters
settingsSettings block, or NULL to search all blocks
settingSetting to fetch
dataBuffer to fill with setting data
lenLength of buffer
Return values
lenLength of setting data, or negative error

Definition at line 85 of file smbios_settings.c.

86  {
87  const struct smbios_header *structure;
88  unsigned int tag_instance;
89  unsigned int tag_type;
90  unsigned int tag_offset;
91  unsigned int tag_len;
92  const void *src;
93  size_t src_len;
94  unsigned int string;
95  union uuid uuid;
96 
97  /* Split tag into instance, type, offset and length */
98  tag_instance = ( ( setting->tag >> 24 ) & 0xff );
99  tag_type = ( ( setting->tag >> 16 ) & 0xff );
100  tag_offset = ( ( setting->tag >> 8 ) & 0xff );
101  tag_len = ( setting->tag & 0xff );
102 
103  /* Find SMBIOS structure */
104  structure = smbios_structure ( tag_type, tag_instance );
105  if ( ! structure )
106  return -ENOENT;
107  src = structure;
108  src_len = structure->len;
109  string = 0;
110 
111  /* A <length> of zero indicates that the byte at <offset>
112  * contains a string index. An <offset> of zero indicates
113  * that the <length> contains a literal string index.
114  *
115  * Since the byte at offset zero can never contain a string
116  * index, and a literal string index can never be zero, the
117  * combination of both <length> and <offset> being zero
118  * indicates that the entire structure is to be read.
119  */
120  if ( ( tag_len == 0 ) && ( tag_offset == 0 ) ) {
121  /* Read whole structure */
122  } else if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
123  /* Read string */
124  string = tag_len;
125  if ( ( string == 0 ) && ( tag_offset < src_len ) )
126  string = *( ( uint8_t * ) src + tag_offset );
127  src = smbios_string ( structure, string );
128  if ( ! src )
129  return -ENOENT;
130  assert ( string > 0 );
131  src_len = strlen ( src );
132  } else if ( tag_offset > src_len ) {
133  /* Empty read beyond end of structure */
134  src_len = 0;
135  } else {
136  /* Read partial structure */
137  src += tag_offset;
138  src_len -= tag_offset;
139  if ( src_len > tag_len )
140  src_len = tag_len;
141  }
142 
143  /* Mangle UUIDs if necessary. iPXE treats UUIDs as being in
144  * network byte order (big-endian). SMBIOS specification
145  * version 2.6 states that UUIDs are stored with little-endian
146  * values in the first three fields; earlier versions did not
147  * specify an endianness. dmidecode assumes that the byte
148  * order is little-endian if and only if the SMBIOS version is
149  * 2.6 or higher; we match this behaviour.
150  */
151  if ( ( ( setting->type == &setting_type_uuid ) ||
152  ( setting->type == &setting_type_guid ) ) &&
153  ( src_len == sizeof ( uuid ) ) &&
154  ( smbios_version() >= SMBIOS_VERSION ( 2, 6 ) ) ) {
155  DBGC ( settings, "SMBIOS detected mangled UUID\n" );
156  memcpy ( &uuid, src, sizeof ( uuid ) );
157  uuid_mangle ( &uuid );
158  src = &uuid;
159  }
160 
161  /* Return data */
162  if ( len > src_len )
163  len = src_len;
164  memcpy ( data, src, len );
165 
166  /* Set default type */
167  if ( ! setting->type ) {
168  setting->type = ( string ? &setting_type_string :
169  &setting_type_hex );
170  }
171 
172  return src_len;
173 }
const char * smbios_string(const struct smbios_header *structure, unsigned int index)
Get indexed string within SMBIOS structure.
Definition: smbios.c:252
A universally unique ID.
Definition: uuid.h:16
#define DBGC(...)
Definition: compiler.h:505
const struct smbios_header * smbios_structure(unsigned int type, unsigned int instance)
Find specific structure type within SMBIOS.
Definition: smbios.c:183
#define ENOENT
No such file or directory.
Definition: errno.h:515
uint32_t string
Definition: multiboot.h:14
static void uuid_mangle(union uuid *uuid)
Change UUID endianness.
Definition: uuid.h:44
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:44
void * memcpy(void *dest, const void *src, size_t len) __nonnull
uint8_t len
Length.
Definition: smbios.h:124
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static const void * src
Definition: string.h:48
uint8_t uuid[16]
UUID.
Definition: smbios.h:23
ring len
Length.
Definition: dwmac.h:231
int smbios_version(void)
Get SMBIOS version.
Definition: smbios.c:285
const struct setting_type * type
Setting type.
Definition: settings.h:37
#define SMBIOS_VERSION(major, minor)
Calculate SMBIOS version.
Definition: smbios.h:216
size_t strlen(const char *src)
Get length of string.
Definition: string.c:244
A settings block.
Definition: settings.h:133
unsigned char uint8_t
Definition: stdint.h:10
A setting.
Definition: settings.h:24
An SMBIOS structure header.
Definition: smbios.h:120
uint8_t data[48]
Additional event data.
Definition: ena.h:22

References assert(), data, DBGC, ENOENT, smbios_header::len, len, memcpy(), smbios_string(), smbios_structure(), SMBIOS_VERSION, smbios_version(), src, string, strlen(), setting::tag, setting::type, uuid, and uuid_mangle().

◆ smbios_init()

static void smbios_init ( void  )
static

Initialise SMBIOS settings.

Definition at line 191 of file smbios_settings.c.

191  {
192  struct settings *settings = &smbios_settings;
193  int rc;
194 
195  if ( ( rc = register_settings ( settings, NULL, "smbios" ) ) != 0 ) {
196  DBGC ( settings, "SMBIOS could not register settings: %s\n",
197  strerror ( rc ) );
198  return;
199  }
200 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
static struct settings smbios_settings
SMBIOS settings.
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A settings block.
Definition: settings.h:133
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:476
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References DBGC, NULL, rc, register_settings(), smbios_settings, and strerror().

◆ __init_fn()

struct init_fn smbios_init_fn __init_fn ( INIT_NORMAL  )

SMBIOS settings initialiser.

◆ __setting() [1/6]

const struct setting uuid_setting __setting ( SETTING_HOST  ,
uuid   
)

UUID setting obtained via SMBIOS.

◆ __setting() [2/6]

const struct setting manufacturer_setting __setting ( SETTING_HOST_EXTRA  ,
manufacturer   
)

Manufacturer name setting.

◆ __setting() [3/6]

const struct setting product_setting __setting ( SETTING_HOST_EXTRA  ,
product   
)

Product name setting.

◆ __setting() [4/6]

const struct setting serial_setting __setting ( SETTING_HOST_EXTRA  ,
serial   
)

Serial number setting.

◆ __setting() [5/6]

const struct setting asset_setting __setting ( SETTING_HOST_EXTRA  ,
asset   
)

Asset tag setting.

◆ __setting() [6/6]

const struct setting board_serial_setting __setting ( SETTING_HOST_EXTRA  ,
board-  serial 
)

Board serial number setting (may differ from chassis serial number)

Variable Documentation

◆ smbios_settings_scope

const struct settings_scope smbios_settings_scope
static

SMBIOS settings scope.

Definition at line 36 of file smbios_settings.c.

Referenced by smbios_applies().

◆ smbios_settings_operations

struct settings_operations smbios_settings_operations
static
Initial value:
= {
.applies = smbios_applies,
.fetch = smbios_fetch,
}
static int smbios_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of SMBIOS setting.
static int smbios_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of SMBIOS setting.

SMBIOS settings operations.

Definition at line 176 of file smbios_settings.c.

◆ smbios_settings

struct settings smbios_settings
static
Initial value:
= {
.refcnt = NULL,
.default_scope = &smbios_settings_scope,
}
static struct settings smbios_settings
SMBIOS settings.
struct list_head siblings
Sibling settings blocks.
Definition: settings.h:141
struct list_head children
Child settings blocks.
Definition: settings.h:143
static struct settings_operations smbios_settings_operations
SMBIOS settings operations.
static const struct settings_scope smbios_settings_scope
SMBIOS settings scope.
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition: list.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

SMBIOS settings.

Definition at line 182 of file smbios_settings.c.

Referenced by smbios_init().