36 lines
1.2 KiB
Diff
36 lines
1.2 KiB
Diff
|
bios: Fix multiple calls into smbios_load_ex
|
||
|
|
||
|
We're marking the used entry bitmap in smbios_load_external() for each
|
||
|
type we check, regardless of whether we loaded anything. This makes
|
||
|
subsequent calls behave as if we've already loaded the tables from qemu
|
||
|
and can result in missing tables (ex. multiple type4 entries on an SMP
|
||
|
guest). Only mark the bitmap if we actually load something.
|
||
|
|
||
|
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
|
||
|
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
|
||
|
|
||
|
diff --git a/bios/rombios32.c b/bios/rombios32.c
|
||
|
index f861f81..c869798 100644
|
||
|
--- a/bios/rombios32.c
|
||
|
+++ b/bios/rombios32.c
|
||
|
@@ -2554,13 +2554,14 @@ smbios_load_external(int type, char **p, unsigned *nr_structs,
|
||
|
*max_struct_size = *p - (char *)header;
|
||
|
}
|
||
|
|
||
|
- /* Mark that we've reported on this type */
|
||
|
- used_bitmap[(type >> 6) & 0x3] |= (1ULL << (type & 0x3f));
|
||
|
+ if (start != *p) {
|
||
|
+ /* Mark that we've reported on this type */
|
||
|
+ used_bitmap[(type >> 6) & 0x3] |= (1ULL << (type & 0x3f));
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
|
||
|
- return (start != *p);
|
||
|
-#else /* !BX_QEMU */
|
||
|
+#endif /* !BX_QEMU */
|
||
|
return 0;
|
||
|
-#endif
|
||
|
}
|
||
|
|
||
|
void smbios_init(void)
|