Hi Petr, Please Cc dmidecode patches to the dmidecode-devel list.
On Thu, 06 Oct 2016 11:15:44 +0200, Petr Oros wrote: > From 61c2e2b0c3b3c1e103b6648c9450f4c2e8efec52 Mon Sep 17 00:00:00 2001 > From: Petr Oros <[email protected]> > Date: Thu, 6 Oct 2016 10:48:07 +0200 > Subject: [PATCH] Prefer SMBIOS3 when read entry point from efi systab > > According to the DMTF SMBIOS reference spec v3.0.0, it is > allowed to define both the 64-bit entry point (smbios3) and > the 32-bit entry point (smbios), in which case they should > either both point to the same SMBIOS structure table, or the > table pointed to by the 64-bit entry point should contain a > superset of the table contents pointed to by the 32-bit entry > point (section 5.2) > > In this case /sys/firmware/efi/systab can contain: > > ACPI20=0x7cefe014 > ACPI=0x7cefe000 > SMBIOS=0x00dead00 > SMBIOS3=0xffdeadff This is a very interesting address :-D > But for this case, processing end when found > first record and dmidecode fall back to older > table and ignore newer version. With this patch, > processing continue and SMBIOS accept only > if have not SMBIOS3 version. This was fixed over a year ago in the kernel: Author: Jean Delvare <[email protected]> Date: Thu Apr 30 15:23:05 2015 +0200 efi: dmi: List SMBIOS3 table before SMBIOS table I suggest you simply backport this fix to your kernel. > > Testing: tested on fake /sys/firmware/efi/systab > ./dmidecode > # dmidecode 3.0 > # SMBIOS entry point at 0x00dead00 > # SMBIOS3 entry point at 0xffdeadff > Found SMBIOS entry point in EFI, reading table from /dev/mem at 0xffdeadff. > > Signed-off-by: Petr Oros <[email protected]> > --- > dmidecode.c | 7 +++---- > 1 file changed, 3 insertions(+), 4 deletions(-) > > diff --git a/dmidecode.c b/dmidecode.c > index 3993592..44f1195 100644 > --- a/dmidecode.c > +++ b/dmidecode.c > @@ -4755,14 +4755,13 @@ static int address_from_efi(off_t *address) > char *addrp = strchr(linebuf, '='); > *(addrp++) = '\0'; > if (strcmp(linebuf, "SMBIOS3") == 0 > - || strcmp(linebuf, "SMBIOS") == 0) > + || (strcmp(linebuf, "SMBIOS") == 0 && *address == 0)) > { > *address = strtoull(addrp, NULL, 0); > if (!(opt.flags & FLAG_QUIET)) > printf("# %s entry point at 0x%08llx\n", > linebuf, (unsigned long long)*address); > ret = 0; > - break; > } > } > if (fclose(efi_systab) != 0) > @@ -4895,8 +4894,8 @@ int main(int argc, char * const argv[]) > } > > if (!(opt.flags & FLAG_QUIET)) > - printf("Found SMBIOS entry point in EFI, reading table from > %s.\n", > - opt.devmem); > + printf("Found SMBIOS entry point in EFI, reading table from %s > at 0x%08lx.\n", > + opt.devmem, fp); > if ((buf = mem_chunk(fp, 0x20, opt.devmem)) == NULL) > { > ret = 1; -- Jean Delvare SUSE L3 Support _______________________________________________ https://lists.nongnu.org/mailman/listinfo/dmidecode-devel
