* [PATCH] KVM: x86 emulator: add JrCXZ instruction emulation
@ 2010-08-19 6:25 Wei Yongjun
2010-08-19 6:28 ` [PATCH] Add realmode test for jcxz instruction Wei Yongjun
0 siblings, 1 reply; 7+ messages in thread
From: Wei Yongjun @ 2010-08-19 6:25 UTC (permalink / raw)
To: Avi Kivity, kvm
Add JrCXZ instruction emulation (opcode 0xe3)
Used by FreeBSD boot loader.
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index cbf6209..6ccc584 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2331,7 +2331,7 @@ static struct opcode opcode_table[256] = {
/* 0xD8 - 0xDF */
N, N, N, N, N, N, N, N,
/* 0xE0 - 0xE7 */
- X3(D(SrcImmByte)), N,
+ X4(D(SrcImmByte)),
D(ByteOp | SrcImmUByte | DstAcc), D(SrcImmUByte | DstAcc),
D(ByteOp | SrcAcc | DstImmUByte), D(SrcAcc | DstImmUByte),
/* 0xE8 - 0xEF */
@@ -3092,6 +3092,10 @@ special_insn:
(c->b == 0xe2 || test_cc(c->b ^ 0x5, ctxt->eflags)))
jmp_rel(c, c->src.val);
break;
+ case 0xe3: /* jcxz/jecxz/jrcxz */
+ if (address_mask(c, c->regs[VCPU_REGS_RCX]) == 0)
+ jmp_rel(c, c->src.val);
+ break;
case 0xe4: /* inb */
case 0xe5: /* in */
goto do_io_in;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH] Add realmode test for jcxz instruction
2010-08-19 6:25 [PATCH] KVM: x86 emulator: add JrCXZ instruction emulation Wei Yongjun
@ 2010-08-19 6:28 ` Wei Yongjun
2010-08-19 13:05 ` Avi Kivity
0 siblings, 1 reply; 7+ messages in thread
From: Wei Yongjun @ 2010-08-19 6:28 UTC (permalink / raw)
To: Avi Kivity, kvm
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
diff --git a/x86/realmode.c b/x86/realmode.c
index ce8fb18..0caf388 100644
--- a/x86/realmode.c
+++ b/x86/realmode.c
@@ -1262,6 +1262,32 @@ void test_cbw(void)
print_serial("cwde test 1: PASS\n");
}
+void test_jcxz(void)
+{
+ struct regs inregs = { 0 }, outregs;
+
+ MK_INSN(jcxz, "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jecxz, "jecxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jcxz, insn_jcxz_end - insn_jcxz);
+ if(!regs_equal(&inregs, &outregs, 0))
+ print_serial("JCXZ short Test 1: FAIL\n");
+ else
+ print_serial("JCXZ short Test 1: PASS\n");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jecxz, insn_jecxz_end - insn_jecxz);
+ if(!regs_equal(&inregs, &outregs, 0))
+ print_serial("JECXZ short Test 1: FAIL\n");
+ else
+ print_serial("JECXZ short Test 1: PASS\n");
+}
+
void realmode_start(void)
{
test_null();
@@ -1291,6 +1317,7 @@ void realmode_start(void)
test_idiv();
test_loopcc();
test_cbw();
+ test_jcxz();
exit(0);
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] Add realmode test for jcxz instruction
2010-08-19 6:28 ` [PATCH] Add realmode test for jcxz instruction Wei Yongjun
@ 2010-08-19 13:05 ` Avi Kivity
2010-08-20 0:52 ` [PATCH v2] " Wei Yongjun
0 siblings, 1 reply; 7+ messages in thread
From: Avi Kivity @ 2010-08-19 13:05 UTC (permalink / raw)
To: Wei Yongjun; +Cc: kvm
On 08/19/2010 09:28 AM, Wei Yongjun wrote:
> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
>
> diff --git a/x86/realmode.c b/x86/realmode.c
> index ce8fb18..0caf388 100644
> --- a/x86/realmode.c
> +++ b/x86/realmode.c
> @@ -1262,6 +1262,32 @@ void test_cbw(void)
> print_serial("cwde test 1: PASS\n");
> }
>
> +void test_jcxz(void)
> +{
> + struct regs inregs = { 0 }, outregs;
> +
> + MK_INSN(jcxz, "jcxz 1f\n\t"
> + "mov $0x1234, %eax\n\t"
> + "1:\n\t");
> + MK_INSN(jecxz, "jecxz 1f\n\t"
> + "mov $0x1234, %eax\n\t"
> + "1:\n\t");
> +
> + exec_in_big_real_mode(&inregs, &outregs,
> + insn_jcxz, insn_jcxz_end - insn_jcxz);
> + if(!regs_equal(&inregs, &outregs, 0))
> + print_serial("JCXZ short Test 1: FAIL\n");
> + else
> + print_serial("JCXZ short Test 1: PASS\n");
> +
> + exec_in_big_real_mode(&inregs, &outregs,
> + insn_jecxz, insn_jecxz_end - insn_jecxz);
> + if(!regs_equal(&inregs, &outregs, 0))
> + print_serial("JECXZ short Test 1: FAIL\n");
> + else
> + print_serial("JECXZ short Test 1: PASS\n");
> +}
> +
What about tests for jump-not-taken?
As a bonus, check jcxz with ecx=0x10000 and jecxz with ecx=0x10000.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] Add realmode test for jcxz instruction
2010-08-19 13:05 ` Avi Kivity
@ 2010-08-20 0:52 ` Wei Yongjun
2010-08-24 0:00 ` Marcelo Tosatti
0 siblings, 1 reply; 7+ messages in thread
From: Wei Yongjun @ 2010-08-20 0:52 UTC (permalink / raw)
To: Avi Kivity; +Cc: kvm
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
x86/realmode.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/x86/realmode.c b/x86/realmode.c
index ce8fb18..75d77bd 100644
--- a/x86/realmode.c
+++ b/x86/realmode.c
@@ -1262,6 +1262,67 @@ void test_cbw(void)
print_serial("cwde test 1: PASS\n");
}
+void test_jcxz(void)
+{
+ struct regs inregs = { 0 }, outregs;
+
+ MK_INSN(jcxz1, "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jcxz2, "mov $0x100, %ecx\n\t"
+ "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "mov $0, %ecx\n\t"
+ "1:\n\t");
+ MK_INSN(jcxz3, "mov $0x10000, %ecx\n\t"
+ "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jecxz1, "jecxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jecxz2, "mov $0x10000, %ecx\n\t"
+ "jecxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "mov $0, %ecx\n\t"
+ "1:\n\t");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jcxz1, insn_jcxz1_end - insn_jcxz1);
+ if(!regs_equal(&inregs, &outregs, 0))
+ print_serial("JCXZ short Test 1: FAIL\n");
+ else
+ print_serial("JCXZ short Test 1: PASS\n");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jcxz2, insn_jcxz2_end - insn_jcxz2);
+ if(!regs_equal(&inregs, &outregs, R_AX) || outregs.eax != 0x1234)
+ print_serial("JCXZ short Test 2: FAIL\n");
+ else
+ print_serial("JCXZ short Test 2: PASS\n");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jcxz3, insn_jcxz3_end - insn_jcxz3);
+ if(!regs_equal(&inregs, &outregs, R_CX) || outregs.ecx != 0x10000)
+ print_serial("JCXZ short Test 3: FAIL\n");
+ else
+ print_serial("JCXZ short Test 3: PASS\n");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jecxz1, insn_jecxz1_end - insn_jecxz1);
+ if(!regs_equal(&inregs, &outregs, 0))
+ print_serial("JECXZ short Test 1: FAIL\n");
+ else
+ print_serial("JECXZ short Test 1: PASS\n");
+
+ exec_in_big_real_mode(&inregs, &outregs,
+ insn_jecxz2, insn_jecxz2_end - insn_jecxz2);
+ if(!regs_equal(&inregs, &outregs, R_AX) || outregs.eax != 0x1234)
+ print_serial("JECXZ short Test 2: FAIL\n");
+ else
+ print_serial("JECXZ short Test 2: PASS\n");
+}
+
void realmode_start(void)
{
test_null();
@@ -1291,6 +1352,7 @@ void realmode_start(void)
test_idiv();
test_loopcc();
test_cbw();
+ test_jcxz();
exit(0);
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Add realmode test for jcxz instruction
2010-08-20 0:52 ` [PATCH v2] " Wei Yongjun
@ 2010-08-24 0:00 ` Marcelo Tosatti
2010-08-24 2:57 ` [PATCH v3] " Wei Yongjun
0 siblings, 1 reply; 7+ messages in thread
From: Marcelo Tosatti @ 2010-08-24 0:00 UTC (permalink / raw)
To: Wei Yongjun; +Cc: Avi Kivity, kvm
On Fri, Aug 20, 2010 at 08:52:56AM +0800, Wei Yongjun wrote:
> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
> ---
> x86/realmode.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 62 insertions(+), 0 deletions(-)
Please rebase.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3] Add realmode test for jcxz instruction
2010-08-24 0:00 ` Marcelo Tosatti
@ 2010-08-24 2:57 ` Wei Yongjun
2010-08-24 13:18 ` Marcelo Tosatti
0 siblings, 1 reply; 7+ messages in thread
From: Wei Yongjun @ 2010-08-24 2:57 UTC (permalink / raw)
To: Marcelo Tosatti; +Cc: Avi Kivity, kvm
Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
---
v2 -> v3: rebased
---
x86/realmode.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/x86/realmode.c b/x86/realmode.c
index 8c771fc..a833829 100644
--- a/x86/realmode.c
+++ b/x86/realmode.c
@@ -1242,6 +1242,47 @@ void test_lds_lss()
outregs.ebx == desc.sel);
}
+void test_jcxz(void)
+{
+ MK_INSN(jcxz1, "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jcxz2, "mov $0x100, %ecx\n\t"
+ "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "mov $0, %ecx\n\t"
+ "1:\n\t");
+ MK_INSN(jcxz3, "mov $0x10000, %ecx\n\t"
+ "jcxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jecxz1, "jecxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "1:\n\t");
+ MK_INSN(jecxz2, "mov $0x10000, %ecx\n\t"
+ "jecxz 1f\n\t"
+ "mov $0x1234, %eax\n\t"
+ "mov $0, %ecx\n\t"
+ "1:\n\t");
+
+ inregs = (struct regs){ 0 };
+
+ exec_in_big_real_mode(&insn_jcxz1);
+ report("jcxz short 1", 0, 1);
+
+ exec_in_big_real_mode(&insn_jcxz2);
+ report("jcxz short 2", R_AX, outregs.eax == 0x1234);
+
+ exec_in_big_real_mode(&insn_jcxz3);
+ report("jcxz short 3", R_CX, outregs.ecx == 0x10000);
+
+ exec_in_big_real_mode(&insn_jecxz1);
+ report("jecxz short 1", 0, 1);
+
+ exec_in_big_real_mode(&insn_jecxz2);
+ report("jecxz short 2", R_AX, outregs.eax == 0x1234);
+}
+
void realmode_start(void)
{
test_null();
@@ -1274,6 +1315,7 @@ void realmode_start(void)
test_cwd_cdq();
test_das();
test_lds_lss();
+ test_jcxz();
exit(0);
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3] Add realmode test for jcxz instruction
2010-08-24 2:57 ` [PATCH v3] " Wei Yongjun
@ 2010-08-24 13:18 ` Marcelo Tosatti
0 siblings, 0 replies; 7+ messages in thread
From: Marcelo Tosatti @ 2010-08-24 13:18 UTC (permalink / raw)
To: Wei Yongjun; +Cc: Avi Kivity, kvm
On Tue, Aug 24, 2010 at 10:57:12AM +0800, Wei Yongjun wrote:
> Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
> ---
> v2 -> v3: rebased
> ---
> x86/realmode.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 42 insertions(+), 0 deletions(-)
Applied, thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-08-24 14:35 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-19 6:25 [PATCH] KVM: x86 emulator: add JrCXZ instruction emulation Wei Yongjun
2010-08-19 6:28 ` [PATCH] Add realmode test for jcxz instruction Wei Yongjun
2010-08-19 13:05 ` Avi Kivity
2010-08-20 0:52 ` [PATCH v2] " Wei Yongjun
2010-08-24 0:00 ` Marcelo Tosatti
2010-08-24 2:57 ` [PATCH v3] " Wei Yongjun
2010-08-24 13:18 ` Marcelo Tosatti
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.