From bfc6057abe239a1e884638c17e12d10708fa69d3108c0e83982fed994c2ffa2a Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Tue, 30 Aug 2016 13:50:57 +0000 Subject: [PATCH] Accepting request 419749 from home:olh:branches:Base:System - Detect dom1 via xenfs instead of cpuid to compensate for ABI change in xen-4.7 on AMD systems. (bnc#974257) biosdevname-dom0.patch OBS-URL: https://build.opensuse.org/request/show/419749 OBS-URL: https://build.opensuse.org/package/show/Base:System/biosdevname?expand=0&rev=64 --- biosdevname-dom0.patch | 52 ++++++++++++++++++++++++++++++++++++++++++ biosdevname.changes | 7 ++++++ biosdevname.spec | 4 +++- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 biosdevname-dom0.patch diff --git a/biosdevname-dom0.patch b/biosdevname-dom0.patch new file mode 100644 index 0000000..70cfbb8 --- /dev/null +++ b/biosdevname-dom0.patch @@ -0,0 +1,52 @@ +--- + src/bios_dev_name.c | 31 +++++++++++++++++++++++++++++++ + 1 file changed, 31 insertions(+) + +--- a/src/bios_dev_name.c ++++ b/src/bios_dev_name.c +@@ -133,6 +133,33 @@ cpuid (u_int32_t eax, u_int32_t ecx) + } + + /* ++ Starting with xen-4.7 cpuid will return with the hypervisor bit set ++ on AMD systems. This breaks biosdevname and network interface names. ++ Instead of relying on cpuid check for dom0 in xenfs. ++*/ ++static int ++running_in_dom0(void) ++{ ++ size_t len = 0; ++#ifdef __x86_64__ ++ char buf[16]; ++ FILE *f = fopen("/proc/xen/capabilities", "r"); ++ ++ if (!f) ++ return 0; ++ memset(buf, 0, sizeof(buf)); ++ len = fread(&buf, 1, sizeof(buf) - 1, f); ++ fclose(f); ++ while(len && --len && len < sizeof(buf)) { ++ if (buf[len] == '\n') ++ buf[len] = '\0'; ++ } ++ len = strcmp("control_d", buf) == 0; ++#endif ++ return len; ++} ++ ++/* + Algorithm suggested by: + http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 + */ +@@ -144,7 +171,11 @@ running_in_virtual_machine (void) + + ecx = cpuid (eax, ecx); + if (ecx & 0x80000000U) ++ { ++ if (running_in_dom0()) ++ return 0; + return 1; ++ } + return 0; + } + diff --git a/biosdevname.changes b/biosdevname.changes index 09d397c..454c855 100644 --- a/biosdevname.changes +++ b/biosdevname.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Tue Aug 16 14:18:06 UTC 2016 - olaf@aepfle.de + +- Detect dom0 via xenfs instead of cpuid to compensate for ABI + change in xen-4.7 on AMD systems. (bnc#974257) + biosdevname-dom0.patch + ------------------------------------------------------------------- Fri Mar 4 13:34:44 UTC 2016 - trenn@suse.de diff --git a/biosdevname.spec b/biosdevname.spec index f934a9f..502312a 100644 --- a/biosdevname.spec +++ b/biosdevname.spec @@ -1,7 +1,7 @@ # # spec file for package biosdevname # -# Copyright (c) 2016 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -29,6 +29,7 @@ Patch1: ignore-broken-BIOSes Patch2: whitelist-dell Patch3: udev-rule-path.patch Patch4: biosdevname-pic.patch +Patch5: biosdevname-dom0.patch BuildRequires: automake # to figure out how to name/location of the rules file BuildRequires: libudev-devel @@ -67,6 +68,7 @@ You can enable/disable usage of biosdevname with boot option %patch2 -p1 %patch3 -p1 %patch4 -p1 +%patch5 -p1 %build sed -i -e 's#@@BIOSDEVNAME_RULEDEST@@#'%{_udevrulesdir}'/71-biosdevname.rules#' configure.ac