i386: hvf: Use IP from CPUX86State
Drop and replace rip field from HVFX86EmulatorState in favor of eip from common CPUX86State. Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com> Message-Id: <20200528193758.51454-7-r.bolshakov@yadro.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
81ae3d0216
commit
5d32173fc3
@ -797,7 +797,7 @@ int hvf_vcpu_exec(CPUState *cpu)
|
||||
} else {
|
||||
RAX(env) = (uint64_t)val;
|
||||
}
|
||||
RIP(env) += ins_len;
|
||||
env->eip += ins_len;
|
||||
store_regs(cpu);
|
||||
break;
|
||||
} else if (!string && !in) {
|
||||
@ -871,7 +871,7 @@ int hvf_vcpu_exec(CPUState *cpu)
|
||||
} else {
|
||||
simulate_wrmsr(cpu);
|
||||
}
|
||||
RIP(env) += ins_len;
|
||||
env->eip += ins_len;
|
||||
store_regs(cpu);
|
||||
break;
|
||||
}
|
||||
@ -907,7 +907,7 @@ int hvf_vcpu_exec(CPUState *cpu)
|
||||
error_report("Unrecognized CR %d", cr);
|
||||
abort();
|
||||
}
|
||||
RIP(env) += ins_len;
|
||||
env->eip += ins_len;
|
||||
store_regs(cpu);
|
||||
break;
|
||||
}
|
||||
|
@ -294,7 +294,6 @@ typedef struct lazy_flags {
|
||||
/* Definition of hvf_x86_state is here */
|
||||
struct HVFX86EmulatorState {
|
||||
uint64_t fetch_rip;
|
||||
uint64_t rip;
|
||||
struct x86_register regs[16];
|
||||
struct x86_reg_flags rflags;
|
||||
struct lazy_flags lflags;
|
||||
@ -302,8 +301,6 @@ struct HVFX86EmulatorState {
|
||||
};
|
||||
|
||||
/* useful register access macros */
|
||||
#define RIP(cpu) (cpu->hvf_emul->rip)
|
||||
#define EIP(cpu) ((uint32_t)cpu->hvf_emul->rip)
|
||||
#define RFLAGS(cpu) (cpu->hvf_emul->rflags.rflags)
|
||||
#define EFLAGS(cpu) (cpu->hvf_emul->rflags.eflags)
|
||||
|
||||
|
@ -75,7 +75,7 @@ static inline uint64_t decode_bytes(CPUX86State *env, struct x86_decode *decode,
|
||||
VM_PANIC_EX("%s invalid size %d\n", __func__, size);
|
||||
break;
|
||||
}
|
||||
target_ulong va = linear_rip(env_cpu(env), RIP(env)) + decode->len;
|
||||
target_ulong va = linear_rip(env_cpu(env), env->eip) + decode->len;
|
||||
vmx_read_mem(env_cpu(env), &val, va, size);
|
||||
decode->len += size;
|
||||
|
||||
@ -1771,7 +1771,7 @@ void calc_modrm_operand32(CPUX86State *env, struct x86_decode *decode,
|
||||
ptr += get_sib_val(env, decode, &seg);
|
||||
} else if (!decode->modrm.mod && 5 == decode->modrm.rm) {
|
||||
if (x86_is_long_mode(env_cpu(env))) {
|
||||
ptr += RIP(env) + decode->len;
|
||||
ptr += env->eip + decode->len;
|
||||
} else {
|
||||
ptr = decode->displacement;
|
||||
}
|
||||
@ -1807,7 +1807,7 @@ void calc_modrm_operand64(CPUX86State *env, struct x86_decode *decode,
|
||||
if (4 == rm) {
|
||||
ptr = get_sib_val(env, decode, &seg) + offset;
|
||||
} else if (0 == mod && 5 == rm) {
|
||||
ptr = RIP(env) + decode->len + (int32_t) offset;
|
||||
ptr = env->eip + decode->len + (int32_t) offset;
|
||||
} else {
|
||||
ptr = get_reg_val(env, src, decode->rex.rex, decode->rex.b, 8) +
|
||||
(int64_t) offset;
|
||||
|
@ -267,49 +267,49 @@ static void exec_mov(struct CPUX86State *env, struct x86_decode *decode)
|
||||
write_val_ext(env, decode->op[0].ptr, decode->op[1].val,
|
||||
decode->operand_size);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_add(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, +, SET_FLAGS_OSZAPC_ADD, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_or(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, |, SET_FLAGS_OSZAPC_LOGIC, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_adc(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, +get_CF(env)+, SET_FLAGS_OSZAPC_ADD, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_sbb(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, -get_CF(env)-, SET_FLAGS_OSZAPC_SUB, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_and(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_sub(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_xor(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, ^, SET_FLAGS_OSZAPC_LOGIC, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_neg(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -332,13 +332,13 @@ static void exec_neg(struct CPUX86State *env, struct x86_decode *decode)
|
||||
}
|
||||
|
||||
/*lflags_to_rflags(env);*/
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_cmp(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_inc(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -348,7 +348,7 @@ static void exec_inc(struct CPUX86State *env, struct x86_decode *decode)
|
||||
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, +1+, SET_FLAGS_OSZAP_ADD, true);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_dec(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -357,13 +357,13 @@ static void exec_dec(struct CPUX86State *env, struct x86_decode *decode)
|
||||
decode->op[1].val = 0;
|
||||
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, -1-, SET_FLAGS_OSZAP_SUB, true);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_tst(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, false);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_not(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -372,7 +372,7 @@ static void exec_not(struct CPUX86State *env, struct x86_decode *decode)
|
||||
|
||||
write_val_ext(env, decode->op[0].ptr, ~decode->op[0].val,
|
||||
decode->operand_size);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_movzx(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -392,7 +392,7 @@ void exec_movzx(struct CPUX86State *env, struct x86_decode *decode)
|
||||
decode->op[1].val = read_val_ext(env, decode->op[1].ptr, src_op_size);
|
||||
write_val_ext(env, decode->op[0].ptr, decode->op[1].val, op_size);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_out(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -416,7 +416,7 @@ static void exec_out(struct CPUX86State *env, struct x86_decode *decode)
|
||||
VM_PANIC("Bad out opcode\n");
|
||||
break;
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_in(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -452,7 +452,7 @@ static void exec_in(struct CPUX86State *env, struct x86_decode *decode)
|
||||
break;
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static inline void string_increment_reg(struct CPUX86State *env, int reg,
|
||||
@ -505,7 +505,7 @@ static void exec_ins(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_ins_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_outs_single(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -528,7 +528,7 @@ static void exec_outs(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_outs_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_movs_single(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -556,7 +556,7 @@ static void exec_movs(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_movs_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_cmps_single(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -586,7 +586,7 @@ static void exec_cmps(struct CPUX86State *env, struct x86_decode *decode)
|
||||
} else {
|
||||
exec_cmps_single(env, decode);
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
|
||||
@ -612,7 +612,7 @@ static void exec_stos(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_stos_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_scas_single(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -638,7 +638,7 @@ static void exec_scas(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_scas_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_lods_single(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -661,7 +661,7 @@ static void exec_lods(struct CPUX86State *env, struct x86_decode *decode)
|
||||
exec_lods_single(env, decode);
|
||||
}
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void simulate_rdmsr(struct CPUState *cpu)
|
||||
@ -758,7 +758,7 @@ void simulate_rdmsr(struct CPUState *cpu)
|
||||
static void exec_rdmsr(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
simulate_rdmsr(env_cpu(env));
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void simulate_wrmsr(struct CPUState *cpu)
|
||||
@ -853,7 +853,7 @@ void simulate_wrmsr(struct CPUState *cpu)
|
||||
static void exec_wrmsr(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
simulate_wrmsr(env_cpu(env));
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -909,25 +909,25 @@ static void do_bt(struct CPUX86State *env, struct x86_decode *decode, int flag)
|
||||
static void exec_bt(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
do_bt(env, decode, 0);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_btc(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
do_bt(env, decode, 1);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_btr(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
do_bt(env, decode, 3);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_bts(struct CPUX86State *env, struct x86_decode *decode)
|
||||
{
|
||||
do_bt(env, decode, 2);
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_shl(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -991,7 +991,7 @@ void exec_shl(struct CPUX86State *env, struct x86_decode *decode)
|
||||
|
||||
exit:
|
||||
/* lflags_to_rflags(env); */
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_movsx(CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1014,7 +1014,7 @@ void exec_movsx(CPUX86State *env, struct x86_decode *decode)
|
||||
|
||||
write_val_ext(env, decode->op[0].ptr, decode->op[1].val, op_size);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_ror(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1092,7 +1092,7 @@ void exec_ror(struct CPUX86State *env, struct x86_decode *decode)
|
||||
break;
|
||||
}
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_rol(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1173,7 +1173,7 @@ void exec_rol(struct CPUX86State *env, struct x86_decode *decode)
|
||||
break;
|
||||
}
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
|
||||
@ -1259,7 +1259,7 @@ void exec_rcl(struct CPUX86State *env, struct x86_decode *decode)
|
||||
break;
|
||||
}
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
void exec_rcr(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1334,7 +1334,7 @@ void exec_rcr(struct CPUX86State *env, struct x86_decode *decode)
|
||||
break;
|
||||
}
|
||||
}
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_xchg(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1346,7 +1346,7 @@ static void exec_xchg(struct CPUX86State *env, struct x86_decode *decode)
|
||||
write_val_ext(env, decode->op[1].ptr, decode->op[0].val,
|
||||
decode->operand_size);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static void exec_xadd(struct CPUX86State *env, struct x86_decode *decode)
|
||||
@ -1355,7 +1355,7 @@ static void exec_xadd(struct CPUX86State *env, struct x86_decode *decode)
|
||||
write_val_ext(env, decode->op[1].ptr, decode->op[0].val,
|
||||
decode->operand_size);
|
||||
|
||||
RIP(env) += decode->len;
|
||||
env->eip += decode->len;
|
||||
}
|
||||
|
||||
static struct cmd_handler {
|
||||
@ -1434,7 +1434,7 @@ void load_regs(struct CPUState *cpu)
|
||||
|
||||
RFLAGS(env) = rreg(cpu->hvf_fd, HV_X86_RFLAGS);
|
||||
rflags_to_lflags(env);
|
||||
RIP(env) = rreg(cpu->hvf_fd, HV_X86_RIP);
|
||||
env->eip = rreg(cpu->hvf_fd, HV_X86_RIP);
|
||||
}
|
||||
|
||||
void store_regs(struct CPUState *cpu)
|
||||
@ -1457,20 +1457,20 @@ void store_regs(struct CPUState *cpu)
|
||||
|
||||
lflags_to_rflags(env);
|
||||
wreg(cpu->hvf_fd, HV_X86_RFLAGS, RFLAGS(env));
|
||||
macvm_set_rip(cpu, RIP(env));
|
||||
macvm_set_rip(cpu, env->eip);
|
||||
}
|
||||
|
||||
bool exec_instruction(struct CPUX86State *env, struct x86_decode *ins)
|
||||
{
|
||||
/*if (hvf_vcpu_id(cpu))
|
||||
printf("%d, %llx: exec_instruction %s\n", hvf_vcpu_id(cpu), RIP(cpu),
|
||||
printf("%d, %llx: exec_instruction %s\n", hvf_vcpu_id(cpu), env->eip,
|
||||
decode_cmd_to_string(ins->cmd));*/
|
||||
|
||||
if (!_cmd_handler[ins->cmd].handler) {
|
||||
printf("Unimplemented handler (%llx) for %d (%x %x) \n", RIP(env),
|
||||
printf("Unimplemented handler (%llx) for %d (%x %x) \n", env->eip,
|
||||
ins->cmd, ins->opcode[0],
|
||||
ins->opcode_len > 1 ? ins->opcode[1] : 0);
|
||||
RIP(env) += ins->len;
|
||||
env->eip += ins->len;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ static void save_state_to_tss32(CPUState *cpu, struct x86_tss_segment32 *tss)
|
||||
CPUX86State *env = &x86_cpu->env;
|
||||
|
||||
/* CR3 and ldt selector are not saved intentionally */
|
||||
tss->eip = EIP(env);
|
||||
tss->eip = (uint32_t)env->eip;
|
||||
tss->eflags = EFLAGS(env);
|
||||
tss->eax = EAX(env);
|
||||
tss->ecx = ECX(env);
|
||||
@ -64,7 +64,7 @@ static void load_state_from_tss32(CPUState *cpu, struct x86_tss_segment32 *tss)
|
||||
|
||||
wvmcs(cpu->hvf_fd, VMCS_GUEST_CR3, tss->cr3);
|
||||
|
||||
RIP(env) = tss->eip;
|
||||
env->eip = tss->eip;
|
||||
EFLAGS(env) = tss->eflags | 2;
|
||||
|
||||
/* General purpose registers */
|
||||
|
Loading…
Reference in New Issue
Block a user