Message ID | 20160817103050.GA10246@aepfle.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>> On 17.08.16 at 12:30, <olaf@aepfle.de> wrote: > @@ -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; > } Isn't this backwards? Dom0 _is_ a virtual machine. Jan
On 17/08/16 12:51, Jan Beulich wrote: >>>> On 17.08.16 at 12:30, <olaf@aepfle.de> wrote: >> @@ -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; >> } > Isn't this backwards? Dom0 _is_ a virtual machine. biosdevname uses it as a "I should silently exit and do nothing" check. This is unhelpful behaviour as dom0 is responsible for the real hardware. ~Andrew
Hello, and ping. Olaf On Wed, Aug 17, Olaf Hering wrote: > 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 <olaf@aepfle.de> > > --- > 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) > } > > /* > + 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; > + 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); > + 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; > } >
--- 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) } /* + 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; + 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); + 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; }
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 <olaf@aepfle.de> --- src/bios_dev_name.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)