Hello community, here is the log from the commit of package biosdevname for openSUSE:Factory checked in at 2020-08-23 09:20:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/biosdevname (Old) and /work/SRC/openSUSE:Factory/.biosdevname.new.3399 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "biosdevname" Sun Aug 23 09:20:27 2020 rev:47 rq:828137 version:0.7.3 Changes: -------- --- /work/SRC/openSUSE:Factory/biosdevname/biosdevname.changes 2020-01-30 09:38:52.661409090 +0100 +++ /work/SRC/openSUSE:Factory/.biosdevname.new.3399/biosdevname.changes 2020-08-23 09:20:29.078662023 +0200 @@ -1,0 +2,14 @@ +Thu Aug 13 16:41:27 UTC 2020 - Michal Suchanek <msucha...@suse.com> + +- Add support for SMBIOS 3. + * biosdevname-Add-SMBIOS-3.x-support.patch +- Fix URL in specfile. It should be readable to developers. + +------------------------------------------------------------------- +Thu Aug 13 11:35:43 UTC 2020 - Michal Suchanek <msucha...@suse.com> + +- Read DMI info rom sysfs (bsc#1174491). + * biosdevname-Add-buffer-read-helper-using-read-explicitly.patch + * biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch + +------------------------------------------------------------------- New: ---- biosdevname-Add-SMBIOS-3.x-support.patch biosdevname-Add-buffer-read-helper-using-read-explicitly.patch biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ biosdevname.spec ++++++ --- /var/tmp/diff_new_pack.hmADKO/_old 2020-08-23 09:20:29.614662320 +0200 +++ /var/tmp/diff_new_pack.hmADKO/_new 2020-08-23 09:20:29.614662320 +0200 @@ -23,7 +23,7 @@ Summary: Udev helper for naming devices per BIOS names License: GPL-2.0-only Group: System/Base -URL: https://github.com/dell/%{name} +URL: https://github.com/dell/biosdevname Source0: %{name}-%{version}.tar.xz Patch1: ignore-broken-BIOSes Patch2: whitelist-dell @@ -31,6 +31,9 @@ Patch4: biosdevname-pic.patch Patch5: biosdevname-dom0.patch Patch6: dmidecode-prevent-infinite-recursion.patch +Patch7: biosdevname-Add-buffer-read-helper-using-read-explicitly.patch +Patch8: biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch +Patch9: biosdevname-Add-SMBIOS-3.x-support.patch BuildRequires: automake BuildRequires: pciutils-devel BuildRequires: pkg-config @@ -65,12 +68,7 @@ %prep %setup -q -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 +%autopatch -p1 %build sed -i -e 's#@@BIOSDEVNAME_RULEDEST@@#'%{_udevrulesdir}'/71-biosdevname.rules#' configure.ac ++++++ biosdevname-Add-SMBIOS-3.x-support.patch ++++++ >From 8459b891cdbb2d4691bd188ced5a512be8734d10 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <ti...@suse.de> Date: Thu, 13 Aug 2020 16:11:06 +0200 Subject: [PATCH 3/3] Add SMBIOS 3.x support Handle only the path from sysfs for now. Signed-off-by: Takashi Iwai <ti...@suse.de> --- src/dmidecode/dmidecode.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/dmidecode/dmidecode.c b/src/dmidecode/dmidecode.c index f4c12694ef13..f478cc58aeb6 100644 --- a/src/dmidecode/dmidecode.c +++ b/src/dmidecode/dmidecode.c @@ -236,7 +236,7 @@ static int dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, co int i=0; /* Verify SMBIOS version */ - if (!isvalidsmbios(ver >> 8, ver & 0xFF)) { + if (ver && !isvalidsmbios(ver >> 8, ver & 0xFF)) { return 0; } @@ -253,7 +253,7 @@ static int dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, co } data=buf; - while(i<num && data+4<=buf+len) /* 4 is the length of an SMBIOS structure header */ + while((!num || i<num) && data+4<=buf+len) /* 4 is the length of an SMBIOS structure header */ { u8 *next; struct dmi_header h; @@ -314,6 +314,14 @@ static int legacy_decode(u8 *buf, const char *devmem, const struct libbiosdevnam return 0; } +/* only from sysfs, handle no base offset */ +static int smbios3_decode(u8 *buf, const char *devmem, const struct libbiosdevname_state *state) +{ + if (checksum(buf, 0x18)) + return dmi_table(0, DWORD(buf + 0x0c), 0, 0, devmem, state, 1); + return 0; +} + #define SYSFS_TABLE_SMBIOS "/sys/firmware/dmi/tables/smbios_entry_point" #define SYSFS_TABLE_DMI "/sys/firmware/dmi/tables/DMI" @@ -330,6 +338,8 @@ static int smibios_decode_from_sysfs(const struct libbiosdevname_state *state) fclose(fp); if (len == 0x1f && memcmp(buf, "_SM_", 4) == 0) return smbios_decode(buf, SYSFS_TABLE_DMI, state, 1); + if (len >= 0x18 && memcmp(buf, "_SM3_", 5) == 0) + return smbios3_decode(buf, SYSFS_TABLE_DMI, state); return 0; } -- 2.16.4 ++++++ biosdevname-Add-buffer-read-helper-using-read-explicitly.patch ++++++ >From 2a6b7a70e15a0b7aae4fb9de2630f3ae1b4de64e Mon Sep 17 00:00:00 2001 From: Takashi Iwai <ti...@suse.de> Date: Thu, 13 Aug 2020 13:21:59 +0200 Subject: [PATCH 1/3] Add buffer read helper using read explicitly Since mmap can't work well with a sysfs file, we need to read the contents explicitly via read, even if USE_MMAP is enabled. Provide a new helper, __mem_cunk(), that does behave like mem_chunk() but with the extra use_mmap argument to specify the method to read a file. Signed-off-by: Takashi Iwai <ti...@suse.de> --- src/dmidecode/util.c | 82 +++++++++++++++++++++++++++++++++------------------- src/dmidecode/util.h | 1 + 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/dmidecode/util.c b/src/dmidecode/util.c index ea06663d3664..09934eabcf24 100644 --- a/src/dmidecode/util.c +++ b/src/dmidecode/util.c @@ -47,7 +47,6 @@ #include "types.h" #include "util.h" -#ifndef USE_MMAP static int myread(int fd, u8 *buf, size_t count, const char *prefix) { ssize_t r=1; @@ -78,7 +77,6 @@ static int myread(int fd, u8 *buf, size_t count, const char *prefix) return 0; } -#endif int checksum(const u8 *buf, size_t len) { @@ -94,28 +92,13 @@ int checksum(const u8 *buf, size_t len) * Copy a physical memory chunk into a memory buffer. * This function allocates memory. */ -void *mem_chunk(size_t base, size_t len, const char *devmem) -{ - void *p; - int fd; #ifdef USE_MMAP +static void *mem_chunk_mmap(size_t base, size_t len, const char *devmem, + int fd, void *p) +{ size_t mmoffset; void *mmp; -#endif - - if((fd=open(devmem, O_RDONLY))==-1) - { - return NULL; - } - - if((p=malloc(len))==NULL) - { - perror("malloc"); - close(fd); - return NULL; - } - -#ifdef USE_MMAP + #ifdef _SC_PAGESIZE mmoffset=base%sysconf(_SC_PAGESIZE); #else @@ -129,8 +112,6 @@ void *mem_chunk(size_t base, size_t len, const char *devmem) mmp=mmap(0, mmoffset+len, PROT_READ, MAP_SHARED, fd, base-mmoffset); if(mmp==MAP_FAILED) { - free(p); - close(fd); return NULL; } @@ -141,26 +122,67 @@ void *mem_chunk(size_t base, size_t len, const char *devmem) fprintf(stderr, "%s: ", devmem); perror("munmap"); } -#else /* USE_MMAP */ + + return p; +} +#endif /* USE_MMAP */ + +static void *mem_chunk_read(size_t base, size_t len, const char *devmem, + int fd, void *p) +{ if(lseek(fd, base, SEEK_SET)==-1) { fprintf(stderr, "%s: ", devmem); perror("lseek"); - free(p); - close(fd); return NULL; } if(myread(fd, p, len, devmem)==-1) { - free(p); - close(fd); return NULL; } -#endif /* USE_MMAP */ + + return p; +} + +void *__mem_chunk(size_t base, size_t len, const char *devmem, int use_mmap) +{ + void *ret; + void *p; + int fd; + +#ifndef USE_MMAP + use_mmap = 0; +#endif + + if((fd=open(devmem, O_RDONLY))==-1) + { + return NULL; + } + if((p=malloc(len))==NULL) + { + perror("malloc"); + close(fd); + return NULL; + } + +#ifdef USE_MMAP + if (use_mmap) + ret = mem_chunk_mmap(base, len, devmem, fd, p); + else +#endif + ret = mem_chunk_read(base, len, devmem, fd, p); + if(close(fd)==-1) perror(devmem); + if (!ret) + free(p); - return p; + return ret; +} + +void *mem_chunk(size_t base, size_t len, const char *devmem) +{ + return __mem_chunk(base, len, devmem, 1); } diff --git a/src/dmidecode/util.h b/src/dmidecode/util.h index b546f64f3685..90c411e7bf9b 100644 --- a/src/dmidecode/util.h +++ b/src/dmidecode/util.h @@ -6,3 +6,4 @@ int checksum(const u8 *buf, size_t len); void *mem_chunk(size_t base, size_t len, const char *devmem); +void *__mem_chunk(size_t base, size_t len, const char *devmem, int use_mmap); -- 2.16.4 ++++++ biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch ++++++ >From 345ea79e5f020e9776ba8de64b2dccad9df56584 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <ti...@suse.de> Date: Thu, 13 Aug 2020 13:24:35 +0200 Subject: [PATCH 2/3] Read DMI entries from /sys/firmware/dmi/tables/DMI A kernel with Secure Boot lockdown may prohibit reading the contents of /dev/mem, hence biosdevname fails. The recent kernel provides the DMI byte contents in /sys/firmware/dmi/tables/*, and we can use this instead of poking /dev/mem. Signed-off-by: Takashi Iwai <ti...@suse.de> --- src/dmidecode/dmidecode.c | 54 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/dmidecode/dmidecode.c b/src/dmidecode/dmidecode.c index a01a6ce074f1..f4c12694ef13 100644 --- a/src/dmidecode/dmidecode.c +++ b/src/dmidecode/dmidecode.c @@ -229,7 +229,7 @@ static int isvalidsmbios(int mjr, int mnr) return 0; } -static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, const struct libbiosdevname_state *state) +static int dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, const struct libbiosdevname_state *state, int sysfs) { u8 *buf; u8 *data; @@ -237,14 +237,19 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, c /* Verify SMBIOS version */ if (!isvalidsmbios(ver >> 8, ver & 0xFF)) { - return; + return 0; } - if((buf=mem_chunk(base, len, devmem))==NULL) + + if (sysfs) + buf = __mem_chunk(0, len, devmem, 0); + else + buf = mem_chunk(base, len, devmem); + if(buf == NULL) { #ifndef USE_MMAP printf("Table is unreachable, sorry. Try compiling dmidecode with -DUSE_MMAP.\n"); #endif - return; + return 0; } data=buf; @@ -280,18 +285,18 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, c i++; } free(buf); + return 1; } - -static int smbios_decode(u8 *buf, const char *devmem, const struct libbiosdevname_state *state) +static int smbios_decode(u8 *buf, const char *devmem, const struct libbiosdevname_state *state, int sysfs) { if(checksum(buf, buf[0x05]) && memcmp(buf+0x10, "_DMI_", 5)==0 && checksum(buf+0x10, 0x0F)) { - dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C), - (buf[0x06]<<8)+buf[0x07], devmem, state); - return 1; + return dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C), + (buf[0x06]<<8)+buf[0x07], devmem, state, + sysfs); } return 0; @@ -302,13 +307,32 @@ static int legacy_decode(u8 *buf, const char *devmem, const struct libbiosdevnam if(checksum(buf, 0x0F)) { dmi_table(DWORD(buf+0x08), WORD(buf+0x06), WORD(buf+0x0C), - ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, state); + ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, state, 0); return 1; } return 0; } +#define SYSFS_TABLE_SMBIOS "/sys/firmware/dmi/tables/smbios_entry_point" +#define SYSFS_TABLE_DMI "/sys/firmware/dmi/tables/DMI" + +static int smibios_decode_from_sysfs(const struct libbiosdevname_state *state) +{ + FILE *fp; + u8 buf[0x1f]; + int len; + + fp = fopen(SYSFS_TABLE_SMBIOS, "r"); + if (!fp) + return 0; + len = fread(buf, 1, sizeof(buf), fp); + fclose(fp); + if (len == 0x1f && memcmp(buf, "_SM_", 4) == 0) + return smbios_decode(buf, SYSFS_TABLE_DMI, state, 1); + return 0; +} + /* * Probe for EFI interface */ @@ -417,7 +441,11 @@ int dmidecode_main(const struct libbiosdevname_state *state) if (dmidecode_read_file(state)) return 0; - /* First try EFI (ia64, Intel-based Mac) */ + /* First try sysfs entries */ + if (smibios_decode_from_sysfs(state)) + return 0; + + /* Next try EFI (ia64, Intel-based Mac) */ efi=address_from_efi(&fp); switch(efi) { @@ -434,7 +462,7 @@ int dmidecode_main(const struct libbiosdevname_state *state) goto exit_free; } - if(smbios_decode(buf, devmem, state)) + if(smbios_decode(buf, devmem, state, 0)) found++; goto done; @@ -450,7 +478,7 @@ memory_scan: { if(memcmp(buf+fp, "_SM_", 4)==0 && fp<=0xFFE0) { - if(smbios_decode(buf+fp, devmem, state)) + if(smbios_decode(buf+fp, devmem, state, 0)) { found++; fp+=16; -- 2.16.4