KVM
kvm_emulate.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  * x86_emulate.h
4  *
5  * Generic x86 (32-bit and 64-bit) instruction decoder and emulator.
6  *
7  * Copyright (c) 2005 Keir Fraser
8  *
9  * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4
10  */
11 
12 #ifndef _ASM_X86_KVM_X86_EMULATE_H
13 #define _ASM_X86_KVM_X86_EMULATE_H
14 
15 #include <asm/desc_defs.h>
16 #include "fpu.h"
17 
18 struct x86_emulate_ctxt;
19 enum x86_intercept;
21 
22 struct x86_exception {
23  u8 vector;
27  u64 address; /* cr2 or nested page fault gpa */
29 };
30 
31 /*
32  * This struct is used to carry enough information from the instruction
33  * decoder to main KVM so that a decision can be made whether the
34  * instruction needs to be intercepted or not.
35  */
37  u8 intercept; /* which intercept */
38  u8 rep_prefix; /* rep prefix? */
39  u8 modrm_mod; /* mod part of modrm */
40  u8 modrm_reg; /* index of register used */
41  u8 modrm_rm; /* rm part of modrm */
42  u64 src_val; /* value of source operand */
43  u64 dst_val; /* value of destination operand */
44  u8 src_bytes; /* size of source operand */
45  u8 dst_bytes; /* size of destination operand */
46  u8 ad_bytes; /* size of src/dst address */
47  u64 next_rip; /* rip following the instruction */
48 };
49 
50 /*
51  * x86_emulate_ops:
52  *
53  * These operations represent the instruction emulator's interface to memory.
54  * There are two categories of operation: those that act on ordinary memory
55  * regions (*_std), and those that act on memory regions known to require
56  * special treatment or emulation (*_emulated).
57  *
58  * The emulator assumes that an instruction accesses only one 'emulated memory'
59  * location, that this location is the given linear faulting address (cr2), and
60  * that this is one of the instruction's data operands. Instruction fetches and
61  * stack operations are assumed never to access emulated memory. The emulator
62  * automatically deduces which operand of a string-move operation is accessing
63  * emulated memory, and assumes that the other operand accesses normal memory.
64  *
65  * NOTES:
66  * 1. The emulator isn't very smart about emulated vs. standard memory.
67  * 'Emulated memory' access addresses should be checked for sanity.
68  * 'Normal memory' accesses may fault, and the caller must arrange to
69  * detect and handle reentrancy into the emulator via recursive faults.
70  * Accesses may be unaligned and may cross page boundaries.
71  * 2. If the access fails (cannot emulate, or a standard access faults) then
72  * it is up to the memop to propagate the fault to the guest VM via
73  * some out-of-band mechanism, unknown to the emulator. The memop signals
74  * failure by returning X86EMUL_PROPAGATE_FAULT to the emulator, which will
75  * then immediately bail.
76  * 3. Valid access sizes are 1, 2, 4 and 8 bytes. On x86/32 systems only
77  * cmpxchg8b_emulated need support 8-byte accesses.
78  * 4. The emulator cannot handle 64-bit mode emulation on an x86/32 system.
79  */
80 /* Access completed successfully: continue emulation as normal. */
81 #define X86EMUL_CONTINUE 0
82 /* Access is unhandleable: bail from emulation and return error to caller. */
83 #define X86EMUL_UNHANDLEABLE 1
84 /* Terminate emulation but return success to the caller. */
85 #define X86EMUL_PROPAGATE_FAULT 2 /* propagate a generated fault to guest */
86 #define X86EMUL_RETRY_INSTR 3 /* retry the instruction for some reason */
87 #define X86EMUL_CMPXCHG_FAILED 4 /* cmpxchg did not see expected value */
88 #define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */
89 #define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */
90 
91 /* x86-specific emulation flags */
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)
96 
98  void (*vm_bugged)(struct x86_emulate_ctxt *ctxt);
99  /*
100  * read_gpr: read a general purpose register (rax - r15)
101  *
102  * @reg: gpr number.
103  */
104  ulong (*read_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg);
105  /*
106  * write_gpr: write a general purpose register (rax - r15)
107  *
108  * @reg: gpr number.
109  * @val: value to write.
110  */
111  void (*write_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val);
112  /*
113  * read_std: Read bytes of standard (non-emulated/special) memory.
114  * Used for descriptor reading.
115  * @addr: [IN ] Linear address from which to read.
116  * @val: [OUT] Value read from memory, zero-extended to 'u_long'.
117  * @bytes: [IN ] Number of bytes to read from memory.
118  * @system:[IN ] Whether the access is forced to be at CPL0.
119  */
120  int (*read_std)(struct x86_emulate_ctxt *ctxt,
121  unsigned long addr, void *val,
122  unsigned int bytes,
123  struct x86_exception *fault, bool system);
124 
125  /*
126  * write_std: Write bytes of standard (non-emulated/special) memory.
127  * Used for descriptor writing.
128  * @addr: [IN ] Linear address to which to write.
129  * @val: [OUT] Value write to memory, zero-extended to 'u_long'.
130  * @bytes: [IN ] Number of bytes to write to memory.
131  * @system:[IN ] Whether the access is forced to be at CPL0.
132  */
133  int (*write_std)(struct x86_emulate_ctxt *ctxt,
134  unsigned long addr, void *val, unsigned int bytes,
135  struct x86_exception *fault, bool system);
136  /*
137  * fetch: Read bytes of standard (non-emulated/special) memory.
138  * Used for instruction fetch.
139  * @addr: [IN ] Linear address from which to read.
140  * @val: [OUT] Value read from memory, zero-extended to 'u_long'.
141  * @bytes: [IN ] Number of bytes to read from memory.
142  */
143  int (*fetch)(struct x86_emulate_ctxt *ctxt,
144  unsigned long addr, void *val, unsigned int bytes,
145  struct x86_exception *fault);
146 
147  /*
148  * read_emulated: Read bytes from emulated/special memory area.
149  * @addr: [IN ] Linear address from which to read.
150  * @val: [OUT] Value read from memory, zero-extended to 'u_long'.
151  * @bytes: [IN ] Number of bytes to read from memory.
152  */
153  int (*read_emulated)(struct x86_emulate_ctxt *ctxt,
154  unsigned long addr, void *val, unsigned int bytes,
155  struct x86_exception *fault);
156 
157  /*
158  * write_emulated: Write bytes to emulated/special memory area.
159  * @addr: [IN ] Linear address to which to write.
160  * @val: [IN ] Value to write to memory (low-order bytes used as
161  * required).
162  * @bytes: [IN ] Number of bytes to write to memory.
163  */
164  int (*write_emulated)(struct x86_emulate_ctxt *ctxt,
165  unsigned long addr, const void *val,
166  unsigned int bytes,
167  struct x86_exception *fault);
168 
169  /*
170  * cmpxchg_emulated: Emulate an atomic (LOCKed) CMPXCHG operation on an
171  * emulated/special memory area.
172  * @addr: [IN ] Linear address to access.
173  * @old: [IN ] Value expected to be current at @addr.
174  * @new: [IN ] Value to write to @addr.
175  * @bytes: [IN ] Number of bytes to access using CMPXCHG.
176  */
177  int (*cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt,
178  unsigned long addr,
179  const void *old,
180  const void *new,
181  unsigned int bytes,
182  struct x86_exception *fault);
183  void (*invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr);
184 
185  int (*pio_in_emulated)(struct x86_emulate_ctxt *ctxt,
186  int size, unsigned short port, void *val,
187  unsigned int count);
188 
189  int (*pio_out_emulated)(struct x86_emulate_ctxt *ctxt,
190  int size, unsigned short port, const void *val,
191  unsigned int count);
192 
193  bool (*get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector,
194  struct desc_struct *desc, u32 *base3, int seg);
195  void (*set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector,
196  struct desc_struct *desc, u32 base3, int seg);
197  unsigned long (*get_cached_segment_base)(struct x86_emulate_ctxt *ctxt,
198  int seg);
199  void (*get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
200  void (*get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
201  void (*set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
202  void (*set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
203  ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr);
204  int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val);
205  int (*cpl)(struct x86_emulate_ctxt *ctxt);
206  void (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
207  int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
208  int (*set_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
209  int (*get_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
210  int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
211  int (*check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc);
212  int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata);
213  void (*halt)(struct x86_emulate_ctxt *ctxt);
214  void (*wbinvd)(struct x86_emulate_ctxt *ctxt);
215  int (*fix_hypercall)(struct x86_emulate_ctxt *ctxt);
216  int (*intercept)(struct x86_emulate_ctxt *ctxt,
217  struct x86_instruction_info *info,
218  enum x86_intercept_stage stage);
219 
220  bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, u32 *eax, u32 *ebx,
221  u32 *ecx, u32 *edx, bool exact_only);
222  bool (*guest_has_movbe)(struct x86_emulate_ctxt *ctxt);
223  bool (*guest_has_fxsr)(struct x86_emulate_ctxt *ctxt);
224  bool (*guest_has_rdpid)(struct x86_emulate_ctxt *ctxt);
225 
226  void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked);
227 
228  bool (*is_smm)(struct x86_emulate_ctxt *ctxt);
229  bool (*is_guest_mode)(struct x86_emulate_ctxt *ctxt);
230  int (*leave_smm)(struct x86_emulate_ctxt *ctxt);
231  void (*triple_fault)(struct x86_emulate_ctxt *ctxt);
232  int (*set_xcr)(struct x86_emulate_ctxt *ctxt, u32 index, u64 xcr);
233 
234  gva_t (*get_untagged_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr,
235  unsigned int flags);
236 };
237 
238 /* Type, address-of, and value of an instruction's operand. */
239 struct operand {
241  unsigned int bytes;
242  unsigned int count;
243  union {
244  unsigned long orig_val;
246  };
247  union {
248  unsigned long *reg;
249  struct segmented_address {
250  ulong ea;
251  unsigned seg;
252  } mem;
253  unsigned xmm;
254  unsigned mm;
255  } addr;
256  union {
257  unsigned long val;
258  u64 val64;
259  char valptr[sizeof(sse128_t)];
260  sse128_t vec_val;
261  u64 mm_val;
262  void *data;
263  };
264 };
265 
266 struct fetch_cache {
267  u8 data[15];
268  u8 *ptr;
269  u8 *end;
270 };
271 
272 struct read_cache {
273  u8 data[1024];
274  unsigned long pos;
275  unsigned long end;
276 };
277 
278 /* Execution mode, passed to the emulator. */
280  X86EMUL_MODE_REAL, /* Real mode. */
281  X86EMUL_MODE_VM86, /* Virtual 8086 mode. */
282  X86EMUL_MODE_PROT16, /* 16-bit protected mode. */
283  X86EMUL_MODE_PROT32, /* 32-bit protected mode. */
284  X86EMUL_MODE_PROT64, /* 64-bit (long) mode. */
285 };
286 
287 /*
288  * fastop functions are declared as taking a never-defined fastop parameter,
289  * so they can't be called from C directly.
290  */
291 struct fastop;
292 
293 typedef void (*fastop_t)(struct fastop *);
294 
295 /*
296  * The emulator's _regs array tracks only the GPRs, i.e. excludes RIP. RIP is
297  * tracked/accessed via _eip, and except for RIP relative addressing, which
298  * also uses _eip, RIP cannot be a register operand nor can it be an operand in
299  * a ModRM or SIB byte.
300  */
301 #ifdef CONFIG_X86_64
302 #define NR_EMULATOR_GPRS 16
303 #else
304 #define NR_EMULATOR_GPRS 8
305 #endif
306 
308  void *vcpu;
309  const struct x86_emulate_ops *ops;
310 
311  /* Register state before/after emulation. */
312  unsigned long eflags;
313  unsigned long eip; /* eip before instruction emulation */
314  /* Emulated execution mode, represented by an X86EMUL_MODE value. */
315  enum x86emul_mode mode;
316 
317  /* interruptibility state, as a result of execution of STI or MOV SS */
319 
320  bool perm_ok; /* do not check permissions if true */
321  bool tf; /* TF value before instruction (after for syscall/sysret) */
322 
324  struct x86_exception exception;
325 
326  /* GPA available */
328  gpa_t gpa_val;
329 
330  /*
331  * decode cache
332  */
333 
334  /* current opcode length in bytes */
336  u8 b;
340  union {
341  int (*execute)(struct x86_emulate_ctxt *ctxt);
343  };
344  int (*check_perm)(struct x86_emulate_ctxt *ctxt);
345 
350  /* bitmaps of registers in _regs[] that can be read */
352  /* bitmaps of registers in _regs[] that have been written */
354  /* modrm */
355  u8 modrm;
361  u64 d;
362  unsigned long _eip;
363 
364  /* Here begins the usercopy section. */
365  struct operand src;
366  struct operand src2;
367  struct operand dst;
368  struct operand memop;
369  unsigned long _regs[NR_EMULATOR_GPRS];
370  struct operand *memopp;
371  struct fetch_cache fetch;
372  struct read_cache io_read;
373  struct read_cache mem_read;
374  bool is_branch;
375 };
376 
377 #define KVM_EMULATOR_BUG_ON(cond, ctxt) \
378 ({ \
379  int __ret = (cond); \
380  \
381  if (WARN_ON_ONCE(__ret)) \
382  ctxt->ops->vm_bugged(ctxt); \
383  unlikely(__ret); \
384 })
385 
386 /* Repeat String Operation Prefix */
387 #define REPE_PREFIX 0xf3
388 #define REPNE_PREFIX 0xf2
389 
390 /* CPUID vendors */
391 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
392 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
393 #define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
394 
395 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
396 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
397 #define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
398 
399 #define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx 0x6f677948
400 #define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx 0x656e6975
401 #define X86EMUL_CPUID_VENDOR_HygonGenuine_edx 0x6e65476e
402 
403 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
404 #define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
405 #define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
406 
407 #define X86EMUL_CPUID_VENDOR_CentaurHauls_ebx 0x746e6543
408 #define X86EMUL_CPUID_VENDOR_CentaurHauls_ecx 0x736c7561
409 #define X86EMUL_CPUID_VENDOR_CentaurHauls_edx 0x48727561
410 
411 static inline bool is_guest_vendor_intel(u32 ebx, u32 ecx, u32 edx)
412 {
416 }
417 
418 static inline bool is_guest_vendor_amd(u32 ebx, u32 ecx, u32 edx)
419 {
420  return (ebx == X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx &&
426 }
427 
428 static inline bool is_guest_vendor_hygon(u32 ebx, u32 ecx, u32 edx)
429 {
433 }
434 
436  X86_ICTP_NONE = 0, /* Allow zero-init to not match anything */
440 };
441 
492 
494 };
495 
496 /* Host execution mode. */
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
501 #endif
502 
503 int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int emulation_type);
505 #define EMULATION_FAILED -1
506 #define EMULATION_OK 0
507 #define EMULATION_RESTART 1
508 #define EMULATION_INTERCEPTED 2
509 void init_decode_cache(struct x86_emulate_ctxt *ctxt);
510 int x86_emulate_insn(struct x86_emulate_ctxt *ctxt);
511 int emulator_task_switch(struct x86_emulate_ctxt *ctxt,
512  u16 tss_selector, int idt_index, int reason,
513  bool has_error_code, u32 error_code);
514 int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq);
517 bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt);
518 
519 static inline ulong reg_read(struct x86_emulate_ctxt *ctxt, unsigned nr)
520 {
521  if (KVM_EMULATOR_BUG_ON(nr >= NR_EMULATOR_GPRS, ctxt))
522  nr &= NR_EMULATOR_GPRS - 1;
523 
524  if (!(ctxt->regs_valid & (1 << nr))) {
525  ctxt->regs_valid |= 1 << nr;
526  ctxt->_regs[nr] = ctxt->ops->read_gpr(ctxt, nr);
527  }
528  return ctxt->_regs[nr];
529 }
530 
531 static inline ulong *reg_write(struct x86_emulate_ctxt *ctxt, unsigned nr)
532 {
533  if (KVM_EMULATOR_BUG_ON(nr >= NR_EMULATOR_GPRS, ctxt))
534  nr &= NR_EMULATOR_GPRS - 1;
535 
536  BUILD_BUG_ON(sizeof(ctxt->regs_dirty) * BITS_PER_BYTE < NR_EMULATOR_GPRS);
537  BUILD_BUG_ON(sizeof(ctxt->regs_valid) * BITS_PER_BYTE < NR_EMULATOR_GPRS);
538 
539  ctxt->regs_valid |= 1 << nr;
540  ctxt->regs_dirty |= 1 << nr;
541  return &ctxt->_regs[nr];
542 }
543 
544 static inline ulong *reg_rmw(struct x86_emulate_ctxt *ctxt, unsigned nr)
545 {
546  reg_read(ctxt, nr);
547  return reg_write(ctxt, nr);
548 }
549 
550 #endif /* _ASM_X86_KVM_X86_EMULATE_H */
static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop)
Definition: emulate.c:5107
int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5140
#define NR_EMULATOR_GPRS
Definition: kvm_emulate.h:304
x86_intercept
Definition: kvm_emulate.h:442
@ nr_x86_intercepts
Definition: kvm_emulate.h:493
@ x86_intercept_monitor
Definition: kvm_emulate.h:483
@ x86_intercept_intn
Definition: kvm_emulate.h:466
@ x86_intercept_ins
Definition: kvm_emulate.h:488
@ x86_intercept_clts
Definition: kvm_emulate.h:446
@ x86_intercept_vmsave
Definition: kvm_emulate.h:474
@ x86_intercept_clgi
Definition: kvm_emulate.h:477
@ x86_intercept_wrmsr
Definition: kvm_emulate.h:486
@ x86_intercept_iret
Definition: kvm_emulate.h:465
@ x86_intercept_sldt
Definition: kvm_emulate.h:456
@ x86_intercept_cpuid
Definition: kvm_emulate.h:463
@ x86_intercept_pause
Definition: kvm_emulate.h:468
@ x86_intercept_rdmsr
Definition: kvm_emulate.h:485
@ x86_intercept_pushf
Definition: kvm_emulate.h:461
@ x86_intercept_rsm
Definition: kvm_emulate.h:464
@ x86_intercept_vmrun
Definition: kvm_emulate.h:472
@ x86_intercept_out
Definition: kvm_emulate.h:489
@ x86_intercept_rdpid
Definition: kvm_emulate.h:480
@ x86_intercept_stgi
Definition: kvm_emulate.h:476
@ x86_intercept_icebp
Definition: kvm_emulate.h:481
@ x86_intercept_hlt
Definition: kvm_emulate.h:469
@ x86_intercept_vmload
Definition: kvm_emulate.h:473
@ x86_intercept_lgdt
Definition: kvm_emulate.h:453
@ x86_intercept_vmmcall
Definition: kvm_emulate.h:475
@ x86_intercept_cr_write
Definition: kvm_emulate.h:445
@ x86_intercept_rdtscp
Definition: kvm_emulate.h:479
@ x86_intercept_smsw
Definition: kvm_emulate.h:448
@ x86_intercept_dr_write
Definition: kvm_emulate.h:450
@ x86_intercept_mwait
Definition: kvm_emulate.h:484
@ x86_intercept_popf
Definition: kvm_emulate.h:462
@ x86_intercept_xsetbv
Definition: kvm_emulate.h:491
@ x86_intercept_skinit
Definition: kvm_emulate.h:478
@ x86_intercept_outs
Definition: kvm_emulate.h:490
@ x86_intercept_invlpg
Definition: kvm_emulate.h:470
@ x86_intercept_wbinvd
Definition: kvm_emulate.h:482
@ x86_intercept_invlpga
Definition: kvm_emulate.h:471
@ x86_intercept_dr_read
Definition: kvm_emulate.h:449
@ x86_intercept_sidt
Definition: kvm_emulate.h:452
@ x86_intercept_in
Definition: kvm_emulate.h:487
@ x86_intercept_cr_read
Definition: kvm_emulate.h:444
@ x86_intercept_rdtsc
Definition: kvm_emulate.h:459
@ x86_intercept_lldt
Definition: kvm_emulate.h:455
@ x86_intercept_lidt
Definition: kvm_emulate.h:451
@ x86_intercept_sgdt
Definition: kvm_emulate.h:454
@ x86_intercept_ltr
Definition: kvm_emulate.h:457
@ x86_intercept_str
Definition: kvm_emulate.h:458
@ x86_intercept_lmsw
Definition: kvm_emulate.h:447
@ x86_intercept_rdpmc
Definition: kvm_emulate.h:460
@ x86_intercept_invd
Definition: kvm_emulate.h:467
@ x86_intercept_none
Definition: kvm_emulate.h:443
static bool is_guest_vendor_hygon(u32 ebx, u32 ecx, u32 edx)
Definition: kvm_emulate.h:428
#define X86EMUL_CPUID_VENDOR_HygonGenuine_ebx
Definition: kvm_emulate.h:399
#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx
Definition: kvm_emulate.h:404
void(* fastop_t)(struct fastop *)
Definition: kvm_emulate.h:293
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx
Definition: kvm_emulate.h:396
static bool is_guest_vendor_intel(u32 ebx, u32 ecx, u32 edx)
Definition: kvm_emulate.h:411
static ulong * reg_write(struct x86_emulate_ctxt *ctxt, unsigned nr)
Definition: kvm_emulate.h:531
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx
Definition: kvm_emulate.h:391
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx
Definition: kvm_emulate.h:392
#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx
Definition: kvm_emulate.h:393
void emulator_invalidate_register_cache(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5492
#define KVM_EMULATOR_BUG_ON(cond, ctxt)
Definition: kvm_emulate.h:377
x86emul_mode
Definition: kvm_emulate.h:279
@ X86EMUL_MODE_PROT64
Definition: kvm_emulate.h:284
@ X86EMUL_MODE_VM86
Definition: kvm_emulate.h:281
@ X86EMUL_MODE_REAL
Definition: kvm_emulate.h:280
@ X86EMUL_MODE_PROT32
Definition: kvm_emulate.h:283
@ X86EMUL_MODE_PROT16
Definition: kvm_emulate.h:282
void init_decode_cache(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5125
static ulong reg_read(struct x86_emulate_ctxt *ctxt, unsigned nr)
Definition: kvm_emulate.h:519
#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx
Definition: kvm_emulate.h:405
#define X86EMUL_CPUID_VENDOR_HygonGenuine_edx
Definition: kvm_emulate.h:401
static bool is_guest_vendor_amd(u32 ebx, u32 ecx, u32 edx)
Definition: kvm_emulate.h:418
#define X86EMUL_CPUID_VENDOR_HygonGenuine_ecx
Definition: kvm_emulate.h:400
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx
Definition: kvm_emulate.h:395
#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx
Definition: kvm_emulate.h:403
int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq)
Definition: emulate.c:2069
#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx
Definition: kvm_emulate.h:397
int emulator_task_switch(struct x86_emulate_ctxt *ctxt, u16 tss_selector, int idt_index, int reason, bool has_error_code, u32 error_code)
Definition: emulate.c:3020
static ulong * reg_rmw(struct x86_emulate_ctxt *ctxt, unsigned nr)
Definition: kvm_emulate.h:544
x86_intercept_stage
Definition: kvm_emulate.h:435
@ X86_ICTP_NONE
Definition: kvm_emulate.h:436
@ X86_ICPT_POST_MEMACCESS
Definition: kvm_emulate.h:439
@ X86_ICPT_PRE_EXCEPT
Definition: kvm_emulate.h:437
@ X86_ICPT_POST_EXCEPT
Definition: kvm_emulate.h:438
void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5497
bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5062
int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int emulation_type)
Definition: emulate.c:4763
bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt)
Definition: emulate.c:5502
u8 data[15]
Definition: kvm_emulate.h:267
unsigned int bytes
Definition: kvm_emulate.h:241
unsigned long * reg
Definition: kvm_emulate.h:248
unsigned mm
Definition: kvm_emulate.h:254
unsigned seg
Definition: kvm_emulate.h:251
enum operand::@0 type
@ OP_MEM_STR
Definition: kvm_emulate.h:240
unsigned long orig_val
Definition: kvm_emulate.h:244
char valptr[sizeof(sse128_t)]
Definition: kvm_emulate.h:259
void * data
Definition: kvm_emulate.h:262
unsigned int count
Definition: kvm_emulate.h:242
unsigned long val
Definition: kvm_emulate.h:257
struct operand::@4::segmented_address mem
union operand::@4 addr
u64 mm_val
Definition: kvm_emulate.h:261
sse128_t vec_val
Definition: kvm_emulate.h:260
u64 val64
Definition: kvm_emulate.h:258
u64 orig_val64
Definition: kvm_emulate.h:245
ulong ea
Definition: kvm_emulate.h:250
unsigned xmm
Definition: kvm_emulate.h:253
unsigned long end
Definition: kvm_emulate.h:275
unsigned long pos
Definition: kvm_emulate.h:274
u8 data[1024]
Definition: kvm_emulate.h:273
struct operand * memopp
Definition: kvm_emulate.h:370
int(* check_perm)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:344
struct fetch_cache fetch
Definition: kvm_emulate.h:371
unsigned long eflags
Definition: kvm_emulate.h:312
enum x86emul_mode mode
Definition: kvm_emulate.h:315
struct read_cache io_read
Definition: kvm_emulate.h:372
const struct x86_emulate_ops * ops
Definition: kvm_emulate.h:309
struct x86_exception exception
Definition: kvm_emulate.h:324
struct operand src2
Definition: kvm_emulate.h:366
unsigned long _eip
Definition: kvm_emulate.h:362
struct operand src
Definition: kvm_emulate.h:365
struct operand dst
Definition: kvm_emulate.h:367
struct read_cache mem_read
Definition: kvm_emulate.h:373
unsigned long eip
Definition: kvm_emulate.h:313
struct operand memop
Definition: kvm_emulate.h:368
unsigned long _regs[NR_EMULATOR_GPRS]
Definition: kvm_emulate.h:369
int(* execute)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:341
void(* halt)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:213
int(* set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value)
Definition: kvm_emulate.h:207
bool(* guest_has_rdpid)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:224
ulong(* get_cr)(struct x86_emulate_ctxt *ctxt, int cr)
Definition: kvm_emulate.h:203
ulong(* read_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg)
Definition: kvm_emulate.h:104
int(* cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, const void *old, const void *new, unsigned int bytes, struct x86_exception *fault)
Definition: kvm_emulate.h:177
void(* get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest)
Definition: kvm_emulate.h:206
int(* cpl)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:205
unsigned long(* get_cached_segment_base)(struct x86_emulate_ctxt *ctxt, int seg)
Definition: kvm_emulate.h:197
int(* leave_smm)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:230
void(* triple_fault)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:231
bool(* is_smm)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:228
void(* set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked)
Definition: kvm_emulate.h:226
int(* pio_out_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, const void *val, unsigned int count)
Definition: kvm_emulate.h:189
int(* get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata)
Definition: kvm_emulate.h:210
void(* write_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val)
Definition: kvm_emulate.h:111
int(* pio_in_emulated)(struct x86_emulate_ctxt *ctxt, int size, unsigned short port, void *val, unsigned int count)
Definition: kvm_emulate.h:185
int(* write_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, const void *val, unsigned int bytes, struct x86_exception *fault)
Definition: kvm_emulate.h:164
int(* set_xcr)(struct x86_emulate_ctxt *ctxt, u32 index, u64 xcr)
Definition: kvm_emulate.h:232
int(* get_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata)
Definition: kvm_emulate.h:209
bool(* guest_has_movbe)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:222
void(* get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
Definition: kvm_emulate.h:200
bool(* is_guest_mode)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:229
void(* set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
Definition: kvm_emulate.h:201
void(* set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector, struct desc_struct *desc, u32 base3, int seg)
Definition: kvm_emulate.h:195
bool(* get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector, struct desc_struct *desc, u32 *base3, int seg)
Definition: kvm_emulate.h:193
void(* set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
Definition: kvm_emulate.h:202
gva_t(* get_untagged_addr)(struct x86_emulate_ctxt *ctxt, gva_t addr, unsigned int flags)
Definition: kvm_emulate.h:234
int(* fix_hypercall)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:215
int(* intercept)(struct x86_emulate_ctxt *ctxt, struct x86_instruction_info *info, enum x86_intercept_stage stage)
Definition: kvm_emulate.h:216
int(* read_emulated)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault)
Definition: kvm_emulate.h:153
int(* fetch)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault)
Definition: kvm_emulate.h:143
int(* read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata)
Definition: kvm_emulate.h:212
void(* wbinvd)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:214
int(* read_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault, bool system)
Definition: kvm_emulate.h:120
int(* write_std)(struct x86_emulate_ctxt *ctxt, unsigned long addr, void *val, unsigned int bytes, struct x86_exception *fault, bool system)
Definition: kvm_emulate.h:133
bool(* get_cpuid)(struct x86_emulate_ctxt *ctxt, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx, bool exact_only)
Definition: kvm_emulate.h:220
int(* check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc)
Definition: kvm_emulate.h:211
int(* set_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data)
Definition: kvm_emulate.h:208
int(* set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val)
Definition: kvm_emulate.h:204
bool(* guest_has_fxsr)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:223
void(* invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr)
Definition: kvm_emulate.h:183
void(* vm_bugged)(struct x86_emulate_ctxt *ctxt)
Definition: kvm_emulate.h:98
void(* get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt)
Definition: kvm_emulate.h:199
bool error_code_valid
Definition: kvm_emulate.h:24
bool nested_page_fault
Definition: kvm_emulate.h:26
uint32_t flags
Definition: xen.c:1