diff options
Diffstat (limited to 'arch/x86/include/asm/kvm_emulate.h')
-rw-r--r-- | arch/x86/include/asm/kvm_emulate.h | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h index a04fe4eb237d..eb181178fe0b 100644 --- a/arch/x86/include/asm/kvm_emulate.h +++ b/arch/x86/include/asm/kvm_emulate.h | |||
@@ -37,6 +37,7 @@ struct x86_instruction_info { | |||
37 | u8 modrm_reg; /* index of register used */ | 37 | u8 modrm_reg; /* index of register used */ |
38 | u8 modrm_rm; /* rm part of modrm */ | 38 | u8 modrm_rm; /* rm part of modrm */ |
39 | u64 src_val; /* value of source operand */ | 39 | u64 src_val; /* value of source operand */ |
40 | u64 dst_val; /* value of destination operand */ | ||
40 | u8 src_bytes; /* size of source operand */ | 41 | u8 src_bytes; /* size of source operand */ |
41 | u8 dst_bytes; /* size of destination operand */ | 42 | u8 dst_bytes; /* size of destination operand */ |
42 | u8 ad_bytes; /* size of src/dst address */ | 43 | u8 ad_bytes; /* size of src/dst address */ |
@@ -194,6 +195,7 @@ struct x86_emulate_ops { | |||
194 | int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value); | 195 | int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value); |
195 | int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data); | 196 | int (*set_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data); |
196 | int (*get_msr)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata); | 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); | ||
197 | int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata); | 199 | int (*read_pmc)(struct x86_emulate_ctxt *ctxt, u32 pmc, u64 *pdata); |
198 | void (*halt)(struct x86_emulate_ctxt *ctxt); | 200 | void (*halt)(struct x86_emulate_ctxt *ctxt); |
199 | void (*wbinvd)(struct x86_emulate_ctxt *ctxt); | 201 | void (*wbinvd)(struct x86_emulate_ctxt *ctxt); |
@@ -231,7 +233,7 @@ struct operand { | |||
231 | union { | 233 | union { |
232 | unsigned long val; | 234 | unsigned long val; |
233 | u64 val64; | 235 | u64 val64; |
234 | char valptr[sizeof(unsigned long) + 2]; | 236 | char valptr[sizeof(sse128_t)]; |
235 | sse128_t vec_val; | 237 | sse128_t vec_val; |
236 | u64 mm_val; | 238 | u64 mm_val; |
237 | void *data; | 239 | void *data; |
@@ -240,8 +242,8 @@ struct operand { | |||
240 | 242 | ||
241 | struct fetch_cache { | 243 | struct fetch_cache { |
242 | u8 data[15]; | 244 | u8 data[15]; |
243 | unsigned long start; | 245 | u8 *ptr; |
244 | unsigned long end; | 246 | u8 *end; |
245 | }; | 247 | }; |
246 | 248 | ||
247 | struct read_cache { | 249 | struct read_cache { |
@@ -286,30 +288,36 @@ struct x86_emulate_ctxt { | |||
286 | u8 opcode_len; | 288 | u8 opcode_len; |
287 | u8 b; | 289 | u8 b; |
288 | u8 intercept; | 290 | u8 intercept; |
289 | u8 lock_prefix; | ||
290 | u8 rep_prefix; | ||
291 | u8 op_bytes; | 291 | u8 op_bytes; |
292 | u8 ad_bytes; | 292 | u8 ad_bytes; |
293 | u8 rex_prefix; | ||
294 | struct operand src; | 293 | struct operand src; |
295 | struct operand src2; | 294 | struct operand src2; |
296 | struct operand dst; | 295 | struct operand dst; |
297 | bool has_seg_override; | ||
298 | u8 seg_override; | ||
299 | u64 d; | ||
300 | int (*execute)(struct x86_emulate_ctxt *ctxt); | 296 | int (*execute)(struct x86_emulate_ctxt *ctxt); |
301 | int (*check_perm)(struct x86_emulate_ctxt *ctxt); | 297 | int (*check_perm)(struct x86_emulate_ctxt *ctxt); |
298 | /* | ||
299 | * The following six fields are cleared together, | ||
300 | * the rest are initialized unconditionally in x86_decode_insn | ||
301 | * or elsewhere | ||
302 | */ | ||
303 | bool rip_relative; | ||
304 | u8 rex_prefix; | ||
305 | u8 lock_prefix; | ||
306 | u8 rep_prefix; | ||
307 | /* bitmaps of registers in _regs[] that can be read */ | ||
308 | u32 regs_valid; | ||
309 | /* bitmaps of registers in _regs[] that have been written */ | ||
310 | u32 regs_dirty; | ||
302 | /* modrm */ | 311 | /* modrm */ |
303 | u8 modrm; | 312 | u8 modrm; |
304 | u8 modrm_mod; | 313 | u8 modrm_mod; |
305 | u8 modrm_reg; | 314 | u8 modrm_reg; |
306 | u8 modrm_rm; | 315 | u8 modrm_rm; |
307 | u8 modrm_seg; | 316 | u8 modrm_seg; |
308 | bool rip_relative; | 317 | u8 seg_override; |
318 | u64 d; | ||
309 | unsigned long _eip; | 319 | unsigned long _eip; |
310 | struct operand memop; | 320 | struct operand memop; |
311 | u32 regs_valid; /* bitmaps of registers in _regs[] that can be read */ | ||
312 | u32 regs_dirty; /* bitmaps of registers in _regs[] that have been written */ | ||
313 | /* Fields above regs are cleared together. */ | 321 | /* Fields above regs are cleared together. */ |
314 | unsigned long _regs[NR_VCPU_REGS]; | 322 | unsigned long _regs[NR_VCPU_REGS]; |
315 | struct operand *memopp; | 323 | struct operand *memopp; |
@@ -407,6 +415,7 @@ bool x86_page_table_writing_insn(struct x86_emulate_ctxt *ctxt); | |||
407 | #define EMULATION_OK 0 | 415 | #define EMULATION_OK 0 |
408 | #define EMULATION_RESTART 1 | 416 | #define EMULATION_RESTART 1 |
409 | #define EMULATION_INTERCEPTED 2 | 417 | #define EMULATION_INTERCEPTED 2 |
418 | void init_decode_cache(struct x86_emulate_ctxt *ctxt); | ||
410 | int x86_emulate_insn(struct x86_emulate_ctxt *ctxt); | 419 | int x86_emulate_insn(struct x86_emulate_ctxt *ctxt); |
411 | int emulator_task_switch(struct x86_emulate_ctxt *ctxt, | 420 | int emulator_task_switch(struct x86_emulate_ctxt *ctxt, |
412 | u16 tss_selector, int idt_index, int reason, | 421 | u16 tss_selector, int idt_index, int reason, |