iPXE
Defines | 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.

Defines

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

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.
static int smbios_fetch (struct settings *settings __unused, struct setting *setting, void *data, size_t len)
 Fetch value of SMBIOS setting.
static void smbios_init (void)
 Initialise SMBIOS settings.
struct init_fn smbios_init_fn __init_fn (INIT_NORMAL)
 SMBIOS settings initialiser.
struct setting uuid_setting __setting (SETTING_HOST, uuid)
 UUID setting obtained via SMBIOS.
struct setting manufacturer_setting __setting (SETTING_HOST_EXTRA, manufacturer)
 Manufacturer name setting.
struct setting product_setting __setting (SETTING_HOST_EXTRA, product)
 Product name setting.
struct setting serial_setting __setting (SETTING_HOST_EXTRA, serial)
 Serial number setting.
struct setting asset_setting __setting (SETTING_HOST_EXTRA, asset)
 Asset tag setting.
struct setting board_serial_setting __setting (SETTING_HOST_EXTRA, board-serial)
 Board serial number setting (may differ from chassis serial number)

Variables

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

Define Documentation

#define SMBIOS_RAW_TAG (   _type,
  _structure,
  _field 
)
Value:
( ( (_type) << 16 ) |                                   \
          ( offsetof ( _structure, _field ) << 8 ) |            \
          ( sizeof ( ( ( _structure * ) 0 )->_field ) ) )

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.

#define SMBIOS_STRING_TAG (   _type,
  _structure,
  _field 
)
Value:
( ( (_type) << 16 ) |                                   \
          ( offsetof ( _structure, _field ) << 8 ) )

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 ( GPL2_OR_LATER_OR_UBDL  )
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.

References setting::scope, and smbios_settings_scope.

                                                            {

        return ( setting->scope == &smbios_settings_scope );
}
static int smbios_fetch ( struct settings *settings  __unused,
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.

References DBG, find_smbios_structure(), smbios_structure::header, index, smbios_header::len, memcpy(), raw, rc, read_smbios_string(), read_smbios_structure(), SMBIOS_VERSION, smbios_version(), setting::tag, setting::type, uuid, and uuid_mangle().

                                                   {
        struct smbios_structure structure;
        unsigned int tag_instance;
        unsigned int tag_type;
        unsigned int tag_offset;
        unsigned int tag_len;
        int rc;

        /* Split tag into instance, type, offset and length */
        tag_instance = ( ( setting->tag >> 24 ) & 0xff );
        tag_type = ( ( setting->tag >> 16 ) & 0xff );
        tag_offset = ( ( setting->tag >> 8 ) & 0xff );
        tag_len = ( setting->tag & 0xff );

        /* Find SMBIOS structure */
        if ( ( rc = find_smbios_structure ( tag_type, tag_instance,
                                            &structure ) ) != 0 )
                return rc;

        {
                uint8_t buf[structure.header.len];
                const void *raw;
                union uuid uuid;
                unsigned int index;

                /* Read SMBIOS structure */
                if ( ( rc = read_smbios_structure ( &structure, buf,
                                                    sizeof ( buf ) ) ) != 0 )
                        return rc;

                /* A <length> of zero indicates that the byte at
                 * <offset> contains a string index.  An <offset> of
                 * zero indicates that the <length> contains a literal
                 * string index.
                 */
                if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
                        index = ( ( tag_offset == 0 ) ?
                                  tag_len : buf[tag_offset] );
                        if ( ( rc = read_smbios_string ( &structure, index,
                                                         data, len ) ) < 0 ) {
                                return rc;
                        }
                        if ( ! setting->type )
                                setting->type = &setting_type_string;
                        return rc;
                }

                /* Mangle UUIDs if necessary.  iPXE treats UUIDs as
                 * being in network byte order (big-endian).  SMBIOS
                 * specification version 2.6 states that UUIDs are
                 * stored with little-endian values in the first three
                 * fields; earlier versions did not specify an
                 * endianness.  dmidecode assumes that the byte order
                 * is little-endian if and only if the SMBIOS version
                 * is 2.6 or higher; we match this behaviour.
                 */
                raw = &buf[tag_offset];
                if ( ( setting->type == &setting_type_uuid ) &&
                     ( tag_len == sizeof ( uuid ) ) &&
                     ( smbios_version() >= SMBIOS_VERSION ( 2, 6 ) ) ) {
                        DBG ( "SMBIOS detected mangled UUID\n" );
                        memcpy ( &uuid, &buf[tag_offset], sizeof ( uuid ) );
                        uuid_mangle ( &uuid );
                        raw = &uuid;
                }

                /* Return data */
                if ( len > tag_len )
                        len = tag_len;
                memcpy ( data, raw, len );
                if ( ! setting->type )
                        setting->type = &setting_type_hex;
                return tag_len;
        }
}
static void smbios_init ( void  ) [static]

Initialise SMBIOS settings.

Definition at line 178 of file smbios_settings.c.

References DBG, NULL, rc, register_settings(), and strerror().

                                 {
        int rc;

        if ( ( rc = register_settings ( &smbios_settings, NULL,
                                        "smbios" ) ) != 0 ) {
                DBG ( "SMBIOS could not register settings: %s\n",
                      strerror ( rc ) );
                return;
        }
}
struct init_fn smbios_init_fn __init_fn ( INIT_NORMAL  ) [read]

SMBIOS settings initialiser.

struct setting uuid_setting __setting ( SETTING_HOST  ,
uuid   
) [read]

UUID setting obtained via SMBIOS.

struct setting manufacturer_setting __setting ( SETTING_HOST_EXTRA  ,
manufacturer   
) [read]

Manufacturer name setting.

struct setting product_setting __setting ( SETTING_HOST_EXTRA  ,
product   
) [read]

Product name setting.

struct setting serial_setting __setting ( SETTING_HOST_EXTRA  ,
serial   
) [read]

Serial number setting.

struct setting asset_setting __setting ( SETTING_HOST_EXTRA  ,
asset   
) [read]

Asset tag setting.

struct setting board_serial_setting __setting ( SETTING_HOST_EXTRA  ,
board-  serial 
) [read]

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


Variable Documentation

SMBIOS settings scope.

Definition at line 35 of file smbios_settings.c.

Referenced by smbios_applies().

Initial value:
 {
        .applies = smbios_applies,
        .fetch = smbios_fetch,
}

SMBIOS settings operations.

Definition at line 163 of file smbios_settings.c.

struct settings smbios_settings [static]
Initial value:
 {
        .refcnt = NULL,
        .siblings = LIST_HEAD_INIT ( smbios_settings.siblings ),
        .children = LIST_HEAD_INIT ( smbios_settings.children ),
        .op = &smbios_settings_operations,
        .default_scope = &smbios_settings_scope,
}

SMBIOS settings.

Definition at line 169 of file smbios_settings.c.