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)
 
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:24

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 45 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:24

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 58 of file smbios_settings.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ 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 69 of file smbios_settings.c.

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

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 84 of file smbios_settings.c.

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

190  {
191  struct settings *settings = &smbios_settings;
192  int rc;
193 
194  if ( ( rc = register_settings ( settings, NULL, "smbios" ) ) != 0 ) {
195  DBGC ( settings, "SMBIOS could not register settings: %s\n",
196  strerror ( rc ) );
197  return;
198  }
199 }
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:78
A settings block.
Definition: settings.h:132
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:475
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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 35 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 175 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:140
struct list_head children
Child settings blocks.
Definition: settings.h:142
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:30
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

SMBIOS settings.

Definition at line 181 of file smbios_settings.c.

Referenced by smbios_init().