Blame view
arch/x86/kvm/kvm_emulate.h
17 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
6aa8b732c [PATCH] kvm: user... |
2 3 4 5 6 7 8 9 10 |
/****************************************************************************** * x86_emulate.h * * Generic x86 (32-bit and 64-bit) instruction decoder and emulator. * * Copyright (c) 2005 Keir Fraser * * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4 */ |
1965aae3c x86: Fix ASM_X86_... |
11 12 |
#ifndef _ASM_X86_KVM_X86_EMULATE_H #define _ASM_X86_KVM_X86_EMULATE_H |
6aa8b732c [PATCH] kvm: user... |
13 |
|
38ba30ba5 KVM: x86 emulator... |
14 |
#include <asm/desc_defs.h> |
6aa8b732c [PATCH] kvm: user... |
15 |
struct x86_emulate_ctxt; |
c4f035c60 KVM: x86 emulator... |
16 17 |
enum x86_intercept; enum x86_intercept_stage; |
6aa8b732c [PATCH] kvm: user... |
18 |
|
da9cb575b KVM: x86 emulator... |
19 20 21 22 |
struct x86_exception { u8 vector; bool error_code_valid; u16 error_code; |
6389ee946 KVM: Pull extra p... |
23 24 |
bool nested_page_fault; u64 address; /* cr2 or nested page fault gpa */ |
adfe20fb4 KVM: async_pf: Fo... |
25 |
u8 async_page_fault; |
da9cb575b KVM: x86 emulator... |
26 |
}; |
6aa8b732c [PATCH] kvm: user... |
27 |
/* |
8a76d7f25 KVM: x86: Add x86... |
28 29 30 31 32 33 34 35 36 37 38 |
* This struct is used to carry enough information from the instruction * decoder to main KVM so that a decision can be made whether the * instruction needs to be intercepted or not. */ struct x86_instruction_info { u8 intercept; /* which intercept */ u8 rep_prefix; /* rep prefix? */ u8 modrm_mod; /* mod part of modrm */ u8 modrm_reg; /* index of register used */ u8 modrm_rm; /* rm part of modrm */ u64 src_val; /* value of source operand */ |
6cbc5f5a8 KVM: nSVM: Set co... |
39 |
u64 dst_val; /* value of destination operand */ |
8a76d7f25 KVM: x86: Add x86... |
40 41 42 43 44 45 46 |
u8 src_bytes; /* size of source operand */ u8 dst_bytes; /* size of destination operand */ u8 ad_bytes; /* size of src/dst address */ u64 next_rip; /* rip following the instruction */ }; /* |
6aa8b732c [PATCH] kvm: user... |
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
* x86_emulate_ops: * * These operations represent the instruction emulator's interface to memory. * There are two categories of operation: those that act on ordinary memory * regions (*_std), and those that act on memory regions known to require * special treatment or emulation (*_emulated). * * The emulator assumes that an instruction accesses only one 'emulated memory' * location, that this location is the given linear faulting address (cr2), and * that this is one of the instruction's data operands. Instruction fetches and * stack operations are assumed never to access emulated memory. The emulator * automatically deduces which operand of a string-move operation is accessing * emulated memory, and assumes that the other operand accesses normal memory. * * NOTES: * 1. The emulator isn't very smart about emulated vs. standard memory. * 'Emulated memory' access addresses should be checked for sanity. * 'Normal memory' accesses may fault, and the caller must arrange to * detect and handle reentrancy into the emulator via recursive faults. * Accesses may be unaligned and may cross page boundaries. * 2. If the access fails (cannot emulate, or a standard access faults) then * it is up to the memop to propagate the fault to the guest VM via * some out-of-band mechanism, unknown to the emulator. The memop signals * failure by returning X86EMUL_PROPAGATE_FAULT to the emulator, which will * then immediately bail. * 3. Valid access sizes are 1, 2, 4 and 8 bytes. On x86/32 systems only * cmpxchg8b_emulated need support 8-byte accesses. * 4. The emulator cannot handle 64-bit mode emulation on an x86/32 system. */ /* Access completed successfully: continue emulation as normal. */ #define X86EMUL_CONTINUE 0 /* Access is unhandleable: bail from emulation and return error to caller. */ #define X86EMUL_UNHANDLEABLE 1 /* Terminate emulation but return success to the caller. */ #define X86EMUL_PROPAGATE_FAULT 2 /* propagate a generated fault to guest */ |
e680080e6 KVM: x86 emulator... |
82 83 |
#define X86EMUL_RETRY_INSTR 3 /* retry the instruction for some reason */ #define X86EMUL_CMPXCHG_FAILED 4 /* cmpxchg did not see expected value */ |
c3cd7ffaf KVM: x86 emulator... |
84 |
#define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */ |
c4f035c60 KVM: x86 emulator... |
85 |
#define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */ |
e680080e6 KVM: x86 emulator... |
86 |
|
6aa8b732c [PATCH] kvm: user... |
87 88 |
struct x86_emulate_ops { /* |
dd856efaf KVM: x86 emulator... |
89 90 91 92 93 94 95 96 97 98 99 100 101 |
* read_gpr: read a general purpose register (rax - r15) * * @reg: gpr number. */ ulong (*read_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg); /* * write_gpr: write a general purpose register (rax - r15) * * @reg: gpr number. * @val: value to write. */ void (*write_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val); /* |
6aa8b732c [PATCH] kvm: user... |
102 |
* read_std: Read bytes of standard (non-emulated/special) memory. |
1871c6020 KVM: x86 emulator... |
103 |
* Used for descriptor reading. |
6aa8b732c [PATCH] kvm: user... |
104 105 106 |
* @addr: [IN ] Linear address from which to read. * @val: [OUT] Value read from memory, zero-extended to 'u_long'. * @bytes: [IN ] Number of bytes to read from memory. |
3c9fa24ca kvm: x86: use cor... |
107 |
* @system:[IN ] Whether the access is forced to be at CPL0. |
6aa8b732c [PATCH] kvm: user... |
108 |
*/ |
0f65dd70a KVM: x86 emulator... |
109 110 111 |
int (*read_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, |
3c9fa24ca kvm: x86: use cor... |
112 |
struct x86_exception *fault, bool system); |
1871c6020 KVM: x86 emulator... |
113 114 |
/* |
7a036a6f6 KVM: x86: add rea... |
115 116 117 118 119 120 121 122 123 124 |
* read_phys: Read bytes of standard (non-emulated/special) memory. * Used for descriptor reading. * @addr: [IN ] Physical address from which to read. * @val: [OUT] Value read from memory. * @bytes: [IN ] Number of bytes to read from memory. */ int (*read_phys)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes); /* |
2dafc6c23 KVM: x86 emulator... |
125 126 127 128 129 |
* write_std: Write bytes of standard (non-emulated/special) memory. * Used for descriptor writing. * @addr: [IN ] Linear address to which to write. * @val: [OUT] Value write to memory, zero-extended to 'u_long'. * @bytes: [IN ] Number of bytes to write to memory. |
3c9fa24ca kvm: x86: use cor... |
130 |
* @system:[IN ] Whether the access is forced to be at CPL0. |
2dafc6c23 KVM: x86 emulator... |
131 |
*/ |
0f65dd70a KVM: x86 emulator... |
132 133 |
int (*write_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, |
3c9fa24ca kvm: x86: use cor... |
134 |
struct x86_exception *fault, bool system); |
2dafc6c23 KVM: x86 emulator... |
135 |
/* |
1871c6020 KVM: x86 emulator... |
136 137 138 139 140 141 |
* fetch: Read bytes of standard (non-emulated/special) memory. * Used for instruction fetch. * @addr: [IN ] Linear address from which to read. * @val: [OUT] Value read from memory, zero-extended to 'u_long'. * @bytes: [IN ] Number of bytes to read from memory. */ |
0f65dd70a KVM: x86 emulator... |
142 143 |
int (*fetch)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, |
bcc55cba9 KVM: x86 emulator... |
144 |
struct x86_exception *fault); |
6aa8b732c [PATCH] kvm: user... |
145 146 147 148 149 150 151 |
/* * read_emulated: Read bytes from emulated/special memory area. * @addr: [IN ] Linear address from which to read. * @val: [OUT] Value read from memory, zero-extended to 'u_long'. * @bytes: [IN ] Number of bytes to read from memory. */ |
0f65dd70a KVM: x86 emulator... |
152 153 154 |
int (*read_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault); |
6aa8b732c [PATCH] kvm: user... |
155 156 |
/* |
0d178975d KVM: Fix the expl... |
157 |
* write_emulated: Write bytes to emulated/special memory area. |
6aa8b732c [PATCH] kvm: user... |
158 159 160 161 162 |
* @addr: [IN ] Linear address to which to write. * @val: [IN ] Value to write to memory (low-order bytes used as * required). * @bytes: [IN ] Number of bytes to write to memory. */ |
0f65dd70a KVM: x86 emulator... |
163 164 |
int (*write_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, const void *val, |
0c7825e64 include/asm-x86/k... |
165 |
unsigned int bytes, |
0f65dd70a KVM: x86 emulator... |
166 |
struct x86_exception *fault); |
6aa8b732c [PATCH] kvm: user... |
167 168 169 170 171 172 173 174 175 |
/* * cmpxchg_emulated: Emulate an atomic (LOCKed) CMPXCHG operation on an * emulated/special memory area. * @addr: [IN ] Linear address to access. * @old: [IN ] Value expected to be current at @addr. * @new: [IN ] Value to write to @addr. * @bytes: [IN ] Number of bytes to access using CMPXCHG. */ |
0f65dd70a KVM: x86 emulator... |
176 177 |
int (*cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, |
0c7825e64 include/asm-x86/k... |
178 179 180 |
const void *old, const void *new, unsigned int bytes, |
0f65dd70a KVM: x86 emulator... |
181 |
struct x86_exception *fault); |
3cb16fe78 KVM: x86 emulator... |
182 |
void (*invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr); |
cf8f70bfe KVM: x86 emulator... |
183 |
|
ca1d4a9e7 KVM: x86 emulator... |
184 185 186 |
int (*pio_in_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, void *val, unsigned int count); |
cf8f70bfe KVM: x86 emulator... |
187 |
|
ca1d4a9e7 KVM: x86 emulator... |
188 189 190 |
int (*pio_out_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, const void *val, unsigned int count); |
cf8f70bfe KVM: x86 emulator... |
191 |
|
1aa366163 KVM: x86 emulator... |
192 193 194 195 |
bool (*get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector, struct desc_struct *desc, u32 *base3, int seg); void (*set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector, struct desc_struct *desc, u32 base3, int seg); |
4bff1e86a KVM: x86 emulator... |
196 197 198 199 |
unsigned long (*get_cached_segment_base)(struct x86_emulate_ctxt *ctxt, int seg); void (*get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt); void (*get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt); |
1ac9d0cfb KVM: x86 emulator... |
200 201 |
void (*set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt); void (*set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt); |
717746e38 KVM: x86 emulator... |
202 203 204 205 206 |
ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr); int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val); int (*cpl)(struct x86_emulate_ctxt *ctxt); int (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest); int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value); |
64d606705 KVM: x86: stubs f... |
207 208 |
u64 (*get_smbase)(struct x86_emulate_ctxt *ctxt); void (*set_smbase)(struct x86_emulate_ctxt *ctxt, u64 smbase); |
717746e38 KVM: x86 emulator... |
209 210 |
int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data); int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata); |
67f4d4288 KVM: x86: rdpmc e... |
211 |
int (*check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc); |
222d21aa0 KVM: x86 emulator... |
212 |
int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata); |
6c3287f7c KVM: x86 emulator... |
213 |
void (*halt)(struct x86_emulate_ctxt *ctxt); |
bcaf5cc54 KVM: x86 emulator... |
214 |
void (*wbinvd)(struct x86_emulate_ctxt *ctxt); |
d6aa10003 KVM: x86 emulator... |
215 |
int (*fix_hypercall)(struct x86_emulate_ctxt *ctxt); |
2953538eb KVM: x86 emulator... |
216 |
int (*intercept)(struct x86_emulate_ctxt *ctxt, |
8a76d7f25 KVM: x86: Add x86... |
217 |
struct x86_instruction_info *info, |
c4f035c60 KVM: x86 emulator... |
218 |
enum x86_intercept_stage stage); |
bdb42f5af KVM: x86: extend ... |
219 |
|
e911eb3b3 KVM: x86: Add ret... |
220 |
bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, u32 *eax, u32 *ebx, |
f91af5176 KVM: x86: Refacto... |
221 |
u32 *ecx, u32 *edx, bool exact_only); |
5ae78e95e KVM: x86: Add ded... |
222 223 224 |
bool (*guest_has_long_mode)(struct x86_emulate_ctxt *ctxt); bool (*guest_has_movbe)(struct x86_emulate_ctxt *ctxt); bool (*guest_has_fxsr)(struct x86_emulate_ctxt *ctxt); |
801806d95 KVM: x86: IRET em... |
225 |
void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked); |
6ed071f05 KVM: x86: fix emu... |
226 227 228 |
unsigned (*get_hflags)(struct x86_emulate_ctxt *ctxt); void (*set_hflags)(struct x86_emulate_ctxt *ctxt, unsigned hflags); |
ed19321fb KVM: x86: Load SM... |
229 230 |
int (*pre_leave_smm)(struct x86_emulate_ctxt *ctxt, const char *smstate); |
c5833c7a4 KVM: x86: Open co... |
231 |
void (*post_leave_smm)(struct x86_emulate_ctxt *ctxt); |
02d4160fb x86: KVM: add xse... |
232 |
int (*set_xcr)(struct x86_emulate_ctxt *ctxt, u32 index, u64 xcr); |
6aa8b732c [PATCH] kvm: user... |
233 |
}; |
1253791df KVM: x86 emulator... |
234 |
typedef u32 __attribute__((vector_size(16))) sse128_t; |
e4e03deda KVM: x86 emulator... |
235 236 |
/* Type, address-of, and value of an instruction's operand. */ struct operand { |
b3356bf0d KVM: emulator: op... |
237 |
enum { OP_REG, OP_MEM, OP_MEM_STR, OP_IMM, OP_XMM, OP_MM, OP_NONE } type; |
e4e03deda KVM: x86 emulator... |
238 |
unsigned int bytes; |
b3356bf0d KVM: emulator: op... |
239 |
unsigned int count; |
16518d5ad KVM: x86 emulator... |
240 241 242 243 |
union { unsigned long orig_val; u64 orig_val64; }; |
1a6440aef KVM: x86 emulator... |
244 245 |
union { unsigned long *reg; |
90de84f50 KVM: x86 emulator... |
246 247 248 249 |
struct segmented_address { ulong ea; unsigned seg; } mem; |
1253791df KVM: x86 emulator... |
250 |
unsigned xmm; |
cbe2c9d30 KVM: x86 emulator... |
251 |
unsigned mm; |
1a6440aef KVM: x86 emulator... |
252 |
} addr; |
414e6277f KVM: x86 emulator... |
253 254 |
union { unsigned long val; |
16518d5ad KVM: x86 emulator... |
255 |
u64 val64; |
54cfdb3e9 KVM: emulate: spe... |
256 |
char valptr[sizeof(sse128_t)]; |
1253791df KVM: x86 emulator... |
257 |
sse128_t vec_val; |
cbe2c9d30 KVM: x86 emulator... |
258 |
u64 mm_val; |
b3356bf0d KVM: emulator: op... |
259 |
void *data; |
414e6277f KVM: x86 emulator... |
260 |
}; |
e4e03deda KVM: x86 emulator... |
261 |
}; |
622668695 KVM: x86 emulator... |
262 263 |
struct fetch_cache { u8 data[15]; |
17052f16a KVM: emulate: put... |
264 265 |
u8 *ptr; u8 *end; |
622668695 KVM: x86 emulator... |
266 |
}; |
7b262e90f KVM: x86 emulator... |
267 268 269 270 271 |
struct read_cache { u8 data[1024]; unsigned long pos; unsigned long end; }; |
9d1b39a96 KVM: emulator: ma... |
272 273 274 275 276 277 278 279 |
/* Execution mode, passed to the emulator. */ enum x86emul_mode { X86EMUL_MODE_REAL, /* Real mode. */ X86EMUL_MODE_VM86, /* Virtual 8086 mode. */ X86EMUL_MODE_PROT16, /* 16-bit protected mode. */ X86EMUL_MODE_PROT32, /* 32-bit protected mode. */ X86EMUL_MODE_PROT64, /* 64-bit (long) mode. */ }; |
a584539b2 KVM: x86: pass th... |
280 281 |
/* These match some of the HF_* flags defined in kvm_host.h */ #define X86EMUL_GUEST_MASK (1 << 5) /* VCPU is in guest-mode */ |
64d606705 KVM: x86: stubs f... |
282 283 |
#define X86EMUL_SMM_MASK (1 << 6) #define X86EMUL_SMM_INSIDE_NMI_MASK (1 << 7) |
a584539b2 KVM: x86: pass th... |
284 |
|
b78a8552d kvm/emulate: fix ... |
285 286 287 288 289 290 291 |
/* * fastop functions are declared as taking a never-defined fastop parameter, * so they can't be called from C directly. */ struct fastop; typedef void (*fastop_t)(struct fastop *); |
9dac77fa4 KVM: x86 emulator... |
292 |
struct x86_emulate_ctxt { |
c9b8b07cd KVM: x86: Dynamic... |
293 |
void *vcpu; |
0225fb509 KVM: x86 emulator... |
294 |
const struct x86_emulate_ops *ops; |
9dac77fa4 KVM: x86 emulator... |
295 296 297 298 299 |
/* Register state before/after emulation. */ unsigned long eflags; unsigned long eip; /* eip before instruction emulation */ /* Emulated execution mode, represented by an X86EMUL_MODE value. */ |
9d1b39a96 KVM: emulator: ma... |
300 |
enum x86emul_mode mode; |
9dac77fa4 KVM: x86 emulator... |
301 302 303 |
/* interruptibility state, as a result of execution of STI or MOV SS */ int interruptibility; |
9dac77fa4 KVM: x86 emulator... |
304 |
bool perm_ok; /* do not check permissions if true */ |
b51e974fc kvm, emulator: Re... |
305 |
bool ud; /* inject an #UD if host doesn't support insn */ |
c8401dda2 KVM: x86: fix sin... |
306 |
bool tf; /* TF value before instruction (after for syscall/sysret) */ |
9dac77fa4 KVM: x86 emulator... |
307 308 309 |
bool have_exception; struct x86_exception exception; |
744e699c7 KVM: x86: Move gp... |
310 311 312 |
/* GPA available */ bool gpa_available; gpa_t gpa_val; |
1ce19dc16 kvm, emulator: Us... |
313 314 315 316 317 318 |
/* * decode cache */ /* current opcode length in bytes */ u8 opcode_len; |
e4e03deda KVM: x86 emulator... |
319 |
u8 b; |
c4f035c60 KVM: x86 emulator... |
320 |
u8 intercept; |
e4e03deda KVM: x86 emulator... |
321 322 |
u8 op_bytes; u8 ad_bytes; |
b78a8552d kvm/emulate: fix ... |
323 324 325 326 |
union { int (*execute)(struct x86_emulate_ctxt *ctxt); fastop_t fop; }; |
d09beabd7 KVM: x86 emulator... |
327 |
int (*check_perm)(struct x86_emulate_ctxt *ctxt); |
41061cdb9 KVM: emulate: do ... |
328 329 330 331 332 |
/* * The following six fields are cleared together, * the rest are initialized unconditionally in x86_decode_insn * or elsewhere */ |
c44b4c6ab KVM: emulate: cle... |
333 334 335 336 |
bool rip_relative; u8 rex_prefix; u8 lock_prefix; u8 rep_prefix; |
c44b4c6ab KVM: emulate: cle... |
337 338 339 340 |
/* bitmaps of registers in _regs[] that can be read */ u32 regs_valid; /* bitmaps of registers in _regs[] that have been written */ u32 regs_dirty; |
e4e03deda KVM: x86 emulator... |
341 342 343 344 345 |
/* modrm */ u8 modrm; u8 modrm_mod; u8 modrm_reg; u8 modrm_rm; |
09ee57cda KVM: x86 emulator... |
346 |
u8 modrm_seg; |
573e80fe0 KVM: emulate: rew... |
347 |
u8 seg_override; |
c44b4c6ab KVM: emulate: cle... |
348 |
u64 d; |
36dd9bb5c KVM: x86 emulator... |
349 |
unsigned long _eip; |
06add254c KVM: x86: Shrink ... |
350 351 352 353 354 |
/* Here begins the usercopy section. */ struct operand src; struct operand src2; struct operand dst; |
cbd27ee78 KVM: x86 emulator... |
355 |
struct operand memop; |
dd856efaf KVM: x86 emulator... |
356 |
unsigned long _regs[NR_VCPU_REGS]; |
f09ed83e2 KVM: x86 emulator... |
357 |
struct operand *memopp; |
622668695 KVM: x86 emulator... |
358 |
struct fetch_cache fetch; |
7b262e90f KVM: x86 emulator... |
359 |
struct read_cache io_read; |
9de415736 KVM: x86 emulator... |
360 |
struct read_cache mem_read; |
e4e03deda KVM: x86 emulator... |
361 |
}; |
90e0a28f6 KVM: x86 emulator... |
362 |
/* Repeat String Operation Prefix */ |
1d6b114f2 KVM: x86 emulator... |
363 364 |
#define REPE_PREFIX 0xf3 #define REPNE_PREFIX 0xf2 |
90e0a28f6 KVM: x86 emulator... |
365 |
|
c2226fc9e KVM: x86: fix mis... |
366 367 368 369 370 371 372 373 |
/* CPUID vendors */ #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273 |
b8f4abb65 x86/kvm: Add Hygo... |
374 375 376 |
#define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx 0x6f677948 #define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx 0x656e6975 #define X86EMUL_CPUID_VENDOR_HygonGenuine_edx 0x6e65476e |
c2226fc9e KVM: x86: fix mis... |
377 378 379 |
#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e #define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69 |
8d8923115 KVM: x86: Fix CPU... |
380 381 382 |
#define X86EMUL_CPUID_VENDOR_CentaurHauls_ebx 0x746e6543 #define X86EMUL_CPUID_VENDOR_CentaurHauls_ecx 0x736c7561 #define X86EMUL_CPUID_VENDOR_CentaurHauls_edx 0x48727561 |
15608ed03 KVM: x86: Add hel... |
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
static inline bool is_guest_vendor_intel(u32 ebx, u32 ecx, u32 edx) { return ebx == X86EMUL_CPUID_VENDOR_GenuineIntel_ebx && ecx == X86EMUL_CPUID_VENDOR_GenuineIntel_ecx && edx == X86EMUL_CPUID_VENDOR_GenuineIntel_edx; } static inline bool is_guest_vendor_amd(u32 ebx, u32 ecx, u32 edx) { return (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx && ecx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx && edx == X86EMUL_CPUID_VENDOR_AuthenticAMD_edx) || (ebx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx && ecx == X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx && edx == X86EMUL_CPUID_VENDOR_AMDisbetterI_edx); } static inline bool is_guest_vendor_hygon(u32 ebx, u32 ecx, u32 edx) { return ebx == X86EMUL_CPUID_VENDOR_HygonGenuine_ebx && ecx == X86EMUL_CPUID_VENDOR_HygonGenuine_ecx && edx == X86EMUL_CPUID_VENDOR_HygonGenuine_edx; } |
c4f035c60 KVM: x86 emulator... |
406 |
enum x86_intercept_stage { |
40e19b519 KVM: SVM: Get rid... |
407 |
X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */ |
c4f035c60 KVM: x86 emulator... |
408 409 410 411 412 413 414 |
X86_ICPT_PRE_EXCEPT, X86_ICPT_POST_EXCEPT, X86_ICPT_POST_MEMACCESS, }; enum x86_intercept { x86_intercept_none, |
cfec82cb7 KVM: SVM: Add int... |
415 416 417 |
x86_intercept_cr_read, x86_intercept_cr_write, x86_intercept_clts, |
3c6e276f2 KVM: x86 emulator... |
418 419 |
x86_intercept_lmsw, x86_intercept_smsw, |
3b88e41a4 KVM: SVM: Add int... |
420 421 |
x86_intercept_dr_read, x86_intercept_dr_write, |
3c6e276f2 KVM: x86 emulator... |
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 |
x86_intercept_lidt, x86_intercept_sidt, x86_intercept_lgdt, x86_intercept_sgdt, x86_intercept_lldt, x86_intercept_sldt, x86_intercept_ltr, x86_intercept_str, x86_intercept_rdtsc, x86_intercept_rdpmc, x86_intercept_pushf, x86_intercept_popf, x86_intercept_cpuid, x86_intercept_rsm, x86_intercept_iret, x86_intercept_intn, x86_intercept_invd, x86_intercept_pause, x86_intercept_hlt, x86_intercept_invlpg, x86_intercept_invlpga, x86_intercept_vmrun, x86_intercept_vmload, x86_intercept_vmsave, x86_intercept_vmmcall, x86_intercept_stgi, x86_intercept_clgi, x86_intercept_skinit, x86_intercept_rdtscp, x86_intercept_icebp, x86_intercept_wbinvd, x86_intercept_monitor, x86_intercept_mwait, |
8061252ee KVM: SVM: Add int... |
455 456 |
x86_intercept_rdmsr, x86_intercept_wrmsr, |
f6511935f KVM: SVM: Add che... |
457 458 459 460 |
x86_intercept_in, x86_intercept_ins, x86_intercept_out, x86_intercept_outs, |
02d4160fb x86: KVM: add xse... |
461 |
x86_intercept_xsetbv, |
c4f035c60 KVM: x86 emulator... |
462 463 464 |
nr_x86_intercepts }; |
6aa8b732c [PATCH] kvm: user... |
465 |
/* Host execution mode. */ |
d73fa29a9 KVM: Clean up kvm... |
466 |
#if defined(CONFIG_X86_32) |
6aa8b732c [PATCH] kvm: user... |
467 |
#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT32 |
05b3e0c2c [PATCH] KVM: Repl... |
468 |
#elif defined(CONFIG_X86_64) |
6aa8b732c [PATCH] kvm: user... |
469 470 |
#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT64 #endif |
dc25e89e0 KVM: SVM: copy in... |
471 |
int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len); |
1cb3f3ae5 KVM: x86: retry n... |
472 |
bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt); |
d2ddd1c48 KVM: x86 emulator... |
473 474 475 |
#define EMULATION_FAILED -1 #define EMULATION_OK 0 #define EMULATION_RESTART 1 |
775fde864 KVM: x86 emulator... |
476 |
#define EMULATION_INTERCEPTED 2 |
1498507a4 KVM: emulate: mov... |
477 |
void init_decode_cache(struct x86_emulate_ctxt *ctxt); |
9aabc88fc KVM: x86 emulator... |
478 |
int x86_emulate_insn(struct x86_emulate_ctxt *ctxt); |
38ba30ba5 KVM: x86 emulator... |
479 |
int emulator_task_switch(struct x86_emulate_ctxt *ctxt, |
7f3d35fdd KVM: x86 emulator... |
480 |
u16 tss_selector, int idt_index, int reason, |
e269fb218 KVM: x86: Push po... |
481 |
bool has_error_code, u32 error_code); |
7b105ca29 KVM: x86 emulator... |
482 |
int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq); |
dd856efaf KVM: x86 emulator... |
483 484 |
void emulator_invalidate_register_cache(struct x86_emulate_ctxt *ctxt); void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt); |
0f89b207b kvm: svm: Use the... |
485 |
bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt); |
dd856efaf KVM: x86 emulator... |
486 |
|
1965aae3c x86: Fix ASM_X86_... |
487 |
#endif /* _ASM_X86_KVM_X86_EMULATE_H */ |