ipmi,smbios: move smbios_walk_table to smbios.h

This function will be used for exposing DMI info as sysctls in the
smbios module (in an upcoming review).

While here, add __packed to the structs.

Reviewed by:	dab
MFC after:	1 week
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D29270
This commit is contained in:
Greg V 2021-04-07 15:05:49 -05:00 committed by Eric van Gyzen
parent a29bff7a52
commit f689cb23b2
2 changed files with 29 additions and 31 deletions

View File

@ -79,8 +79,6 @@ struct ipmi_entry {
#define SPACING_32 0x1
#define SPACING_16 0x2
typedef void (*smbios_callback_t)(struct smbios_structure_header *, void *);
static struct ipmi_get_info ipmi_info;
static int ipmi_probed;
static struct mtx ipmi_info_mtx;
@ -88,8 +86,6 @@ MTX_SYSINIT(ipmi_info, &ipmi_info_mtx, "ipmi info", MTX_DEF);
static void ipmi_smbios_probe(struct ipmi_get_info *);
static int smbios_cksum(struct smbios_eps *);
static void smbios_walk_table(uint8_t *, int, smbios_callback_t,
void *);
static void smbios_ipmi_info(struct smbios_structure_header *, void *);
static void
@ -146,31 +142,6 @@ smbios_ipmi_info(struct smbios_structure_header *h, void *arg)
info->iface_type = s->interface_type;
}
static void
smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
{
struct smbios_structure_header *s;
while (entries--) {
s = (struct smbios_structure_header *)p;
cb(s, arg);
/*
* Look for a double-nul after the end of the
* formatted area of this structure.
*/
p += s->length;
while (!(p[0] == 0 && p[1] == 0))
p++;
/*
* Skip over the double-nul to the start of the next
* structure.
*/
p += 2;
}
}
/*
* Walk the SMBIOS table looking for an IPMI (type 38) entry. If we find
* one, return the parsed data in the passed in ipmi_get_info structure and

View File

@ -56,12 +56,39 @@ struct smbios_eps {
uint32_t structure_table_address;
uint16_t number_structures;
uint8_t BCD_revision;
};
} __packed;
struct smbios_structure_header {
uint8_t type;
uint8_t length;
uint16_t handle;
};
} __packed;
typedef void (*smbios_callback_t)(struct smbios_structure_header *, void *);
static inline void
smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
{
struct smbios_structure_header *s;
while (entries--) {
s = (struct smbios_structure_header *)p;
cb(s, arg);
/*
* Look for a double-nul after the end of the
* formatted area of this structure.
*/
p += s->length;
while (!(p[0] == 0 && p[1] == 0))
p++;
/*
* Skip over the double-nul to the start of the next
* structure.
*/
p += 2;
}
}
#endif /* _SMBIOS_H_ */