On 2018-04-16 19:46, Francois-Frederic Ozog wrote: > From: Francois-Frederic Ozog <francois.o...@linaro.org> > > inmates cannot use X86_FEATURE_VMX from regular cpuid > as vcpu maks the bit explicitely on non-root cells. > > use cpuid leaf 0 to detect AuthenticAMD and change to VMMCALL > > use string compare for clearer code > > Signed-off-by: Francois-Frederic Ozog <francois.o...@linaro.org> > --- > inmates/lib/x86/hypercall.c | 21 ++++++++++++++------- > 1 file changed, 14 insertions(+), 7 deletions(-) > > diff --git a/inmates/lib/x86/hypercall.c b/inmates/lib/x86/hypercall.c > index ac99f0c3..07529d4d 100644 > --- a/inmates/lib/x86/hypercall.c > +++ b/inmates/lib/x86/hypercall.c > @@ -40,19 +40,26 @@ > > #define X86_FEATURE_VMX (1 << 5) > > -bool jailhouse_use_vmcall; > +bool jailhouse_use_vmcall = true; > + > +static const char* AUTHENTIC_AMD = "AuthenticAMD"; > +#define U32_SUBSTR(s, n) (((const u32*)s)[n]) > > void hypercall_init(void) > { > - u32 eax = 1, ecx = 0; > + u32 ebx, ecx, edx; > > asm volatile( > + "xor %%eax, %%eax \n\t" > "cpuid" > - : "=c" (ecx) > - : "a" (eax), "c" (ecx) > - : "rbx", "rdx", "memory" > + : "=b" (ebx), "=c" (ecx), "=d" (edx) > + : > + : "memory" > ); > > - if (ecx & X86_FEATURE_VMX) > - jailhouse_use_vmcall = true; > + if (ebx == U32_SUBSTR(AUTHENTIC_AMD, 0) > + && ecx == U32_SUBSTR(AUTHENTIC_AMD, 2) > + && edx == U32_SUBSTR(AUTHENTIC_AMD, 1) > + ) > + jailhouse_use_vmcall = false; > } >
I would go with this diff now unless you have concerns: diff --git a/inmates/lib/x86/hypercall.c b/inmates/lib/x86/hypercall.c index ac99f0c3e..fc5cd5ac8 100644 --- a/inmates/lib/x86/hypercall.c +++ b/inmates/lib/x86/hypercall.c @@ -38,21 +38,24 @@ #include <inmate.h> -#define X86_FEATURE_VMX (1 << 5) +#define X86_FEATURE_VMX (1 << 5) -bool jailhouse_use_vmcall; +bool jailhouse_use_vmcall = true; + +#define AUTHENTIC_AMD(n) (((const u32 *)"AuthenticAMD")[n]) void hypercall_init(void) { - u32 eax = 1, ecx = 0; + u32 eax, ebx, ecx, edx; - asm volatile( - "cpuid" - : "=c" (ecx) - : "a" (eax), "c" (ecx) - : "rbx", "rdx", "memory" + asm volatile("cpuid" + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) + : "a" (0) + : "memory" ); - if (ecx & X86_FEATURE_VMX) - jailhouse_use_vmcall = true; + if (ebx == AUTHENTIC_AMD(0) && + edx == AUTHENTIC_AMD(1) && + ecx == AUTHENTIC_AMD(2)) + jailhouse_use_vmcall = false; } We need to account for Intel cpuid clobbering eax. Moreover, I played a bit with the style. Newer gcc even avoids a static string. Still need to validate this on an AMD system, though. Thanks, Jan -- Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to jailhouse-dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.