From 7f35916d3108dcf94de82f601d17f00d25b6d951 Mon Sep 17 00:00:00 2001 From: Diego Ongaro Date: Fri, 24 Apr 2009 18:20:41 -0500 Subject: [PATCH] mask repeat prefix out of insn prefix --- cr.c | 14 +++++--------- disasm.h | 6 ++++++ libkvm.c | 11 +++++++---- mmio.c | 22 ++++++++++++---------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/cr.c b/cr.c index 65490b1..30b8347 100644 --- a/cr.c +++ b/cr.c @@ -44,10 +44,6 @@ #include "disasm.h" #define reg_size() _reg_size(regs, sregs) -#define test_repeat_noop() _test_repeat_noop(insn->prefix == insn_rep_zero, \ - reg_size(), regs) -#define test_repeat_tail() _test_repeat_tail(insn->prefix == insn_rep_zero, \ - reg_size(), regs) static int emulate_cr_mov(kvm_context_t kvm, @@ -63,7 +59,7 @@ emulate_cr_mov(kvm_context_t kvm, x86_op_t *dest_op; x86_op_t *src_op; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 2); dest_op = x86_operand_1st(insn); @@ -86,7 +82,7 @@ emulate_cr_mov(kvm_context_t kvm, data = kvm_regs_get(regs, src_gp_num); data = mask_reg(data, dest_size); - + if (dest_op->data.reg.type != reg_sys) EXIT_ERR_PATH(); dest_cr_num = cr_num_from_x86_reg(dest_op->data.reg.id); @@ -142,7 +138,7 @@ emulate_cr_lmsw(kvm_context_t kvm, int src_gp_num; uint64_t data; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 1); src_op = x86_operand_1st(insn); @@ -178,7 +174,7 @@ emulate_cr_smsw(kvm_context_t kvm, uint64_t dest_data; uint64_t data; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 1); dest_op = x86_operand_1st(insn); @@ -219,7 +215,7 @@ emulate_cr_clts(kvm_context_t kvm, struct kvm_sregs *sregs, x86_insn_t *insn) { - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 0); sregs->cr0 &= ~0x4L; diff --git a/disasm.h b/disasm.h index 1001dd9..9249a51 100644 --- a/disasm.h +++ b/disasm.h @@ -2,6 +2,12 @@ #define DISASM_H #include +static inline int +get_repeat_prefix(x86_insn_t *insn) +{ + return (insn->prefix & 0x00F); +} + int kvm_reg_from_x86_reg(int x86_reg_id); diff --git a/libkvm.c b/libkvm.c index 98e49d3..170f0d7 100644 --- a/libkvm.c +++ b/libkvm.c @@ -29,8 +29,6 @@ #define FKVM_INTERNAL #include -#include "libkvm.h" -#include "libfkvm-common.h" #include #include #include @@ -41,6 +39,10 @@ #include #include +#include "libkvm.h" +#include "libfkvm-common.h" +#include "disasm.h" + static inline bool _is_valid_vcpu_slot(int slot, const char *func) { @@ -69,8 +71,10 @@ cpu_virtual_memory_rw(unsigned long gvaddr, gpaddr = kvm_get_phys_addr(gvaddr); if (gpaddr == -1) EXIT_ERR_PATH(); - + +#if 0 printf("guest virtual 0x%lx -> physical 0x%lx\n", gvaddr, gpaddr); +#endif cpu_physical_memory_rw(gpaddr, buf, on_this_page, is_write); @@ -655,7 +659,6 @@ kvm_run(kvm_context_t kvm, int vcpu) } case KVM_EXIT_EXCP: { - #include "disasm.h" struct kvm_regs regs; struct kvm_sregs sregs; x86_insn_t insn; diff --git a/mmio.c b/mmio.c index b3e8e9b..9fe8035 100644 --- a/mmio.c +++ b/mmio.c @@ -44,9 +44,9 @@ #include "disasm.h" #define reg_size() _reg_size(regs, sregs) -#define test_repeat_noop() _test_repeat_noop(insn->prefix == insn_rep_zero, \ +#define test_repeat_noop() _test_repeat_noop(get_repeat_prefix(insn) == insn_rep_zero, \ reg_size(), regs) -#define test_repeat_tail() _test_repeat_tail(insn->prefix == insn_rep_zero, \ +#define test_repeat_tail() _test_repeat_tail(get_repeat_prefix(insn) == insn_rep_zero, \ reg_size(), regs) static int @@ -101,7 +101,7 @@ emulate_mmio_cmp(kvm_context_t kvm, x86_op_t * dest_op; x86_op_t *src_op; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 2); dest_op = x86_operand_1st(insn); @@ -225,8 +225,8 @@ emulate_mmio_movs(kvm_context_t kvm, dest_op = x86_operand_1st(insn); src_op = x86_operand_2nd(insn); - assert(insn->prefix == insn_no_prefix || - insn->prefix == insn_rep_zero); + assert(get_repeat_prefix(insn) == insn_no_prefix || + get_repeat_prefix(insn) == insn_rep_zero); assert(insn->explicit_count == 2); assert(dest_op->data.expression.index.id == 0); @@ -382,8 +382,8 @@ emulate_mmio_stos(kvm_context_t kvm, assert(dest_size == src_size); - assert(insn->prefix == insn_no_prefix || - insn->prefix == insn_rep_zero); + assert(get_repeat_prefix(insn) == insn_no_prefix || + get_repeat_prefix(insn) == insn_rep_zero); if (test_repeat_noop()) return 0; @@ -443,7 +443,7 @@ emulate_mmio_mov(kvm_context_t kvm, x86_op_t *dest_op; x86_op_t *src_op; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 2); dest_op = x86_operand_1st(insn); @@ -503,8 +503,10 @@ emulate_mmio_mov(kvm_context_t kvm, source = kvm_get_phys_addr(source); - if (source != fault_addr) + if (source != fault_addr) { + printf("eax: 0x%" PRIx64 "\n", regs->rax); EXIT_ERR_PATH(); + } error = cb_mmio_read(kvm, source, data, src_size); if (error != 0) @@ -542,7 +544,7 @@ emulate_mmio_xchg(kvm_context_t kvm, uint64_t mem_data; int error; - assert(insn->prefix == insn_no_prefix); + assert(get_repeat_prefix(insn) == insn_no_prefix); assert(insn->explicit_count == 2); mem_op = x86_operand_1st(insn); -- 2.11.4.GIT