Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F115861232
D28743.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D28743.diff
View Options
Index: sys/dev/ipmi/ipmi_isa.c
===================================================================
--- sys/dev/ipmi/ipmi_isa.c
+++ sys/dev/ipmi/ipmi_isa.c
@@ -286,3 +286,4 @@
};
DRIVER_MODULE(ipmi_isa, isa, ipmi_isa_driver, ipmi_devclass, 0, 0);
+MODULE_DEPEND(ipmi_isa, smbios, 1, 1, 1);
Index: sys/dev/ipmi/ipmi_pci.c
===================================================================
--- sys/dev/ipmi/ipmi_pci.c
+++ sys/dev/ipmi/ipmi_pci.c
@@ -179,6 +179,7 @@
};
DRIVER_MODULE(ipmi_pci, pci, ipmi_pci_driver, ipmi_devclass, 0, 0);
+MODULE_DEPEND(ipmi_pci, smbios, 1, 1, 1);
/* Native IPMI on PCI driver. */
Index: sys/dev/ipmi/ipmi_smbios.c
===================================================================
--- sys/dev/ipmi/ipmi_smbios.c
+++ sys/dev/ipmi/ipmi_smbios.c
@@ -87,8 +87,7 @@
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,
+static void smbios_walk_table(uint8_t *, vm_size_t, smbios_callback_t,
void *);
static void smbios_ipmi_info(struct smbios_structure_header *, void *);
@@ -147,11 +146,12 @@
}
static void
-smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
+smbios_walk_table(uint8_t *table, vm_size_t size, smbios_callback_t cb, void *arg)
{
struct smbios_structure_header *s;
+ uint8_t *p;
- while (entries--) {
+ for (p = table; p < table + size;) {
s = (struct smbios_structure_header *)p;
cb(s, arg);
@@ -160,8 +160,11 @@
* formatted area of this structure.
*/
p += s->length;
- while (!(p[0] == 0 && p[1] == 0))
+ while (!(p[0] == 0 && p[1] == 0)) {
p++;
+ if (p >= table + size)
+ return;
+ }
/*
* Skip over the double-nul to the start of the next
@@ -179,41 +182,23 @@
static void
ipmi_smbios_probe(struct ipmi_get_info *info)
{
- struct smbios_eps *header;
void *table;
- u_int32_t addr;
+ vm_paddr_t table_paddr;
+ vm_size_t table_size;
+ int err;
bzero(info, sizeof(struct ipmi_get_info));
- /* Find the SMBIOS table header. */
- addr = bios_sigsearch(SMBIOS_START, SMBIOS_SIG, SMBIOS_LEN,
- SMBIOS_STEP, SMBIOS_OFF);
- if (addr == 0)
+ err = smbios_get_structure_table(&table_paddr, &table_size);
+ if (err != 0)
return;
- /*
- * Map the header. We first map a fixed size to get the actual
- * length and then map it a second time with the actual length so
- * we can verify the checksum.
- */
- header = pmap_mapbios(addr, sizeof(struct smbios_eps));
- table = pmap_mapbios(addr, header->length);
- pmap_unmapbios((vm_offset_t)header, sizeof(struct smbios_eps));
- header = table;
- if (smbios_cksum(header) != 0) {
- pmap_unmapbios((vm_offset_t)header, header->length);
- return;
- }
+ table = pmap_mapbios(table_paddr, table_size);
- /* Now map the actual table and walk it looking for an IPMI entry. */
- table = pmap_mapbios(header->structure_table_address,
- header->structure_table_length);
- smbios_walk_table(table, header->number_structures, smbios_ipmi_info,
- info);
+ smbios_walk_table(table, table_size, smbios_ipmi_info, info);
/* Unmap everything. */
- pmap_unmapbios((vm_offset_t)table, header->structure_table_length);
- pmap_unmapbios((vm_offset_t)header, header->length);
+ pmap_unmapbios((vm_offset_t)table, table_size);
}
/*
@@ -251,19 +236,3 @@
return (info->iface_type != 0);
}
-
-static int
-smbios_cksum(struct smbios_eps *e)
-{
- u_int8_t *ptr;
- u_int8_t cksum;
- int i;
-
- ptr = (u_int8_t *)e;
- cksum = 0;
- for (i = 0; i < e->length; i++) {
- cksum += ptr[i];
- }
-
- return (cksum);
-}
Index: sys/dev/ipmi/ipmi_smbus.c
===================================================================
--- sys/dev/ipmi/ipmi_smbus.c
+++ sys/dev/ipmi/ipmi_smbus.c
@@ -131,3 +131,4 @@
DRIVER_MODULE(ipmi_smbus, smbus, ipmi_smbus_driver, ipmi_devclass, 0, 0);
MODULE_DEPEND(ipmi_smbus, smbus, SMBUS_MINVER, SMBUS_PREFVER, SMBUS_MAXVER);
+MODULE_DEPEND(ipmi_smbus, smbios, 1, 1, 1);
Index: sys/dev/smbios/smbios.h
===================================================================
--- sys/dev/smbios/smbios.h
+++ sys/dev/smbios/smbios.h
@@ -32,6 +32,8 @@
#ifndef _SMBIOS_H_
#define _SMBIOS_H_
+int smbios_get_structure_table(vm_paddr_t *table, vm_size_t *size);
+
/*
* System Management BIOS
*/
Index: sys/dev/smbios/smbios.c
===================================================================
--- sys/dev/smbios/smbios.c
+++ sys/dev/smbios/smbios.c
@@ -51,6 +51,8 @@
#endif
#include <dev/smbios/smbios.h>
+static struct smbios_softc *smbios;
+
/*
* System Management BIOS Reference Specification, v2.4 Final
* http://www.dmtf.org/standards/published_documents/DSP0134.pdf
@@ -219,6 +221,7 @@
}
printf("\n");
+ smbios = sc;
return (0);
bad:
if (sc->res)
@@ -231,6 +234,7 @@
{
struct smbios_softc *sc;
+ smbios = NULL;
sc = device_get_softc(dev);
if (sc->res)
@@ -239,6 +243,23 @@
return (0);
}
+int
+smbios_get_structure_table(vm_paddr_t *table, vm_size_t *size)
+{
+
+ if (smbios == NULL)
+ return (ENXIO);
+ if (smbios->eps_64bit) {
+ *table = smbios->eps3->structure_table_address;
+ *size = smbios->eps3->structure_table_max_size;
+ } else {
+ *table = smbios->eps->structure_table_address;
+ *size = smbios->eps->structure_table_length;
+ }
+ return (0);
+}
+
+
static int
smbios_modevent (mod, what, arg)
module_t mod;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Apr 30, 4:53 PM (16 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17861361
Default Alt Text
D28743.diff (5 KB)
Attached To
Mode
D28743: ipmi_smbios: Deduplicate smbios entry point discovery logic
Attached
Detach File
Event Timeline
Log In to Comment