#ifndef _MACHINE_SMBIOSVAR_
#define _MACHINE_SMBIOSVAR_
#define SMBIOS_START 0xf0000
#define SMBIOS_END 0xfffff
#define SMBIOS_UUID_NPRESENT 0x1
#define SMBIOS_UUID_NSET 0x2
#define SMBIOS_UUID_REP "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
#define SMBIOS_UUID_REPLEN 37
struct smbios_entry {
uint8_t mjr;
uint8_t min;
uint8_t *addr;
uint16_t len;
uint16_t count;
};
struct smbhdr {
uint32_t sig;
uint8_t checksum;
uint8_t len;
uint8_t majrev;
uint8_t minrev;
uint16_t mss;
uint8_t epr;
uint8_t fa[5];
uint8_t sasig[5];
uint8_t sachecksum;
uint16_t size;
uint32_t addr;
uint16_t count;
uint8_t rev;
} __packed;
struct smb3hdr {
uint8_t sig[5];
uint8_t checksum;
uint8_t len;
uint8_t majrev;
uint8_t minrev;
uint8_t docrev;
uint8_t epr;
uint8_t reserved;
uint32_t size;
uint64_t addr;
} __packed;
struct smbtblhdr {
uint8_t type;
uint8_t size;
uint16_t handle;
} __packed;
struct smbtable {
struct smbtblhdr *hdr;
void *tblhdr;
uint32_t cookie;
};
#define SMBIOS_TYPE_BIOS 0
#define SMBIOS_TYPE_SYSTEM 1
#define SMBIOS_TYPE_BASEBOARD 2
#define SMBIOS_TYPE_ENCLOSURE 3
#define SMBIOS_TYPE_PROCESSOR 4
#define SMBIOS_TYPE_MEMCTRL 5
#define SMBIOS_TYPE_MEMMOD 6
#define SMBIOS_TYPE_CACHE 7
#define SMBIOS_TYPE_PORT 8
#define SMBIOS_TYPE_SLOTS 9
#define SMBIOS_TYPE_OBD 10
#define SMBIOS_TYPE_OEM 11
#define SMBIOS_TYPE_SYSCONFOPT 12
#define SMBIOS_TYPE_BIOSLANG 13
#define SMBIOS_TYPE_GROUPASSOC 14
#define SMBIOS_TYPE_SYSEVENTLOG 15
#define SMBIOS_TYPE_PHYMEM 16
#define SMBIOS_TYPE_MEMDEV 17
#define SMBIOS_TYPE_ECCINFO32 18
#define SMBIOS_TYPE_MEMMAPARRAYADDR 19
#define SMBIOS_TYPE_MEMMAPDEVADDR 20
#define SMBIOS_TYPE_INBUILTPOINT 21
#define SMBIOS_TYPE_PORTBATT 22
#define SMBIOS_TYPE_SYSRESET 23
#define SMBIOS_TYPE_HWSECUIRTY 24
#define SMBIOS_TYPE_PWRCTRL 25
#define SMBIOS_TYPE_VOLTPROBE 26
#define SMBIOS_TYPE_COOLING 27
#define SMBIOS_TYPE_TEMPPROBE 28
#define SMBIOS_TYPE_CURRENTPROBE 29
#define SMBIOS_TYPE_OOB_REMOTEACCESS 30
#define SMBIOS_TYPE_BIS 31
#define SMBIOS_TYPE_SBI 32
#define SMBIOS_TYPE_ECCINFO64 33
#define SMBIOS_TYPE_MGMTDEV 34
#define SMBIOS_TYPE_MGTDEVCOMP 35
#define SMBIOS_TYPE_MGTDEVTHRESH 36
#define SMBIOS_TYPE_MEMCHANNEL 37
#define SMBIOS_TYPE_IPMIDEV 38
#define SMBIOS_TYPE_SPS 39
#define SMBIOS_TYPE_INACTIVE 126
#define SMBIOS_TYPE_EOT 127
struct smbios_struct_bios {
uint8_t vendor;
uint8_t version;
uint16_t startaddr;
uint8_t release;
uint8_t romsize;
uint64_t characteristics;
uint32_t charext;
uint8_t major_rel;
uint8_t minor_rel;
uint8_t ecf_mjr_rel;
uint8_t ecf_min_rel;
} __packed;
struct smbios_sys {
uint8_t vendor;
uint8_t product;
uint8_t version;
uint8_t serial;
uint8_t uuid[16];
uint8_t wakeup;
uint8_t sku;
uint8_t family;
} __packed;
struct smbios_board {
uint8_t vendor;
uint8_t product;
uint8_t version;
uint8_t serial;
uint8_t asset;
uint8_t feature;
uint8_t location;
uint16_t handle;
uint8_t type;
uint8_t noc;
} __packed;
struct smbios_enclosure {
uint8_t vendor;
uint8_t type;
uint8_t version;
uint8_t serial;
uint8_t asset_tag;
uint8_t boot_state;
uint8_t psu_state;
uint8_t thermal_state;
uint8_t security_status;
uint16_t oem_defined;
uint8_t height;
uint8_t no_power_cords;
uint8_t no_contained_element;
uint8_t reclen_contained_element;
uint8_t contained_elements;
uint8_t sku;
} __packed;
struct smbios_cpu {
uint8_t cpu_socket_designation;
uint8_t cpu_type;
uint8_t cpu_family;
uint8_t cpu_mfg;
uint32_t cpu_id_eax;
uint32_t cpu_id_edx;
uint8_t cpu_version;
uint8_t cpu_voltage;
uint16_t cpu_clock;
uint16_t cpu_max_speed;
uint16_t cpu_current_speed;
uint8_t cpu_status;
#define SMBIOS_CPUST_POPULATED (1<<6)
#define SMBIOS_CPUST_STATUSMASK (0x07)
uint8_t cpu_upgrade;
uint16_t cpu_l1_handle;
uint16_t cpu_l2_handle;
uint16_t cpu_l3_handle;
uint8_t cpu_serial;
uint8_t cpu_asset_tag;
uint8_t cpu_part_nr;
uint8_t cpu_core_count;
uint8_t cpu_core_enabled;
uint8_t cpu_thread_count;
uint16_t cpu_characteristics;
} __packed;
struct smbios_ipmi {
uint8_t smipmi_if_type;
uint8_t smipmi_if_rev;
uint8_t smipmi_i2c_address;
uint8_t smipmi_nvram_address;
uint64_t smipmi_base_address;
uint8_t smipmi_base_flags;
uint8_t smipmi_irq;
} __packed;
int smbios_find_table(uint8_t, struct smbtable *);
char *smbios_get_string(struct smbtable *, uint8_t, char *, size_t);
#endif