Re: [PATCH] test: Add emulator test for iret instruction
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.gamal...@gmail.com --- 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(-) Applied, thanks. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] test: Add emulator test for iret instruction
This adds a unit test for real mode emulation of the iret instruction Signed-off-by: Mohammed Gamal m.gamal...@gmail.com --- 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); + + MK_INSN(iret_flags32, pushfl\n\t + popl %eax\n\t + andl $~0x2, %eax\n\t + orl $0xffc08028, %eax\n\t + pushl %eax\n\t + pushl %cs\n\t + call 1f\n\t + jmp 2f\n\t + 1: iret\n\t + 2:\n\t); + + MK_INSN(iret_flags16, pushfw\n\t + popw %ax\n\t + and $~0x2, %ax\n\t + or $0x8028, %ax\n\t + pushw %ax\n\t + pushw %cs\n\t + callw 1f\n\t + jmp 2f\n\t + 1: iretw\n\t + 2:\n\t); + + exec_in_big_real_mode(inregs, outregs, + insn_iret32, + insn_iret32_end - insn_iret32); + + if (!regs_equal(inregs, outregs, 0)) + print_serial(iret Test 1: FAIL\n); + else + print_serial(iret Test 1: PASS\n); + + exec_in_big_real_mode(inregs, outregs, + insn_iret16, + insn_iret16_end - insn_iret16); + + if (!regs_equal(inregs, outregs, 0)) + print_serial(iret Test 2: FAIL\n); + else + print_serial(iret Test 2: PASS\n); + + exec_in_big_real_mode(inregs, outregs, + insn_iret_flags32, + insn_iret_flags32_end - insn_iret_flags32); + + if (!regs_equal(inregs, outregs, R_AX)) + print_serial(iret Test 3: FAIL\n); + else + print_serial(iret Test 3: PASS\n); + + exec_in_big_real_mode(inregs, outregs, + insn_iret_flags16, + insn_iret_flags16_end - insn_iret_flags16); + + if (!regs_equal(inregs, outregs, R_AX)) + print_serial(iret Test 4: FAIL\n); + else + print_serial(iret Test 4: PASS\n); +} + void realmode_start(void) { test_null(); @@ -886,6 +964,7 @@ void realmode_start(void) /* long jmp test uses call near so test it after testing call */ test_long_jmp(); test_xchg(); + test_iret(); exit(0); } -- 1.7.0.4 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
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.gamal...@gmail.com --- 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. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On Wed, Jul 28, 2010 at 10:55 PM, Marcelo Tosatti mtosa...@redhat.com 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.gamal...@gmail.com --- 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? -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On Wed, Jul 28, 2010 at 11:28:05PM +0300, Mohammed Gamal wrote: On Wed, Jul 28, 2010 at 10:55 PM, Marcelo Tosatti mtosa...@redhat.com 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.gamal...@gmail.com --- 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. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On Wed, Jul 28, 2010 at 11:32 PM, Marcelo Tosatti mtosa...@redhat.com 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 mtosa...@redhat.com 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.gamal...@gmail.com --- 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. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On Thu, Jul 29, 2010 at 2:13 AM, Mohammed Gamal m.gamal...@gmail.com wrote: On Wed, Jul 28, 2010 at 11:56 PM, Marcelo Tosatti mtosa...@redhat.com 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 mtosa...@redhat.com 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 mtosa...@redhat.com 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.gamal...@gmail.com --- 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.51: 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) -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On Thu, Jul 29, 2010 at 2:16 AM, Mohammed Gamal m.gamal...@gmail.com wrote: On Thu, Jul 29, 2010 at 2:13 AM, Mohammed Gamal m.gamal...@gmail.com wrote: On Wed, Jul 28, 2010 at 11:56 PM, Marcelo Tosatti mtosa...@redhat.com 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 mtosa...@redhat.com 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 mtosa...@redhat.com 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.gamal...@gmail.com --- 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.51: 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
Re: [PATCH] test: Add emulator test for iret instruction
On Thu, Jul 29, 2010 at 02:18:20AM +0300, Mohammed Gamal wrote: 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. Doh, right. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] test: Add emulator test for iret instruction
This adds a unit test for real mode emulation of the iret instruction Signed-off-by: Mohammed Gamal m.gamal...@gmail.com --- kvm/test/x86/realmode.c | 23 +++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/kvm/test/x86/realmode.c b/kvm/test/x86/realmode.c index bd79348..564116a 100644 --- a/kvm/test/x86/realmode.c +++ b/kvm/test/x86/realmode.c @@ -865,6 +865,28 @@ void test_pusha_popa() print_serial(Pusha/Popa Test2: PASS\n); } +void test_iret() +{ + struct regs inregs = { 0 }, outregs; + + MK_INSN(iret, 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 +); + + exec_in_big_real_mode(inregs, outregs, + insn_iret, + insn_iret_end - insn_iret); + + if (!regs_equal(inregs, outregs, R_AX)) + print_serial(iret Test 1: FAIL\n); + else + print_serial(iret Test 1: PASS\n); +} + void realmode_start(void) { test_null(); @@ -886,6 +908,7 @@ void realmode_start(void) /* long jmp test uses call near so test it after testing call */ test_long_jmp(); test_xchg(); + test_iret(); exit(0); } -- 1.7.0.4 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] test: Add emulator test for iret instruction
This adds a unit test for real mode emulation of the iret instruction Signed-off-by: Mohammed Gamal m.gamal...@gmail.com --- kvm/test/x86/realmode.c | 23 +++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/kvm/test/x86/realmode.c b/kvm/test/x86/realmode.c index bd79348..16716cc 100644 --- a/kvm/test/x86/realmode.c +++ b/kvm/test/x86/realmode.c @@ -865,6 +865,28 @@ void test_pusha_popa() print_serial(Pusha/Popa Test2: PASS\n); } +void test_iret() +{ + struct regs inregs = { 0 }, outregs; + + MK_INSN(iret, 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 +); + + exec_in_big_real_mode(inregs, outregs, + insn_iret, + insn_iret_end - insn_iret); + + if (!regs_equal(inregs, outregs, 0)) + print_serial(iret Test 1: FAIL\n); + else + print_serial(iret Test 1: PASS\n); +} + void realmode_start(void) { test_null(); @@ -886,6 +908,7 @@ void realmode_start(void) /* long jmp test uses call near so test it after testing call */ test_long_jmp(); test_xchg(); + test_iret(); exit(0); } -- 1.7.0.4 -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On 07/28/2010 02:22 AM, Mohammed Gamal wrote: This adds a unit test for real mode emulation of the iret instruction Signed-off-by: Mohammed Gamalm.gamal...@gmail.com --- kvm/test/x86/realmode.c | 23 +++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/kvm/test/x86/realmode.c b/kvm/test/x86/realmode.c index bd79348..16716cc 100644 --- a/kvm/test/x86/realmode.c +++ b/kvm/test/x86/realmode.c @@ -865,6 +865,28 @@ void test_pusha_popa() print_serial(Pusha/Popa Test2: PASS\n); } +void test_iret() +{ + struct regs inregs = { 0 }, outregs; + + MK_INSN(iret, 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 +); + + exec_in_big_real_mode(inregs,outregs, + insn_iret, + insn_iret_end - insn_iret); + + if (!regs_equal(inregs,outregs, 0)) + print_serial(iret Test 1: FAIL\n); + else + print_serial(iret Test 1: PASS\n); +} + This tests 32-bit iret, please test 16-bit iret as well (pushfw, pushw cs, callw, iretw). -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] test: Add emulator test for iret instruction
On 07/28/2010 07:21 AM, Avi Kivity wrote: On 07/28/2010 02:22 AM, Mohammed Gamal wrote: This adds a unit test for real mode emulation of the iret instruction Signed-off-by: Mohammed Gamalm.gamal...@gmail.com --- kvm/test/x86/realmode.c | 23 +++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/kvm/test/x86/realmode.c b/kvm/test/x86/realmode.c index bd79348..16716cc 100644 --- a/kvm/test/x86/realmode.c +++ b/kvm/test/x86/realmode.c @@ -865,6 +865,28 @@ void test_pusha_popa() print_serial(Pusha/Popa Test2: PASS\n); } +void test_iret() +{ +struct regs inregs = { 0 }, outregs; + +MK_INSN(iret, 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 + ); + +exec_in_big_real_mode(inregs,outregs, + insn_iret, + insn_iret_end - insn_iret); + +if (!regs_equal(inregs,outregs, 0)) +print_serial(iret Test 1: FAIL\n); +else +print_serial(iret Test 1: PASS\n); +} + This tests 32-bit iret, please test 16-bit iret as well (pushfw, pushw cs, callw, iretw). Also add tests that set bits that must be zero (and checks that IRET clears them in eflags) or clears bit 1 and sees that IRET sets it. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html