#ifndef _DEV_SMBIOSVAR_H
#define _DEV_SMBIOSVAR_H
#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 {
paddr_t hdrphys;
paddr_t tabphys;
uint8_t rev;
uint8_t mjr;
uint8_t min;
uint8_t doc;
uint8_t *addr;
uint32_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 eprev;
#define SMBIOS3_EPREV_RESERVED 0
#define SMBIOS3_EPREV_3_0 1
uint8_t reverved;
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_chassis {
uint8_t vendor;
uint8_t shape;
uint8_t version;
uint8_t serial;
uint8_t asset;
uint8_t bustate;
uint8_t psstate;
uint8_t thstate;
uint8_t security;
uint32_t oemdata;
uint8_t height;
uint8_t powercords;
uint8_t noc;
} __packed;
struct smbios_processor {
uint8_t socket;
uint8_t type;
uint8_t family;
uint8_t vendor;
uint64_t cpuid;
uint8_t version;
uint8_t voltage;
uint16_t clkspeed;
uint16_t maxspeed;
uint16_t curspeed;
uint8_t status;
uint8_t upgrade;
uint8_t l1cache;
uint8_t l2cache;
uint8_t l3cache;
uint8_t serial;
uint8_t asset;
uint8_t part;
uint8_t cores;
uint8_t enabled;
uint8_t threads;
uint16_t characteristics;
uint16_t family2;
uint16_t cores2;
uint16_t enabled2;
uint16_t threads2;
} __packed;
struct smbios_slot {
uint8_t designation;
uint8_t type;
uint8_t width;
uint8_t usage;
uint8_t length;
uint8_t slotid[2];
uint8_t characteristics[2];
} __packed;
#define SMBIOS_SLOT_ISA 0x03
#define SMBIOS_SLOT_EISA 0x05
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;
extern struct smbios_entry smbios_entry;
int smbios2_check_header(const uint8_t *);
int smbios3_check_header(const uint8_t *);
int smbios_find_table(uint8_t, struct smbtable *);
char *smbios_get_string(struct smbtable *, uint8_t, char *, size_t);
#endif