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