>From what i can see regarding the range, linux loops through them until it
finds one for KVM. I think after looking at it a little more, it's because
you can have multiple hypervisors

On Wed, Jun 1, 2016 at 4:33 PM barret rhoden <[email protected]> wrote:

> On 2016-06-01 at 15:31 Gan Shun wrote:
> > Intercept the CPUID vmexit to possibly either set the hypervisor bit or
> to
> > return the KVM signature depending on the value in RAX.
> >
> > Signed-off-by: Gan Shun <[email protected]>
> > Change-Id: Ic27e05eafa22b0a20a888397c8bae37ff0ea3267
> > ---
> >  kern/arch/x86/trap.c | 19 ++++++++++++++++++-
> >  1 file changed, 18 insertions(+), 1 deletion(-)
> >
> > diff --git a/kern/arch/x86/trap.c b/kern/arch/x86/trap.c
> > index 72d0c64..9ebe5a6 100644
> > --- a/kern/arch/x86/trap.c
> > +++ b/kern/arch/x86/trap.c
> > @@ -685,7 +685,24 @@ static bool handle_vmexit_cpuid(struct vm_trapframe
> *tf)
> >  {
> >       uint32_t eax, ebx, ecx, edx;
> >
> > -     cpuid(tf->tf_rax, tf->tf_rcx, &eax, &ebx, &ecx, &edx);
> > +     /* 0x4000000 is taken from Linux; it is not documented but it
> signals the
> > +      * use of KVM. */
>
> This looks like http://www.sandpile.org/x86/cpuid.htm#level_4000_0000h
>
> Do we have to say 'KVM'(does Linux look for that specifically)?  I
> notice that there are a bunch of other ones, like VMwareVMware.
>
> There are some other cool things in the 0x4000_xxxx section of cpuid
>
> > +     if (tf->tf_rax == 0x40000000) {
> > +             /* Pretend to be KVM: Return the KVM signature by placing
> the following
> > +              * constants in RAX, RBX, RCX and RDX. RAX is set to 0,
> while RBX to
> > +              * RDX forms the string "KVMKVMKVMKVM\0\0\0". This can be
> placed in
> > +              * 0x100 offsets from 0x40000000 to 0x40010000. */
>
> Does that mean that a cpuid of e.g. 0x4000_0300 should return the same
> value as 0x4000_0000?  That sounds pretty odd.
>
> Barret
>
>
> > +             eax = 0;
> > +             ebx = 0x4b4d564b;
> > +             ecx = 0x564b4d56;
> > +             edx = 0x0000004d;
> > +     } else {
> > +             cpuid(tf->tf_rax, tf->tf_rcx, &eax, &ebx, &ecx, &edx);
> > +             if (tf->tf_rax == 1) {
> > +                     /* Set the hypervisor bit to let the guest know it
> is virtualized */
> > +                     ecx |= 1 << 31;
> > +             }
> > +     }
> >       tf->tf_rax = eax;
> >       tf->tf_rbx = ebx;
> >       tf->tf_rcx = ecx;
>
> --
> You received this message because you are subscribed to the Google Groups
> "Akaros" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to