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