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 (*write_std)(struct x86_emulate_ctxt *ctxt,
122 unsigned long addr, void *val, unsigned int bytes,
123 struct x86_exception *fault);
124
125
126
127
128
129
130
131 int (*fetch)(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 (*read_emulated)(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
152 int (*write_emulated)(struct x86_emulate_ctxt *ctxt,
153 unsigned long addr, const void *val,
154 unsigned int bytes,
155 struct x86_exception *fault);
156
157
158
159
160
161
162
163
164
165 int (*cmpxchg_emulated)(struct x86_emulate_ctxt *ctxt,
166 unsigned long addr,
167 const void *old,
168 const void *new,
169 unsigned int bytes,
170 struct x86_exception *fault);
171 void (*invlpg)(struct x86_emulate_ctxt *ctxt, ulong addr);
172
173 int (*pio_in_emulated)(struct x86_emulate_ctxt *ctxt,
174 int size, unsigned short port, void *val,
175 unsigned int count);
176
177 int (*pio_out_emulated)(struct x86_emulate_ctxt *ctxt,
178 int size, unsigned short port, const void *val,
179 unsigned int count);
180
181 bool (*get_segment)(struct x86_emulate_ctxt *ctxt, u16 *selector,
182 struct desc_struct *desc, u32 *base3, int seg);
183 void (*set_segment)(struct x86_emulate_ctxt *ctxt, u16 selector,
184 struct desc_struct *desc, u32 base3, int seg);
185 unsigned long (*get_cached_segment_base)(struct x86_emulate_ctxt *ctxt,
186 int seg);
187 void (*get_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
188 void (*get_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
189 void (*set_gdt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
190 void (*set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
191 ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr);
192 int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val);
193 int (*cpl)(struct x86_emulate_ctxt *ctxt);
194 int (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
195 int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
196 int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
197 int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
198 int (*check_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc);
199 int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata);
200 void (*halt)(struct x86_emulate_ctxt *ctxt);
201 void (*wbinvd)(struct x86_emulate_ctxt *ctxt);
202 int (*fix_hypercall)(struct x86_emulate_ctxt *ctxt);
203 void (*get_fpu)(struct x86_emulate_ctxt *ctxt);
204 void (*put_fpu)(struct x86_emulate_ctxt *ctxt);
205 int (*intercept)(struct x86_emulate_ctxt *ctxt,
206 struct x86_instruction_info *info,
207 enum x86_intercept_stage stage);
208
209 void (*get_cpuid)(struct x86_emulate_ctxt *ctxt,
210 u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
211 void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked);
212};
213
214typedef u32 __attribute__((vector_size(16))) sse128_t;
215
216
217struct operand {
218 enum { OP_REG, OP_MEM, OP_MEM_STR, OP_IMM, OP_XMM, OP_MM, OP_NONE } type;
219 unsigned int bytes;
220 unsigned int count;
221 union {
222 unsigned long orig_val;
223 u64 orig_val64;
224 };
225 union {
226 unsigned long *reg;
227 struct segmented_address {
228 ulong ea;
229 unsigned seg;
230 } mem;
231 unsigned xmm;
232 unsigned mm;
233 } addr;
234 union {
235 unsigned long val;
236 u64 val64;
237 char valptr[sizeof(sse128_t)];
238 sse128_t vec_val;
239 u64 mm_val;
240 void *data;
241 };
242};
243
244struct fetch_cache {
245 u8 data[15];
246 u8 *ptr;
247 u8 *end;
248};
249
250struct read_cache {
251 u8 data[1024];
252 unsigned long pos;
253 unsigned long end;
254};
255
256
257enum x86emul_mode {
258 X86EMUL_MODE_REAL,
259 X86EMUL_MODE_VM86,
260 X86EMUL_MODE_PROT16,
261 X86EMUL_MODE_PROT32,
262 X86EMUL_MODE_PROT64,
263};
264
265struct x86_emulate_ctxt {
266 const struct x86_emulate_ops *ops;
267
268
269 unsigned long eflags;
270 unsigned long eip;
271
272 enum x86emul_mode mode;
273
274
275 int interruptibility;
276
277 bool guest_mode;
278 bool perm_ok;
279 bool ud;
280
281 bool have_exception;
282 struct x86_exception exception;
283
284
285
286
287
288
289 u8 opcode_len;
290 u8 b;
291 u8 intercept;
292 u8 op_bytes;
293 u8 ad_bytes;
294 struct operand src;
295 struct operand src2;
296 struct operand dst;
297 int (*execute)(struct x86_emulate_ctxt *ctxt);
298 int (*check_perm)(struct x86_emulate_ctxt *ctxt);
299
300
301
302
303
304 bool rip_relative;
305 u8 rex_prefix;
306 u8 lock_prefix;
307 u8 rep_prefix;
308
309 u32 regs_valid;
310
311 u32 regs_dirty;
312
313 u8 modrm;
314 u8 modrm_mod;
315 u8 modrm_reg;
316 u8 modrm_rm;
317 u8 modrm_seg;
318 u8 seg_override;
319 u64 d;
320 unsigned long _eip;
321 struct operand memop;
322
323 unsigned long _regs[NR_VCPU_REGS];
324 struct operand *memopp;
325 struct fetch_cache fetch;
326 struct read_cache io_read;
327 struct read_cache mem_read;
328};
329
330
331#define REPE_PREFIX 0xf3
332#define REPNE_PREFIX 0xf2
333
334
335#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ebx 0x68747541
336#define X86EMUL_CPUID_VENDOR_AuthenticAMD_ecx 0x444d4163
337#define X86EMUL_CPUID_VENDOR_AuthenticAMD_edx 0x69746e65
338
339#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ebx 0x69444d41
340#define X86EMUL_CPUID_VENDOR_AMDisbetterI_ecx 0x21726574
341#define X86EMUL_CPUID_VENDOR_AMDisbetterI_edx 0x74656273
342
343#define X86EMUL_CPUID_VENDOR_GenuineIntel_ebx 0x756e6547
344#define X86EMUL_CPUID_VENDOR_GenuineIntel_ecx 0x6c65746e
345#define X86EMUL_CPUID_VENDOR_GenuineIntel_edx 0x49656e69
346
347enum x86_intercept_stage {
348 X86_ICTP_NONE = 0,
349 X86_ICPT_PRE_EXCEPT,
350 X86_ICPT_POST_EXCEPT,
351 X86_ICPT_POST_MEMACCESS,
352};
353
354enum x86_intercept {
355 x86_intercept_none,
356 x86_intercept_cr_read,
357 x86_intercept_cr_write,
358 x86_intercept_clts,
359 x86_intercept_lmsw,
360 x86_intercept_smsw,
361 x86_intercept_dr_read,
362 x86_intercept_dr_write,
363 x86_intercept_lidt,
364 x86_intercept_sidt,
365 x86_intercept_lgdt,
366 x86_intercept_sgdt,
367 x86_intercept_lldt,
368 x86_intercept_sldt,
369 x86_intercept_ltr,
370 x86_intercept_str,
371 x86_intercept_rdtsc,
372 x86_intercept_rdpmc,
373 x86_intercept_pushf,
374 x86_intercept_popf,
375 x86_intercept_cpuid,
376 x86_intercept_rsm,
377 x86_intercept_iret,
378 x86_intercept_intn,
379 x86_intercept_invd,
380 x86_intercept_pause,
381 x86_intercept_hlt,
382 x86_intercept_invlpg,
383 x86_intercept_invlpga,
384 x86_intercept_vmrun,
385 x86_intercept_vmload,
386 x86_intercept_vmsave,
387 x86_intercept_vmmcall,
388 x86_intercept_stgi,
389 x86_intercept_clgi,
390 x86_intercept_skinit,
391 x86_intercept_rdtscp,
392 x86_intercept_icebp,
393 x86_intercept_wbinvd,
394 x86_intercept_monitor,
395 x86_intercept_mwait,
396 x86_intercept_rdmsr,
397 x86_intercept_wrmsr,
398 x86_intercept_in,
399 x86_intercept_ins,
400 x86_intercept_out,
401 x86_intercept_outs,
402
403 nr_x86_intercepts
404};
405
406
407#if defined(CONFIG_X86_32)
408#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT32
409#elif defined(CONFIG_X86_64)
410#define X86EMUL_MODE_HOST X86EMUL_MODE_PROT64
411#endif
412
413int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len);
414bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt);
415#define EMULATION_FAILED -1
416#define EMULATION_OK 0
417#define EMULATION_RESTART 1
418#define EMULATION_INTERCEPTED 2
419void init_decode_cache(struct x86_emulate_ctxt *ctxt);
420int x86_emulate_insn(struct x86_emulate_ctxt *ctxt);
421int emulator_task_switch(struct x86_emulate_ctxt *ctxt,
422 u16 tss_selector, int idt_index, int reason,
423 bool has_error_code, u32 error_code);
424int emulate_int_real(struct x86_emulate_ctxt *ctxt, int irq);
425void emulator_invalidate_register_cache(struct x86_emulate_ctxt *ctxt);
426void emulator_writeback_register_cache(struct x86_emulate_ctxt *ctxt);
427
428#endif
429