[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v9 12/13] test_x86_emulator.c: Add tests for #GP usage
Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx> --- tools/tests/x86_emulator/test_x86_emulator.c | 155 +++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c index 02a9f0a..985c80e 100644 --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -61,6 +61,16 @@ static int write( return X86EMUL_OKAY; } +static int write_gp( + unsigned int seg, + unsigned long offset, + void *p_data, + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) +{ + return X86EMUL_EXCEPTION; +} + static int cmpxchg( unsigned int seg, unsigned long offset, @@ -73,6 +83,17 @@ static int cmpxchg( return X86EMUL_OKAY; } +static int cmpxchg_gp( + unsigned int seg, + unsigned long offset, + void *old, + void *new, + unsigned int bytes, + struct x86_emulate_ctxt *ctxt) +{ + return X86EMUL_EXCEPTION; +} + static int cpuid( unsigned int *eax, unsigned int *ebx, @@ -156,6 +177,51 @@ int get_fpu( return X86EMUL_OKAY; } +static int read_io( + unsigned int port, + unsigned int bytes, + unsigned long *val, + struct x86_emulate_ctxt *ctxt) +{ + *val = 0xffffffff; + return X86EMUL_OKAY; +} + +static int write_io( + unsigned int port, + unsigned int bytes, + unsigned long val, + struct x86_emulate_ctxt *ctxt) +{ + return X86EMUL_OKAY; +} + +static int vmport_check( + unsigned int first_port, + struct x86_emulate_ctxt *ctxt) +{ + if ( first_port == 0x5658 ) + return 1; + else + return 0; +} + +static int read_segment( + enum x86_segment seg, + struct segment_register *reg, + struct x86_emulate_ctxt *ctxt) +{ + return X86EMUL_EXCEPTION; +} + +static int inject_hw_exception( + uint8_t vector, + int32_t error_code, + struct x86_emulate_ctxt *ctxt) +{ + return X86EMUL_EXCEPTION; +} + static struct x86_emulate_ops emulops = { .read = read, .insn_fetch = fetch, @@ -165,6 +231,18 @@ static struct x86_emulate_ops emulops = { .get_fpu = get_fpu, }; +static struct x86_emulate_ops emulops_gp = { + .read = read, + .insn_fetch = fetch, + .write = write_gp, + .cmpxchg = cmpxchg_gp, + .read_io = read_io, + .write_io = write_io, + .read_segment = read_segment, + .inject_hw_exception = inject_hw_exception, + .vmport_check = vmport_check, +}; + int main(int argc, char **argv) { struct x86_emulate_ctxt ctxt; @@ -930,6 +1008,83 @@ int main(int argc, char **argv) goto fail; printf("okay\n"); + for ( j = 0; j <= 1; j++ ) + { + regs.eflags = 0x20002; + regs.edx = 0x5658 + j; + printf("Testing %s dx=%x ... ", "in (%dx),%eax", (int)regs.edx); + instr[0] = 0xed; /* in (%dx),%eax or in (%dx),%ax */ + regs.eip = (unsigned long)&instr[0]; + regs.eax = 0x12345678; + rc = x86_emulate(&ctxt, &emulops_gp); + if ( rc != X86EMUL_OKAY ) + { + if ( j == 0 ) + goto fail; + } + else if ( j == 1 ) + goto fail; + if ( regs.eip != (unsigned long)&instr[1 - j] ) + goto fail; + if ( j == 0 && regs.eax == 0x12345678 ) + goto fail; + printf("okay\n"); + + printf("Testing %s dx=%x ... ", "in (%dx),%al", (int)regs.edx); + instr[0] = 0xec; /* in (%dx),%al */ + regs.eip = (unsigned long)&instr[0]; + regs.eax = 0x12345678; + rc = x86_emulate(&ctxt, &emulops_gp); + if ( rc != X86EMUL_OKAY ) + { + if ( j == 0 ) + goto fail; + } + else if ( j == 1 ) + goto fail; + if ( regs.eip != (unsigned long)&instr[1 - j] ) + goto fail; + if ( j == 0 && regs.eax == 0x12345678 ) + goto fail; + printf("okay\n"); + + printf("Testing %s dx=%x ... ", "out %eax,(%dx)", (int)regs.edx); + instr[0] = 0xef; /* out %eax,(%dx) or out %ax,(%dx) */ + regs.eip = (unsigned long)&instr[0]; + regs.eax = 0x12345678; + rc = x86_emulate(&ctxt, &emulops_gp); + if ( rc != X86EMUL_OKAY ) + { + if ( j == 0 ) + goto fail; + } + else if ( j == 1 ) + goto fail; + if ( regs.eip != (unsigned long)&instr[1 - j] ) + goto fail; + if ( regs.eax != 0x12345678 ) + goto fail; + printf("okay\n"); + + printf("Testing %s dx=%x ... ", "out %al,(%dx)", (int)regs.edx); + instr[0] = 0xee; /* out %al,(%dx) */ + regs.eip = (unsigned long)&instr[0]; + regs.eax = 0x12345678; + rc = x86_emulate(&ctxt, &emulops_gp); + if ( rc != X86EMUL_OKAY ) + { + if ( j == 0 ) + goto fail; + } + else if ( j == 1 ) + goto fail; + if ( regs.eip != (unsigned long)&instr[1 - j] ) + goto fail; + if ( regs.eax != 0x12345678 ) + goto fail; + printf("okay\n"); + } + return 0; fail: -- 1.8.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |