From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olaf Hering Subject: [PATCH biosdevname]: handle dom0 on AMD systems Date: Wed, 17 Aug 2016 12:30:50 +0200 Message-ID: <20160817103050.GA10246@aepfle.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7547729877472636485==" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Jordan_Hargrave@dell.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org --===============7547729877472636485== Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Dxnq1zWXvFF0Q93v" Content-Disposition: inline --Dxnq1zWXvFF0Q93v Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Starting with xen-4.7 cpuid() will return with the hypervisor bit set in a dom0 when running on an AMD system. As a result biosdevname thinks it runs in a guest and does nothing. Detect a dom0 by looking into xenfs. This works with classic xenlinux based kernels and with pvops based kernels. Signed-off-by: Olaf Hering --- 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,31 @@ cpuid (u_int32_t eax, u_int32_t ecx) } =20 /* + 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 =3D 0; + char buf[16]; + FILE *f =3D fopen("/proc/xen/capabilities", "r"); + + if (!f) + return 0; + memset(buf, 0, sizeof(buf)); + len =3D fread(&buf, 1, sizeof(buf) - 1, f); + fclose(f); + while(len && --len && len < sizeof(buf)) { + if (buf[len] =3D=3D '\n') + buf[len] =3D '\0'; + } + len =3D !strcmp("control_d", buf); + return len; +} + +/* Algorithm suggested by: http://kb.vmware.com/selfservice/microsites/search.do?language=3Den_US&c= md=3DdisplayKC&externalId=3D1009458 */ @@ -144,7 +171,11 @@ running_in_virtual_machine (void) =20 ecx =3D cpuid (eax, ecx); if (ecx & 0x80000000U) + { + if (running_in_dom0()) + return 0; return 1; + } return 0; } =20 --Dxnq1zWXvFF0Q93v Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEARECAAYFAle0PNUACgkQXUKg+qaYNn6tAwCfevnTle1Pr07P4voHGVQmMfRV 6j0AnA/m6D2+S4N5Twtx4HCFvD2WqK5q =CYKk -----END PGP SIGNATURE----- --Dxnq1zWXvFF0Q93v-- --===============7547729877472636485== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5v cmcveGVuLWRldmVsCg== --===============7547729877472636485==--