target/i386/hvf: introduce x86_emul_ops
This will be used to remove HVF specific code from the instruction emulator. For now we only introduce two hooks for x86_decode.c. More hooks will be added when the code is refactored. The emulator initialization function now takes in a pointer to the ops structure. Signed-off-by: Wei Liu <liuwe@linux.microsoft.com> Link: https://lore.kernel.org/r/1741377325-28175-2-git-send-email-liuwe@linux.microsoft.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
5dcdbd0712
commit
26a44d9d2d
3 changed files with 32 additions and 3 deletions
|
|
@ -229,6 +229,24 @@ hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range)
|
|||
return hv_vm_create(HV_VM_DEFAULT);
|
||||
}
|
||||
|
||||
static void hvf_read_segment_descriptor(CPUState *s, struct x86_segment_descriptor *desc,
|
||||
X86Seg seg)
|
||||
{
|
||||
struct vmx_segment vmx_segment;
|
||||
vmx_read_segment_descriptor(s, &vmx_segment, seg);
|
||||
vmx_segment_to_x86_descriptor(s, &vmx_segment, desc);
|
||||
}
|
||||
|
||||
static void hvf_read_mem(CPUState *cpu, void *data, target_ulong gva, int bytes)
|
||||
{
|
||||
vmx_read_mem(cpu, data, gva, bytes);
|
||||
}
|
||||
|
||||
static const struct x86_emul_ops hvf_x86_emul_ops = {
|
||||
.read_mem = hvf_read_mem,
|
||||
.read_segment_descriptor = hvf_read_segment_descriptor,
|
||||
};
|
||||
|
||||
int hvf_arch_init_vcpu(CPUState *cpu)
|
||||
{
|
||||
X86CPU *x86cpu = X86_CPU(cpu);
|
||||
|
|
@ -237,7 +255,7 @@ int hvf_arch_init_vcpu(CPUState *cpu)
|
|||
int r;
|
||||
uint64_t reqCap;
|
||||
|
||||
init_emu();
|
||||
init_emu(&hvf_x86_emul_ops);
|
||||
init_decoder();
|
||||
|
||||
if (hvf_state->hvf_caps == NULL) {
|
||||
|
|
|
|||
|
|
@ -1231,6 +1231,8 @@ static struct cmd_handler {
|
|||
|
||||
static struct cmd_handler _cmd_handler[X86_DECODE_CMD_LAST];
|
||||
|
||||
const struct x86_emul_ops *emul_ops;
|
||||
|
||||
static void init_cmd_handler(void)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -1253,7 +1255,8 @@ bool exec_instruction(CPUX86State *env, struct x86_decode *ins)
|
|||
return true;
|
||||
}
|
||||
|
||||
void init_emu(void)
|
||||
void init_emu(const struct x86_emul_ops *o)
|
||||
{
|
||||
emul_ops = o;
|
||||
init_cmd_handler();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,15 @@
|
|||
#include "x86_decode.h"
|
||||
#include "cpu.h"
|
||||
|
||||
void init_emu(void);
|
||||
struct x86_emul_ops {
|
||||
void (*read_mem)(CPUState *cpu, void *data, target_ulong addr, int bytes);
|
||||
void (*read_segment_descriptor)(CPUState *cpu, struct x86_segment_descriptor *desc,
|
||||
enum X86Seg seg);
|
||||
};
|
||||
|
||||
extern const struct x86_emul_ops *emul_ops;
|
||||
|
||||
void init_emu(const struct x86_emul_ops *ops);
|
||||
bool exec_instruction(CPUX86State *env, struct x86_decode *ins);
|
||||
void x86_emul_raise_exception(CPUX86State *env, int exception_index, int error_code);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue