diff --git a/configure b/configure index 55d33b77ec..4c10a82af9 100755 --- a/configure +++ b/configure @@ -220,7 +220,7 @@ supported_hvf_target() { test "$hvf" = "yes" || return 1 glob "$1" "*-softmmu" || return 1 case "${1%-softmmu}" in - x86_64) + i386|x86_64) return 0 ;; esac diff --git a/target/i386/hvf/x86_decode.c b/target/i386/hvf/x86_decode.c index cbc5b5ac7c..3c517f1bb6 100644 --- a/target/i386/hvf/x86_decode.c +++ b/target/i386/hvf/x86_decode.c @@ -1687,9 +1687,9 @@ calc_addr: } } -target_ulong get_reg_ref(CPUX86State *env, int reg, int is_extended, int rex, int size) +uintptr_t get_reg_ref(CPUX86State *env, int reg, int is_extended, int rex, int size) { - target_ulong ptr = 0; + uintptr_t ptr = 0; int which = 0; if (is_extended) { @@ -1701,15 +1701,15 @@ target_ulong get_reg_ref(CPUX86State *env, int reg, int is_extended, int rex, in case 1: if (rex || is_extended || reg < 4) { which = 1; - ptr = (target_ulong)&RL(env, reg); + ptr = (uintptr_t)&RL(env, reg); } else { which = 2; - ptr = (target_ulong)&RH(env, reg - 4); + ptr = (uintptr_t)&RH(env, reg - 4); } break; default: which = 3; - ptr = (target_ulong)&RRX(env, reg); + ptr = (uintptr_t)&RRX(env, reg); break; } return ptr; diff --git a/target/i386/hvf/x86_decode.h b/target/i386/hvf/x86_decode.h index 7c5f6d13c2..8b8fd41589 100644 --- a/target/i386/hvf/x86_decode.h +++ b/target/i386/hvf/x86_decode.h @@ -266,7 +266,7 @@ typedef struct x86_decode_op { int reg; target_ulong val; - target_ulong ptr; + uintptr_t ptr; } x86_decode_op; typedef struct x86_decode { @@ -303,7 +303,7 @@ uint64_t sign(uint64_t val, int size); uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode); -target_ulong get_reg_ref(CPUX86State *env, int reg, int is_extended, int rex, int size); +uintptr_t get_reg_ref(CPUX86State *env, int reg, int is_extended, int rex, int size); target_ulong get_reg_val(CPUX86State *env, int reg, int is_extended, int rex, int size); void calc_modrm_operand(CPUX86State *env, struct x86_decode *decode, struct x86_decode_op *op); diff --git a/target/i386/hvf/x86_emu.c b/target/i386/hvf/x86_emu.c index 3ea18edc68..5785c24ed5 100644 --- a/target/i386/hvf/x86_emu.c +++ b/target/i386/hvf/x86_emu.c @@ -128,7 +128,7 @@ void write_reg(CPUX86State *env, int reg, target_ulong val, int size) } } -target_ulong read_val_from_reg(target_ulong reg_ptr, int size) +target_ulong read_val_from_reg(uintptr_t reg_ptr, int size) { target_ulong val; @@ -151,7 +151,7 @@ target_ulong read_val_from_reg(target_ulong reg_ptr, int size) return val; } -void write_val_to_reg(target_ulong reg_ptr, target_ulong val, int size) +void write_val_to_reg(uintptr_t reg_ptr, target_ulong val, int size) { switch (size) { case 1: @@ -171,12 +171,12 @@ void write_val_to_reg(target_ulong reg_ptr, target_ulong val, int size) } } -static bool is_host_reg(struct CPUX86State *env, target_ulong ptr) +static bool is_host_reg(struct CPUX86State *env, uintptr_t ptr) { return (ptr - (target_ulong)&env->hvf_emul->regs[0]) < sizeof(env->hvf_emul->regs); } -void write_val_ext(struct CPUX86State *env, target_ulong ptr, target_ulong val, int size) +void write_val_ext(struct CPUX86State *env, uintptr_t ptr, target_ulong val, int size) { if (is_host_reg(env, ptr)) { write_val_to_reg(ptr, val, size); @@ -192,7 +192,7 @@ uint8_t *read_mmio(struct CPUX86State *env, target_ulong ptr, int bytes) } -target_ulong read_val_ext(struct CPUX86State *env, target_ulong ptr, int size) +target_ulong read_val_ext(struct CPUX86State *env, uintptr_t ptr, int size) { target_ulong val; uint8_t *mmio_ptr; diff --git a/target/i386/hvf/x86_emu.h b/target/i386/hvf/x86_emu.h index fbb4832576..cdb3c46523 100644 --- a/target/i386/hvf/x86_emu.h +++ b/target/i386/hvf/x86_emu.h @@ -33,11 +33,11 @@ void simulate_wrmsr(struct CPUState *cpu); target_ulong read_reg(CPUX86State *env, int reg, int size); void write_reg(CPUX86State *env, int reg, target_ulong val, int size); -target_ulong read_val_from_reg(target_ulong reg_ptr, int size); -void write_val_to_reg(target_ulong reg_ptr, target_ulong val, int size); -void write_val_ext(struct CPUX86State *env, target_ulong ptr, target_ulong val, int size); +target_ulong read_val_from_reg(uintptr_t reg_ptr, int size); +void write_val_to_reg(uintptr_t reg_ptr, target_ulong val, int size); +void write_val_ext(struct CPUX86State *env, uintptr_t ptr, target_ulong val, int size); uint8_t *read_mmio(struct CPUX86State *env, target_ulong ptr, int bytes); -target_ulong read_val_ext(struct CPUX86State *env, target_ulong ptr, int size); +target_ulong read_val_ext(struct CPUX86State *env, uintptr_t ptr, int size); void exec_movzx(struct CPUX86State *env, struct x86_decode *decode); void exec_shl(struct CPUX86State *env, struct x86_decode *decode); diff --git a/target/i386/hvf/x86hvf.c b/target/i386/hvf/x86hvf.c index 6c88939b96..9f407344f9 100644 --- a/target/i386/hvf/x86hvf.c +++ b/target/i386/hvf/x86hvf.c @@ -258,6 +258,7 @@ int hvf_put_registers(CPUState *cpu_state) wreg(cpu_state->hvf_fd, HV_X86_RSP, env->regs[R_ESP]); wreg(cpu_state->hvf_fd, HV_X86_RSI, env->regs[R_ESI]); wreg(cpu_state->hvf_fd, HV_X86_RDI, env->regs[R_EDI]); +#ifdef TARGET_X86_64 wreg(cpu_state->hvf_fd, HV_X86_R8, env->regs[8]); wreg(cpu_state->hvf_fd, HV_X86_R9, env->regs[9]); wreg(cpu_state->hvf_fd, HV_X86_R10, env->regs[10]); @@ -266,6 +267,7 @@ int hvf_put_registers(CPUState *cpu_state) wreg(cpu_state->hvf_fd, HV_X86_R13, env->regs[13]); wreg(cpu_state->hvf_fd, HV_X86_R14, env->regs[14]); wreg(cpu_state->hvf_fd, HV_X86_R15, env->regs[15]); +#endif wreg(cpu_state->hvf_fd, HV_X86_RFLAGS, env->eflags); wreg(cpu_state->hvf_fd, HV_X86_RIP, env->eip); @@ -302,6 +304,7 @@ int hvf_get_registers(CPUState *cpu_state) env->regs[R_ESP] = rreg(cpu_state->hvf_fd, HV_X86_RSP); env->regs[R_ESI] = rreg(cpu_state->hvf_fd, HV_X86_RSI); env->regs[R_EDI] = rreg(cpu_state->hvf_fd, HV_X86_RDI); +#ifdef TARGET_X86_64 env->regs[8] = rreg(cpu_state->hvf_fd, HV_X86_R8); env->regs[9] = rreg(cpu_state->hvf_fd, HV_X86_R9); env->regs[10] = rreg(cpu_state->hvf_fd, HV_X86_R10); @@ -310,7 +313,8 @@ int hvf_get_registers(CPUState *cpu_state) env->regs[13] = rreg(cpu_state->hvf_fd, HV_X86_R13); env->regs[14] = rreg(cpu_state->hvf_fd, HV_X86_R14); env->regs[15] = rreg(cpu_state->hvf_fd, HV_X86_R15); - +#endif + env->eflags = rreg(cpu_state->hvf_fd, HV_X86_RFLAGS); env->eip = rreg(cpu_state->hvf_fd, HV_X86_RIP);