Re: [Patch] (big) real mode emulation - jmp rel

Nitin A Kamble
2007-08-16T23:54:22Z

[-- Attachment #1.1.1: Type: text/plain, Size: 574 bytes --]

Hi Avi,
If you are fine with macro then attached are the updated patches for
"jmp rel" & "jmp rel short" instruction emulation.

On Thu, 2007-08-16 at 13:34 -0700, Nitin A Kamble wrote:
> Avi,
> In my opinion converting this small function to file-scope function,
> would make code look ugly. I think the earlier Macro definition was
> better.

--
Thanks & Regards,
Nitin
Open Source Technology Center, Intel Corporation
-----------------------------------------------------------------
The mind is like a parachute; it works much better when it's open

[-- Attachment #1.1.2: jmprel_2.patch --]
[-- Type: text/x-patch, Size: 1540 bytes --]

commit 38177680ad53b330d0f8b4fcec20953a7a7dfa2d
Author: Nitin A Kamble <nitin.a.kamble@intel.com>
Date: Thu Aug 16 19:10:14 2007 -0700

Implement instruction "jmp rel" opcode 0xe9

Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>

diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c
index b4f439c..6519cf9 100644
--- a/drivers/kvm/x86_emulate.c
+++ b/drivers/kvm/x86_emulate.c
@@ -145,8 +145,10 @@ static u8 opcode_table[256] = {
0, 0, 0, 0,
/* 0xD8 - 0xDF */
0, 0, 0, 0, 0, 0, 0, 0,
- /* 0xE0 - 0xEF */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xE0 - 0xE7 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xE8 - 0xEF */
+ 0, SrcImm|ImplicitOps, 0, 0, 0, 0, 0, 0,
/* 0xF0 - 0xF7 */
0, 0, 0, 0,
ImplicitOps, 0,
@@ -447,6 +449,12 @@ struct operand {
(((reg) + _inc) & ((1UL << (ad_bytes << 3)) - 1)); \
} while (0)

+#define jmp_rel(rel) \
+ do { \
+ _eip += (int)(rel); \
+ _eip = ((op_bytes == 2) ? (uint16_t)_eip : (uint32_t)_eip); \
+ } while (0)
+
/*
* Given the 'reg' portion of a ModRM byte, and a register block, return a
* pointer into the block that addresses the relevant register.
@@ -1200,6 +1208,10 @@ special_insn:
case 0xae ... 0xaf: /* scas */
DPRINTF("Urk! I don't handle SCAS.\n");
goto cannot_emulate;
+ case 0xe9: /* jmp rel */
+ jmp_rel(src.val);
+ no_wb = 1; /* Disable writeback. */
+ break;
case 0xf4: /* hlt */
ctxt->vcpu->halt_request = 1;
goto done;

[-- Attachment #1.1.3: jmp_rel_short.patch --]
[-- Type: text/x-patch, Size: 971 bytes --]

commit 38f7db6830c862cd0470aaa07cabe616ff741d69
Author: Nitin A Kamble <nitin.a.kamble@intel.com>
Date: Fri Aug 10 18:48:05 2007 -0700

Implement "jmp rel short" opcode: 0xeb

Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>

diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c
index 40fb6ee..16ea385 100644
--- a/drivers/kvm/x86_emulate.c
+++ b/drivers/kvm/x86_emulate.c
@@ -148,7 +148,7 @@ static u8 opcode_table[256] = {
/* 0xE0 - 0xE7 */
0, 0, 0, 0, 0, 0, 0, 0,
/* 0xE8 - 0xEF */
- 0, SrcImm|ImplicitOps, 0, 0, 0, 0, 0, 0,
+ 0, SrcImm|ImplicitOps, 0, SrcImmByte|ImplicitOps, 0, 0, 0, 0,
/* 0xF0 - 0xF7 */
0, 0, 0, 0,
ImplicitOps, 0,
@@ -1208,6 +1208,7 @@ special_insn:
case 0xae ... 0xaf: /* scas */
DPRINTF("Urk! I don't handle SCAS.\n");
goto cannot_emulate;
+ case 0xeb: /* jmp rel short */
case 0xe9: /* jmp rel */
jmp_rel(src.val);
no_wb = 1; /* Disable writeback. */