diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-05-25 15:52:38 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-05-25 15:52:38 +0100 |
commit | ea1205fb4d8b7894aac6590ef17b59b778cd6b8b (patch) | |
tree | 680e88f524d5a9d40113bd09c897f262c44e1f62 /tools/tests | |
parent | 1ec81e8864eddcd8c2dd912d4375d6f781f2b7da (diff) | |
download | xen-ea1205fb4d8b7894aac6590ef17b59b778cd6b8b.tar.gz xen-ea1205fb4d8b7894aac6590ef17b59b778cd6b8b.tar.bz2 xen-ea1205fb4d8b7894aac6590ef17b59b778cd6b8b.zip |
Change the x86_emulate() interface to pack all context arguments
into a context structure. This context can then be handed to
callback operations.
Based on an original patch from Mats Petersson <mats.petersson@amd.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'tools/tests')
-rw-r--r-- | tools/tests/test_x86_emulator.c | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/tools/tests/test_x86_emulator.c b/tools/tests/test_x86_emulator.c index 46c98d1b1e..5fef349fab 100644 --- a/tools/tests/test_x86_emulator.c +++ b/tools/tests/test_x86_emulator.c @@ -17,7 +17,8 @@ typedef int64_t s64; static int read_any( unsigned long addr, unsigned long *val, - unsigned int bytes) + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) { switch ( bytes ) { @@ -32,7 +33,8 @@ static int read_any( static int write_any( unsigned long addr, unsigned long val, - unsigned int bytes) + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) { switch ( bytes ) { @@ -48,7 +50,8 @@ static int cmpxchg_any( unsigned long addr, unsigned long old, unsigned long new, - unsigned int bytes) + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) { switch ( bytes ) { @@ -65,34 +68,38 @@ static int cmpxchg8b_any( unsigned long old_lo, unsigned long old_hi, unsigned long new_lo, - unsigned long new_hi) + unsigned long new_hi, + struct x86_emulate_ctxt *ctxt) { ((unsigned long *)addr)[0] = new_lo; ((unsigned long *)addr)[1] = new_hi; return X86EMUL_CONTINUE; } -static struct x86_mem_emulator emulops = { +static struct x86_emulate_ops emulops = { read_any, write_any, read_any, write_any, cmpxchg_any, cmpxchg8b_any }; int main(int argc, char **argv) { + struct x86_emulate_ctxt ctxt; struct cpu_user_regs regs; char instr[20] = { 0x01, 0x08 }; /* add %ecx,(%eax) */ unsigned int res = 0x7FFFFFFF; u32 cmpxchg8b_res[2] = { 0x12345678, 0x87654321 }; - unsigned long cr2; int rc; + ctxt.regs = ®s; + ctxt.mode = X86EMUL_MODE_PROT32; + printf("%-40s", "Testing addl %%ecx,(%%eax)..."); instr[0] = 0x01; instr[1] = 0x08; regs.eflags = 0x200; regs.eip = (unsigned long)&instr[0]; regs.ecx = 0x12345678; - cr2 = (unsigned long)&res; + ctxt.cr2 = (unsigned long)&res; res = 0x7FFFFFFF; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x92345677) || (regs.eflags != 0xa94) || @@ -109,8 +116,8 @@ int main(int argc, char **argv) #else regs.ecx = 0x12345678UL; #endif - cr2 = (unsigned long)&res; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = (unsigned long)&res; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x92345677) || (regs.ecx != 0x8000000FUL) || @@ -124,8 +131,8 @@ int main(int argc, char **argv) regs.eip = (unsigned long)&instr[0]; regs.eax = 0x92345677UL; regs.ecx = 0xAA; - cr2 = (unsigned long)&res; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = (unsigned long)&res; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x923456AA) || (regs.eflags != 0x244) || @@ -140,8 +147,8 @@ int main(int argc, char **argv) regs.eip = (unsigned long)&instr[0]; regs.eax = 0xAABBCC77UL; regs.ecx = 0xFF; - cr2 = (unsigned long)&res; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = (unsigned long)&res; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x923456AA) || ((regs.eflags&0x240) != 0x200) || @@ -156,8 +163,8 @@ int main(int argc, char **argv) regs.eflags = 0x200; regs.eip = (unsigned long)&instr[0]; regs.ecx = 0x12345678; - cr2 = (unsigned long)&res; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = (unsigned long)&res; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x12345678) || (regs.eflags != 0x200) || @@ -173,8 +180,8 @@ int main(int argc, char **argv) regs.eip = (unsigned long)&instr[0]; regs.eax = 0x923456AAUL; regs.ecx = 0xDDEEFF00L; - cr2 = (unsigned long)&res; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = (unsigned long)&res; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0xDDEEFF00) || (regs.eflags != 0x244) || @@ -192,8 +199,8 @@ int main(int argc, char **argv) regs.esi = (unsigned long)&res + 0; regs.edi = (unsigned long)&res + 2; regs.error_code = 0; /* read fault */ - cr2 = regs.esi; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = regs.esi; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x44554455) || (regs.eflags != 0x200) || @@ -210,8 +217,8 @@ int main(int argc, char **argv) regs.eflags = 0x200; regs.eip = (unsigned long)&instr[0]; regs.edi = (unsigned long)&res; - cr2 = regs.edi; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = regs.edi; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x2233445D) || ((regs.eflags&0x201) != 0x201) || @@ -228,8 +235,8 @@ int main(int argc, char **argv) regs.ecx = 0xCCCCFFFF; regs.eip = (unsigned long)&instr[0]; regs.edi = (unsigned long)cmpxchg8b_res; - cr2 = regs.edi; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = regs.edi; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (cmpxchg8b_res[0] != 0x9999AAAA) || (cmpxchg8b_res[1] != 0xCCCCFFFF) || @@ -242,8 +249,8 @@ int main(int argc, char **argv) instr[0] = 0x0f; instr[1] = 0xc7; instr[2] = 0x0f; regs.eip = (unsigned long)&instr[0]; regs.edi = (unsigned long)cmpxchg8b_res; - cr2 = regs.edi; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + ctxt.cr2 = regs.edi; + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (cmpxchg8b_res[0] != 0x9999AAAA) || (cmpxchg8b_res[1] != 0xCCCCFFFF) || @@ -258,9 +265,9 @@ int main(int argc, char **argv) instr[0] = 0x0f; instr[1] = 0xbe; instr[2] = 0x08; regs.eip = (unsigned long)&instr[0]; regs.ecx = 0x12345678; - cr2 = (unsigned long)&res; + ctxt.cr2 = (unsigned long)&res; res = 0x82; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x82) || (regs.ecx != 0xFFFFFF82) || @@ -273,9 +280,9 @@ int main(int argc, char **argv) instr[0] = 0x0f; instr[1] = 0xb7; instr[2] = 0x08; regs.eip = (unsigned long)&instr[0]; regs.ecx = 0x12345678; - cr2 = (unsigned long)&res; + ctxt.cr2 = (unsigned long)&res; res = 0x1234aa82; - rc = x86_emulate_memop(®s, cr2, &emulops, X86EMUL_MODE_PROT32); + rc = x86_emulate_memop(&ctxt, &emulops); if ( (rc != 0) || (res != 0x1234aa82) || (regs.ecx != 0xaa82) || |