12 #ifndef _ASM_X86_KVM_X86_EMULATE_H
13 #define _ASM_X86_KVM_X86_EMULATE_H
15 #include <asm/desc_defs.h>
81 #define X86EMUL_CONTINUE 0
83 #define X86EMUL_UNHANDLEABLE 1
85 #define X86EMUL_PROPAGATE_FAULT 2
86 #define X86EMUL_RETRY_INSTR 3
87 #define X86EMUL_CMPXCHG_FAILED 4
88 #define X86EMUL_IO_NEEDED 5
89 #define X86EMUL_INTERCEPTED 6
92 #define X86EMUL_F_WRITE BIT(0)
93 #define X86EMUL_F_FETCH BIT(1)
94 #define X86EMUL_F_IMPLICIT BIT(2)
95 #define X86EMUL_F_INVLPG BIT(3)
121 unsigned long addr,
void *val,
134 unsigned long addr,
void *val,
unsigned int bytes,
144 unsigned long addr,
void *val,
unsigned int bytes,
154 unsigned long addr,
void *val,
unsigned int bytes,
165 unsigned long addr,
const void *val,
186 int size,
unsigned short port,
void *val,
190 int size,
unsigned short port,
const void *val,
194 struct desc_struct *desc, u32 *base3,
int seg);
196 struct desc_struct *desc, u32 base3,
int seg);
221 u32 *ecx, u32 *edx,
bool exact_only);
249 struct segmented_address {
302 #define NR_EMULATOR_GPRS 16
304 #define NR_EMULATOR_GPRS 8
377 #define KVM_EMULATOR_BUG_ON(cond, ctxt) \
379 int __ret = (cond); \
381 if (WARN_ON_ONCE(__ret)) \
382 ctxt->ops->vm_bugged(ctxt); \
387 #define REPE_PREFIX 0xf3
388 #define REPNE_PREFIX 0xf2
391 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
392 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
393 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
395 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
396 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
397 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
399 #define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx 0x6f677948
400 #define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx 0x656e6975
401 #define X86EMUL_CPUID_VENDOR_HygonGenuine_edx 0x6e65476e
403 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
404 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
405 #define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
407 #define X86EMUL_CPUID_VENDOR_CentaurHauls_ebx 0x746e6543
408 #define X86EMUL_CPUID_VENDOR_CentaurHauls_ecx 0x736c7561
409 #define X86EMUL_CPUID_VENDOR_CentaurHauls_edx 0x48727561
497 #if defined(CONFIG_X86_32)
498 #define X86EMUL_MODE_HOST X86EMUL_MODE_PROT32
499 #elif defined(CONFIG_X86_64)
500 #define X86EMUL_MODE_HOST X86EMUL_MODE_PROT64
505 #define EMULATION_FAILED -1
506 #define EMULATION_OK 0
507 #define EMULATION_RESTART 1
508 #define EMULATION_INTERCEPTED 2
512 u16 tss_selector,
int idt_index,
int reason,
513 bool has_error_code, u32 error_code);
528 return ctxt->
_regs[nr];
541 return &ctxt->
_regs[nr];
static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop)
int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
static bool is_guest_vendor_hygon(u32 ebx, u32 ecx, u32 edx)
#define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx
#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx
void(* fastop_t)(struct fastop *)
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx
static bool is_guest_vendor_intel(u32 ebx, u32 ecx, u32 edx)
static ulong * reg_write(struct x86_emulate_ctxt *ctxt, unsigned nr)
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx
void emulator_invalidate_register_cache(struct x86_emulate_ctxt *ctxt)
#define KVM_EMULATOR_BUG_ON(cond, ctxt)
void init_decode_cache(struct x86_emulate_ctxt *ctxt)
static ulong reg_read(struct x86_emulate_ctxt *ctxt, unsigned nr)
#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx
#define X86EMUL_CPUID_VENDOR_HygonGenuine_edx
static bool is_guest_vendor_amd(u32 ebx, u32 ecx, u32 edx)
#define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx
#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx
int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq)
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx
int emulator_task_switch(struct x86_emulate_ctxt *ctxt, u16 tss_selector, int idt_index, int reason, bool has_error_code, u32 error_code)
static ulong * reg_rmw(struct x86_emulate_ctxt *ctxt, unsigned nr)
@ X86_ICPT_POST_MEMACCESS
void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt)
bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt)
int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int emulation_type)
bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt)
char valptr[sizeof(sse128_t)]
struct operand::@4::segmented_address mem
int(* check_perm)(struct x86_emulate_ctxt *ctxt)
struct read_cache io_read
const struct x86_emulate_ops * ops
struct x86_exception exception
struct read_cache mem_read
unsigned long _regs[NR_EMULATOR_GPRS]
int(* execute)(struct x86_emulate_ctxt *ctxt)
void(* halt)(struct x86_emulate_ctxt *ctxt)
int(* set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value)
bool(* guest_has_rdpid)(struct x86_emulate_ctxt *ctxt)
ulong(* get_cr)(struct x86_emulate_ctxt *ctxt, int cr)
ulong(* read_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg)
int(* cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, const void *old, const void *new, unsigned int bytes, struct x86_exception *fault)
void(* get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest)
int(* cpl)(struct x86_emulate_ctxt *ctxt)
unsigned long(* get_cached_segment_base)(struct x86_emulate_ctxt *ctxt, int seg)
int(* leave_smm)(struct x86_emulate_ctxt *ctxt)
void(* triple_fault)(struct x86_emulate_ctxt *ctxt)
bool(* is_smm)(struct x86_emulate_ctxt *ctxt)
void(* set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked)
int(* pio_out_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, const void *val, unsigned int count)
int(* get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata)
void(* write_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val)
int(* pio_in_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, void *val, unsigned int count)
int(* write_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, const void *val, unsigned int bytes, struct x86_exception *fault)
int(* set_xcr)(struct x86_emulate_ctxt *ctxt, u32 index, u64 xcr)
int(* get_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata)
bool(* guest_has_movbe)(struct x86_emulate_ctxt *ctxt)
void(* get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
bool(* is_guest_mode)(struct x86_emulate_ctxt *ctxt)
void(* set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
void(* set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector, struct desc_struct *desc, u32 base3, int seg)
bool(* get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector, struct desc_struct *desc, u32 *base3, int seg)
void(* set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
gva_t(* get_untagged_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr, unsigned int flags)
int(* fix_hypercall)(struct x86_emulate_ctxt *ctxt)
int(* intercept)(struct x86_emulate_ctxt *ctxt, struct x86_instruction_info *info, enum x86_intercept_stage stage)
int(* read_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault)
int(* fetch)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault)
int(* read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata)
void(* wbinvd)(struct x86_emulate_ctxt *ctxt)
int(* read_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault, bool system)
int(* write_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault, bool system)
bool(* get_cpuid)(struct x86_emulate_ctxt *ctxt, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx, bool exact_only)
int(* check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc)
int(* set_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data)
int(* set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val)
bool(* guest_has_fxsr)(struct x86_emulate_ctxt *ctxt)
void(* invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr)
void(* vm_bugged)(struct x86_emulate_ctxt *ctxt)
void(* get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)