Re: [PATCH] test: Add emulator test for iret instruction

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 29, 2010 at 2:16 AM, Mohammed Gamal <m.gamal005@xxxxxxxxx> wrote:
> On Thu, Jul 29, 2010 at 2:13 AM, Mohammed Gamal <m.gamal005@xxxxxxxxx> wrote:
>> On Wed, Jul 28, 2010 at 11:56 PM, Marcelo Tosatti <mtosatti@xxxxxxxxxx> wrote:
>>> On Wed, Jul 28, 2010 at 11:36:16PM +0300, Mohammed Gamal wrote:
>>>> On Wed, Jul 28, 2010 at 11:32 PM, Marcelo Tosatti <mtosatti@xxxxxxxxxx> wrote:
>>>> > On Wed, Jul 28, 2010 at 11:28:05PM +0300, Mohammed Gamal wrote:
>>>> >> On Wed, Jul 28, 2010 at 10:55 PM, Marcelo Tosatti <mtosatti@xxxxxxxxxx> wrote:
>>>> >> > On Wed, Jul 28, 2010 at 12:39:01PM +0300, Mohammed Gamal wrote:
>>>> >> >> This adds a unit test for real mode emulation of the iret instruction
>>>> >> >>
>>>> >> >> Signed-off-by: Mohammed Gamal <m.gamal005@xxxxxxxxx>
>>>> >> >>
>>>> >> >> ---
>>>> >> >> Changes from v1:
>>>> >> >> - Added test for 16-bit iret
>>>> >> >> - Added tests for returned eflags
>>>> >> >> ---
>>>> >> >>  kvm/test/x86/realmode.c |   79 +++++++++++++++++++++++++++++++++++++++++++++++
>>>> >> >>  1 files changed, 79 insertions(+), 0 deletions(-)
>>>> >> >>
>>>> >> >> diff --git a/kvm/test/x86/realmode.c b/kvm/test/x86/realmode.c
>>>> >> >> index bd79348..74456c3 100644
>>>> >> >> --- a/kvm/test/x86/realmode.c
>>>> >> >> +++ b/kvm/test/x86/realmode.c
>>>> >> >> @@ -865,6 +865,84 @@ void test_pusha_popa()
>>>> >> >>               print_serial("Pusha/Popa Test2: PASS\n");
>>>> >> >>  }
>>>> >> >>
>>>> >> >> +void test_iret()
>>>> >> >> +{
>>>> >> >> +     struct regs inregs = { 0 }, outregs;
>>>> >> >> +
>>>> >> >> +     MK_INSN(iret32, "pushf\n\t"
>>>> >> >> +                     "pushl %cs\n\t"
>>>> >> >> +                     "call 1f\n\t" /* a near call will push eip onto the stack */
>>>> >> >> +                     "jmp 2f\n\t"
>>>> >> >> +                     "1: iret\n\t"
>>>> >> >> +                     "2:\n\t"
>>>> >> >> +                  );
>>>> >> >> +
>>>> >> >> +     MK_INSN(iret16, "pushfw\n\t"
>>>> >> >> +                     "pushw %cs\n\t"
>>>> >> >> +                     "callw 1f\n\t"
>>>> >> >> +                     "jmp 2f\n\t"
>>>> >> >> +                     "1: iretw\n\t"
>>>> >> >> +                     "2:\n\t");
>>>> >> >
>>>> >> > Unless iret causes a task switch, it will not cause an exit.
>>>> >> >
>>>> >> >
>>>> >> The test covers only the real mode case, we won't have a task switch there, no?
>>>> >
>>>> > No. And there is no vmexit for iret, so it does not go through the
>>>> > emulator.
>>>> >
>>>> I'm pretty sure the iret instruction went through the emulator. I saw
>>>> the instruction opcode (0xcf) being in ftrace.
>>>
>>> Can you confirm that please? I don't see it here.
>>>
>>
> Sure, here is the ftrace output corresponding to the test instructions
>
> From the first test
> qemu-system-x86-12850 [001]  5167.509842: kvm_emulate_insn: 0:4200: 66 9c (real)
>  qemu-system-x86-12850 [001]  5167.509844: kvm_emulate_insn: 0:4202:
> 66 0e (real)
>  qemu-system-x86-12850 [001]  5167.509847: kvm_emulate_insn: 0:4204:
> 66 e8 02 00 00 00 (real)
>  qemu-system-x86-12850 [001]  5167.509849: kvm_emulate_insn: 0:420c:
> 66 cf (real)
>  qemu-system-x86-12850 [001]  5167.509852: kvm_emulate_insn: 0:420a:
> eb 02 (real)
>
> Second test:
> qemu-system-x86-12850 [001]  5167.509998: kvm_emulate_insn: 0:4200: 9c (real)
>  qemu-system-x86-12850 [001]  5167.510000: kvm_emulate_insn: 0:4201: 0e (real)
>  qemu-system-x86-12850 [001]  5167.510002: kvm_emulate_insn: 0:4202:
> e8 02 00 (real)
>   qemu-system-x86-12850 [001]  5167.510004: kvm_emulate_insn: 0:4207: cf (real)
>   qemu-system-x86-12850 [001]  5167.510006: kvm_emulate_insn: 0:4205:
> eb 01 (real)
>
> Third test:
>           <...>-12850 [001]  5167.510162: kvm_emulate_insn: 0:4200: 66 9c (real)
>            <...>-12850 [001]  5167.510164: kvm_emulate_insn: 0:4202:
>  66 58 (real)
>            <...>-12850 [001]  5167.510166: kvm_emulate_insn: 0:4204:
>  66 83 e0 fd (real)
>            <...>-12850 [001]  5167.510168: kvm_emulate_insn: 0:4208:
>  66 0d 28 80 c0 ff (real)
>            <...>-12850 [001]  5167.510170: kvm_emulate_insn: 0:420e:
>  66 50 (real)
>            <...>-12850 [001]  5167.510172: kvm_emulate_insn: 0:4210:
>  66 0e (real)
>            <...>-12850 [001]  5167.510174: kvm_emulate_insn: 0:4212:
>  66 e8 02 00 00 00 (real)
>            <...>-12850 [001]  5167.510176: kvm_emulate_insn: 0:421a:
>  66 cf (real)
>            <...>-12850 [001]  5167.510179: kvm_emulate_insn: 0:4218:
>  eb 02 (real)
>
>
>  Fourth test:
>   qemu-system-x86-12850 [001]  5167.510302: kvm_emulate_insn: 0:4200: 9c (real)
>   qemu-system-x86-12850 [001]  5167.510304: kvm_emulate_insn: 0:4201: 58 (real)
>   qemu-system-x86-12850 [001]  5167.510306: kvm_emulate_insn: 0:4202:
>  83 e0 fd (real)
>   qemu-system-x86-12850 [001]  5167.510308: kvm_emulate_insn: 0:4205:
>  0d 28 80 (real)
>   qemu-system-x86-12850 [001]  5167.510310: kvm_emulate_insn: 0:4208: 50 (real)
>   qemu-system-x86-12850 [001]  5167.510312: kvm_emulate_insn: 0:4209: 0e (real)
>   qemu-system-x86-12850 [001]  5167.510313: kvm_emulate_insn: 0:420a:
>  e8 02 00 (real)
>   qemu-system-x86-12850 [001]  5167.510315: kvm_emulate_insn: 0:420f: cf (real)
>   qemu-system-x86-12850 [001]  5167.510318: kvm_emulate_insn: 0:420d:
>  eb 01 (real)
>

As an extra note, you need to run realmode.flat with the
emulate_invalid_guest_state=1 module option for kvm_intel. If you
don't use that option, the emulator is not going to be invoked.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux