basebuilder_pel7ppc64bebuilder0
7 years ago
1 changed files with 65 additions and 0 deletions
@ -0,0 +1,65 @@ |
|||||||
|
From 6999f3f3ca525bb6b132f4ed804e7f8fe62e5f79 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
||||||
|
Date: Wed, 12 Apr 2017 10:11:29 +0100 |
||||||
|
Subject: [PATCH] lscpu: use sysfs for table access if available |
||||||
|
|
||||||
|
On ARM systems, accessing SMBIOS tables via /dev/mem using read() |
||||||
|
calls is not supported. The reason is that such tables are usually |
||||||
|
located in EFI_RUNTIME_SERVICE_DATA memory, which is not covered |
||||||
|
by the linear mapping on those systems, and so read() calls will |
||||||
|
fail. |
||||||
|
|
||||||
|
So instead, use the /sys/firmware/dmi/tables/DMI sysfs file, which |
||||||
|
contains the entire structure table array, and will be available |
||||||
|
on any recent Linux system, even on ones that only export the rev3 |
||||||
|
SMBIOS entry point, which is currently ignored by lscpu. |
||||||
|
|
||||||
|
Note that the max 'num' value is inferred from the size. This is not |
||||||
|
a limitation of the sysfs interface, but a limitation of the rev3 |
||||||
|
entry point, which no longer carries a number of array elements. |
||||||
|
|
||||||
|
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1455664 |
||||||
|
Upstream: http://github.com/karelzak/util-linux/commit/92a6392c41c11bcb49af9f129dfbd1fed651f044 |
||||||
|
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
||||||
|
Tested-by: Alexander Graf <agraf@suse.de> |
||||||
|
Reviewed-by: Alexander Graf <agraf@suse.de> |
||||||
|
--- |
||||||
|
sys-utils/lscpu-dmi.c | 16 ++++++++++++++++ |
||||||
|
1 file changed, 16 insertions(+) |
||||||
|
|
||||||
|
diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c |
||||||
|
index 0e497d1..a8298ff 100644 |
||||||
|
--- a/sys-utils/lscpu-dmi.c |
||||||
|
+++ b/sys-utils/lscpu-dmi.c |
||||||
|
@@ -192,6 +192,18 @@ static int hypervisor_decode_smbios(uint8_t *buf, const char *devmem) |
||||||
|
devmem); |
||||||
|
} |
||||||
|
|
||||||
|
+static int hypervisor_decode_sysfw(void) |
||||||
|
+{ |
||||||
|
+ static char const sys_fw_dmi_tables[] = "/sys/firmware/dmi/tables/DMI"; |
||||||
|
+ struct stat st; |
||||||
|
+ |
||||||
|
+ if (stat(sys_fw_dmi_tables, &st)) |
||||||
|
+ return -1; |
||||||
|
+ |
||||||
|
+ return hypervisor_from_dmi_table(0, st.st_size, st.st_size / 4, |
||||||
|
+ sys_fw_dmi_tables); |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* |
||||||
|
* Probe for EFI interface |
||||||
|
*/ |
||||||
|
@@ -242,6 +254,10 @@ int read_hypervisor_dmi(void) |
||||||
|
|| '\0' != 0) |
||||||
|
return rc; |
||||||
|
|
||||||
|
+ rc = hypervisor_decode_sysfw(); |
||||||
|
+ if (rc >= 0) |
||||||
|
+ return rc; |
||||||
|
+ |
||||||
|
/* First try EFI (ia64, Intel-based Mac) */ |
||||||
|
switch (address_from_efi(&fp)) { |
||||||
|
case EFI_NOT_FOUND: |
||||||
|
-- |
||||||
|
2.9.4 |
Loading…
Reference in new issue