Accepting request 826317 from home:michals
- Add support for SMBIOS 3. * biosdevname-Add-SMBIOS-3.x-support.patch - Fix URL in specfile. It should be readable to developers. - 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 OBS-URL: https://build.opensuse.org/request/show/826317 OBS-URL: https://build.opensuse.org/package/show/Base:System/biosdevname?expand=0&rev=77
This commit is contained in:
parent
7ce7c6beb0
commit
460904c5ee
61
biosdevname-Add-SMBIOS-3.x-support.patch
Normal file
61
biosdevname-Add-SMBIOS-3.x-support.patch
Normal file
@ -0,0 +1,61 @@
|
||||
From 8459b891cdbb2d4691bd188ced5a512be8734d10 Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Iwai <tiwai@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 <tiwai@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
|
||||
|
166
biosdevname-Add-buffer-read-helper-using-read-explicitly.patch
Normal file
166
biosdevname-Add-buffer-read-helper-using-read-explicitly.patch
Normal file
@ -0,0 +1,166 @@
|
||||
From 2a6b7a70e15a0b7aae4fb9de2630f3ae1b4de64e Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Iwai <tiwai@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 <tiwai@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
|
||||
|
@ -0,0 +1,143 @@
|
||||
From 345ea79e5f020e9776ba8de64b2dccad9df56584 Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Iwai <tiwai@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 <tiwai@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
|
||||
|
@ -1,3 +1,17 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Aug 13 16:41:27 UTC 2020 - Michal Suchanek <msuchanek@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 <msuchanek@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
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 22 10:57:56 UTC 2020 - Dominique Leuenberger <dimstar@opensuse.org>
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user