1
2
3
4
5
6
7
8
9
10
11#ifndef _ASM_X86_KVM_X86_EMULATE_H
12#define _ASM_X86_KVM_X86_EMULATE_H
13
14#include <asm/desc_defs.h>
15
16struct x86_emulate_ctxt;
17enum x86_intercept;
18enum x86_intercept_stage;
19
20struct x86_exception {
21 u8 vector;
22 bool error_code_valid;
23 u16 error_code;
24 bool nested_page_fault;
25 u64 address;
26};
27
28
29
30
31
32
33struct x86_instruction_info {
34 u8 intercept;
35 u8 rep_prefix;
36 u8 modrm_mod;
37 u8 modrm_reg;
38 u8 modrm_rm;
39 u64 src_val;
40 u64 dst_val;
41 u8 src_bytes;
42 u8 dst_bytes;
43 u8 ad_bytes;
44 u64 next_rip;
45};
46
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#define X86EMUL_CONTINUE 0
79
80#define X86EMUL_UNHANDLEABLE 1
81
82#define X86EMUL_PROPAGATE_FAULT 2
83#define X86EMUL_RETRY_INSTR 3
84#define X86EMUL_CMPXCHG_FAILED 4
85#define X86EMUL_IO_NEEDED 5
86#define X86EMUL_INTERCEPTED 6
87
88struct x86_emulate_ops {
89
90
91
92
93
94 ulong (*read_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg);
95
96
97
98
99
100
101 void (*write_gpr)(struct x86_emulate_ctxt *ctxt, unsigned reg, ulong val);
102
103
104
105
106
107
108
109 int (*read_std)(struct x86_emulate_ctxt *ctxt,
110 unsigned long addr, void *val,
111 unsigned int bytes,
112 struct x86_exception *fault);
113
114
115
116
117
118
119
120
121 int (*read_phys)(struct x86_emulate_ctxt *ctxt, unsigned long addr,
122 void *val, unsigned int bytes);
123
124
125
126
127
128
129
130
131 int (*write_std)(struct x86_emulate_ctxt *ctxt,
132 unsigned long addr, void *val, unsigned int bytes,
133 struct x86_exception *fault);
134
135
136
137
138
139
140
141 int (*fetch)(struct x86_emulate_ctxt *ctxt,
142 unsigned long addr, void *val, unsigned int bytes,
143 struct x86_exception *fault);
144
145
146
147
148
149
150
151 int (*read_emulated)(struct x86_emulate_ctxt *ctxt,
152 unsigned long addr, void *val, unsigned int bytes,
153 struct x86_exception *fault);
154
155
156
157
158
159
160
161
162 int (*write_emulated)(struct x86_emulate_ctxt *ctxt,
163 unsigned long addr, const void *val,
164 unsigned int bytes,
165 struct x86_exception *fault);
166
167
168
169
170
171
172
173
174
175 int (*cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt,
176 unsigned long addr,
177 const void *old,
178 const void *new,
179 unsigned int bytes,
180 struct x86_exception *fault);
181 void (*invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr);
182
183 int (*pio_in_emulated)(struct x86_emulate_ctxt *ctxt,
184 int size, unsigned short port, void *val,
185 unsigned int count);
186
187 int (*pio_out_emulated)(struct x86_emulate_ctxt *ctxt,
188 int size, unsigned short port, const void *val,
189 unsigned int count);
190
191 bool (*get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector,
192 struct desc_struct *desc, u32 *base3, int seg);
193 void (*set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector,
194 struct desc_struct *desc, u32 base3, int seg);
195 unsigned long (*get_cached_segment_base)(struct x86_emulate_ctxt *ctxt,
196 int seg);
197 void (*get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
198 void (*get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
199 void (*set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
200 void (*set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
201 ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr);
202 int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val);
203 int (*cpl)(struct x86_emulate_ctxt *ctxt);
204 int (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
205 int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
206 u64 (*get_smbase)(struct x86_emulate_ctxt *ctxt);
207 void (*set_smbase)(struct x86_emulate_ctxt *ctxt, u64 smbase);
208 int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
209 int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
210 int (*check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc);
211 int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata);
212 void (*halt)(struct x86_emulate_ctxt *ctxt);
213 void (*wbinvd)(struct x86_emulate_ctxt *ctxt);
214 int (*fix_hypercall)(struct x86_emulate_ctxt *ctxt);
215 void (*get_fpu)(struct x86_emulate_ctxt *ctxt);
216 void (*put_fpu)(struct x86_emulate_ctxt *ctxt);
217 int (*intercept)(struct x86_emulate_ctxt *ctxt,
218 struct x86_instruction_info *info,
219 enum x86_intercept_stage stage);
220
221 void (*get_cpuid)(struct x86_emulate_ctxt *ctxt,
222 u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
223 void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked);
224
225 unsigned (*get_hflags)(struct x86_emulate_ctxt *ctxt);
226 void (*set_hflags)(struct x86_emulate_ctxt *ctxt, unsigned hflags);
227};
228
229typedef u32 __attribute__((vector_size(16))) sse128_t;
230
231
232struct operand {
233 enum { OP_REG, OP_MEM, OP_MEM_STR, OP_IMM, OP_XMM, OP_MM, OP_NONE } type;
234 unsigned int bytes;
235 unsigned int count;
236 union {
237 unsigned long orig_val;
238 u64 orig_val64;
239 };
240 union {
241 unsigned long *reg;
242 struct segmented_address {
243 ulong ea;
244 unsigned seg;
245 } mem;
246 unsigned xmm;
247 unsigned mm;
248 } addr;
249 union {
250 unsigned long val;
251 u64 val64;
252 char valptr[sizeof(sse128_t)];
253 sse128_t vec_val;
254 u64 mm_val;
255 void *data;
256 };
257};
258
259struct fetch_cache {
260 u8 data[15];
261 u8 *ptr;
262 u8 *end;
263};
264
265struct read_cache {
266 u8 data[1024];
267 unsigned long pos;
268 unsigned long end;
269};
270
271
272enum x86emul_mode {
273 X86EMUL_MODE_REAL,
274 X86EMUL_MODE_VM86,
275 X86EMUL_MODE_PROT16,
276 X86EMUL_MODE_PROT32,
277 X86EMUL_MODE_PROT64,
278};
279
280
281#define X86EMUL_GUEST_MASK (1 << 5)
282#define X86EMUL_SMM_MASK (1 << 6)
283#define X86EMUL_SMM_INSIDE_NMI_MASK (1 << 7)
284
285struct x86_emulate_ctxt {
286 const struct x86_emulate_ops *ops;
287
288
289 unsigned long eflags;
290 unsigned long eip;
291
292 enum x86emul_mode mode;
293
294
295 int interruptibility;
296
297 bool perm_ok;
298 bool ud;
299 bool tf;
300
301 bool have_exception;
302 struct x86_exception exception;
303
304
305
306
307
308
309 u8 opcode_len;
310 u8 b;
311 u8 intercept;
312 u8 op_bytes;
313 u8 ad_bytes;
314 struct operand src;
315 struct operand src2;
316 struct operand dst;
317 int (*execute)(struct x86_emulate_ctxt *ctxt);
318 int (*check_perm)(struct x86_emulate_ctxt *ctxt);
319
320
321
322
323
324 bool rip_relative;
325 u8 rex_prefix;
326 u8 lock_prefix;
327 u8 rep_prefix;
328
329 u32 regs_valid;
330
331 u32 regs_dirty;
332
333 u8 modrm;
334 u8 modrm_mod;
335 u8 modrm_reg;
336 u8 modrm_rm;
337 u8 modrm_seg;
338 u8 seg_override;
339 u64 d;
340 unsigned long _eip;
341 struct operand memop;
342
343 unsigned long _regs[NR_VCPU_REGS];
344 struct operand *memopp;
345 struct fetch_cache fetch;
346 struct read_cache io_read;
347 struct read_cache mem_read;
348};
349
350
351#define REPE_PREFIX 0xf3
352#define REPNE_PREFIX 0xf2
353
354
355#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
356#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
357#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
358
359#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
360#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
361#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
362
363#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
364#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
365#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
366
367enum x86_intercept_stage {
368 X86_ICTP_NONE = 0,
369 X86_ICPT_PRE_EXCEPT,
370 X86_ICPT_POST_EXCEPT,
371 X86_ICPT_POST_MEMACCESS,
372};
373
374enum x86_intercept {
375 x86_intercept_none,
376 x86_intercept_cr_read,
377 x86_intercept_cr_write,
378 x86_intercept_clts,
379 x86_intercept_lmsw,
380 x86_intercept_smsw,
381 x86_intercept_dr_read,
382 x86_intercept_dr_write,
383 x86_intercept_lidt,
384 x86_intercept_sidt,
385 x86_intercept_lgdt,
386 x86_intercept_sgdt,
387 x86_intercept_lldt,
388 x86_intercept_sldt,
389 x86_intercept_ltr,
390 x86_intercept_str,
391 x86_intercept_rdtsc,
392 x86_intercept_rdpmc,
393 x86_intercept_pushf,
394 x86_intercept_popf,
395 x86_intercept_cpuid,
396 x86_intercept_rsm,
397 x86_intercept_iret,
398 x86_intercept_intn,
399 x86_intercept_invd,
400 x86_intercept_pause,
401 x86_intercept_hlt,
402 x86_intercept_invlpg,
403 x86_intercept_invlpga,
404 x86_intercept_vmrun,
405 x86_intercept_vmload,
406 x86_intercept_vmsave,
407 x86_intercept_vmmcall,
408 x86_intercept_stgi,
409 x86_intercept_clgi,
410 x86_intercept_skinit,
411 x86_intercept_rdtscp,
412 x86_intercept_icebp,
413 x86_intercept_wbinvd,
414 x86_intercept_monitor,
415 x86_intercept_mwait,
416 x86_intercept_rdmsr,
417 x86_intercept_wrmsr,
418 x86_intercept_in,
419 x86_intercept_ins,
420 x86_intercept_out,
421 x86_intercept_outs,
422
423 nr_x86_intercepts
424};
425
426
427#if defined(CONFIG_X86_32)
428#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT32
429#elif defined(CONFIG_X86_64)
430#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT64
431#endif
432
433int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len);
434bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt);
435#define EMULATION_FAILED -1
436#define EMULATION_OK 0
437#define EMULATION_RESTART 1
438#define EMULATION_INTERCEPTED 2
439void init_decode_cache(struct x86_emulate_ctxt *ctxt);
440int x86_emulate_insn(struct x86_emulate_ctxt *ctxt);
441int emulator_task_switch(struct x86_emulate_ctxt *ctxt,
442 u16 tss_selector, int idt_index, int reason,
443 bool has_error_code, u32 error_code);
444int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq);
445void emulator_invalidate_register_cache(struct x86_emulate_ctxt *ctxt);
446void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt);
447bool emulator_can_use_gpa(struct x86_emulate_ctxt *ctxt);
448
449#endif
450