diff --git a/biosdevname-Add-SMBIOS-3.x-support.patch b/biosdevname-Add-SMBIOS-3.x-support.patch new file mode 100644 index 0000000..d1db5ee --- /dev/null +++ b/biosdevname-Add-SMBIOS-3.x-support.patch @@ -0,0 +1,61 @@ +From 8459b891cdbb2d4691bd188ced5a512be8734d10 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +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 +--- + 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= 0x18 && memcmp(buf, "_SM3_", 5) == 0) ++ return smbios3_decode(buf, SYSFS_TABLE_DMI, state); + return 0; + } + +-- +2.16.4 + diff --git a/biosdevname-Add-buffer-read-helper-using-read-explicitly.patch b/biosdevname-Add-buffer-read-helper-using-read-explicitly.patch new file mode 100644 index 0000000..a958506 --- /dev/null +++ b/biosdevname-Add-buffer-read-helper-using-read-explicitly.patch @@ -0,0 +1,166 @@ +From 2a6b7a70e15a0b7aae4fb9de2630f3ae1b4de64e Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +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 +--- + 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 + diff --git a/biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch b/biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch new file mode 100644 index 0000000..a813ca2 --- /dev/null +++ b/biosdevname-Read-DMI-entries-from-sys-firmware-dmi-tables-DMI.patch @@ -0,0 +1,143 @@ +From 345ea79e5f020e9776ba8de64b2dccad9df56584 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +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 +--- + 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 + diff --git a/biosdevname.changes b/biosdevname.changes index 815d1e0..4d65d6c 100644 --- a/biosdevname.changes +++ b/biosdevname.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Thu Aug 13 16:41:27 UTC 2020 - Michal Suchanek + +- 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 + +- 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 + ------------------------------------------------------------------- Wed Jan 22 10:57:56 UTC 2020 - Dominique Leuenberger diff --git a/biosdevname.spec b/biosdevname.spec index 648cf22..871726d 100644 --- a/biosdevname.spec +++ b/biosdevname.spec @@ -23,7 +23,7 @@ Release: 0 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 @@ Patch3: udev-rule-path.patch 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 @@ You can enable/disable usage of biosdevname with boot option %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