/root/src/xen/xen/include/asm/hvm/emulate.h
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * hvm/emulate.h |
3 | | * |
4 | | * HVM instruction emulation. Used for MMIO and VMX real mode. |
5 | | * |
6 | | * Copyright (c) 2008 Citrix Systems, Inc. |
7 | | * |
8 | | * Authors: |
9 | | * Keir Fraser <keir@xen.org> |
10 | | */ |
11 | | |
12 | | #ifndef __ASM_X86_HVM_EMULATE_H__ |
13 | | #define __ASM_X86_HVM_EMULATE_H__ |
14 | | |
15 | | #include <xen/err.h> |
16 | | #include <asm/hvm/hvm.h> |
17 | | #include <asm/x86_emulate.h> |
18 | | |
19 | | typedef bool hvm_emulate_validate_t(const struct x86_emulate_state *state, |
20 | | const struct x86_emulate_ctxt *ctxt); |
21 | | |
22 | | struct hvm_emulate_ctxt { |
23 | | struct x86_emulate_ctxt ctxt; |
24 | | |
25 | | /* |
26 | | * validate: Post-decode, pre-emulate hook to allow caller controlled |
27 | | * filtering. |
28 | | */ |
29 | | hvm_emulate_validate_t *validate; |
30 | | |
31 | | /* Cache of 16 bytes of instruction. */ |
32 | | uint8_t insn_buf[16]; |
33 | | unsigned long insn_buf_eip; |
34 | | unsigned int insn_buf_bytes; |
35 | | |
36 | | struct segment_register seg_reg[10]; |
37 | | unsigned long seg_reg_accessed; |
38 | | unsigned long seg_reg_dirty; |
39 | | |
40 | | /* |
41 | | * MFNs behind temporary mappings in the write callback. The length is |
42 | | * arbitrary, and can be increased if writes longer than PAGE_SIZE+1 are |
43 | | * needed. |
44 | | */ |
45 | | mfn_t mfn[2]; |
46 | | |
47 | | uint32_t intr_shadow; |
48 | | |
49 | | bool_t set_context; |
50 | | }; |
51 | | |
52 | | enum emul_kind { |
53 | | EMUL_KIND_NORMAL, |
54 | | EMUL_KIND_NOWRITE, |
55 | | EMUL_KIND_SET_CONTEXT_DATA, |
56 | | EMUL_KIND_SET_CONTEXT_INSN |
57 | | }; |
58 | | |
59 | | bool __nonnull(1, 2) hvm_emulate_one_insn( |
60 | | hvm_emulate_validate_t *validate, |
61 | | const char *descr); |
62 | | int hvm_emulate_one( |
63 | | struct hvm_emulate_ctxt *hvmemul_ctxt); |
64 | | void hvm_emulate_one_vm_event(enum emul_kind kind, |
65 | | unsigned int trapnr, |
66 | | unsigned int errcode); |
67 | | /* Must be called once to set up hvmemul state. */ |
68 | | void hvm_emulate_init_once( |
69 | | struct hvm_emulate_ctxt *hvmemul_ctxt, |
70 | | hvm_emulate_validate_t *validate, |
71 | | struct cpu_user_regs *regs); |
72 | | /* Must be called once before each instruction emulated. */ |
73 | | void hvm_emulate_init_per_insn( |
74 | | struct hvm_emulate_ctxt *hvmemul_ctxt, |
75 | | const unsigned char *insn_buf, |
76 | | unsigned int insn_bytes); |
77 | | void hvm_emulate_writeback( |
78 | | struct hvm_emulate_ctxt *hvmemul_ctxt); |
79 | | int hvmemul_cpuid(uint32_t leaf, uint32_t subleaf, |
80 | | struct cpuid_leaf *res, struct x86_emulate_ctxt *ctxt); |
81 | | struct segment_register *hvmemul_get_seg_reg( |
82 | | enum x86_segment seg, |
83 | | struct hvm_emulate_ctxt *hvmemul_ctxt); |
84 | | int hvm_emulate_one_mmio(unsigned long mfn, unsigned long gla); |
85 | | |
86 | | static inline bool handle_mmio(void) |
87 | 60.1k | { |
88 | 60.1k | return hvm_emulate_one_insn(x86_insn_is_mem_access, "MMIO"); |
89 | 60.1k | } Unexecuted instantiation: cpu.c:handle_mmio Unexecuted instantiation: cpupool.c:handle_mmio Unexecuted instantiation: domctl.c:handle_mmio Unexecuted instantiation: domain.c:handle_mmio Unexecuted instantiation: event_2l.c:handle_mmio Unexecuted instantiation: event_channel.c:handle_mmio Unexecuted instantiation: event_fifo.c:handle_mmio Unexecuted instantiation: grant_table.c:handle_mmio Unexecuted instantiation: guestcopy.c:handle_mmio Unexecuted instantiation: kernel.c:handle_mmio Unexecuted instantiation: keyhandler.c:handle_mmio Unexecuted instantiation: kexec.c:handle_mmio Unexecuted instantiation: kimage.c:handle_mmio Unexecuted instantiation: mem_access.c:handle_mmio Unexecuted instantiation: memory.c:handle_mmio Unexecuted instantiation: monitor.c:handle_mmio Unexecuted instantiation: multicall.c:handle_mmio Unexecuted instantiation: page_alloc.c:handle_mmio Unexecuted instantiation: rangeset.c:handle_mmio Unexecuted instantiation: rcupdate.c:handle_mmio Unexecuted instantiation: sched_arinc653.c:handle_mmio Unexecuted instantiation: sched_credit.c:handle_mmio Unexecuted instantiation: sched_credit2.c:handle_mmio Unexecuted instantiation: sched_rt.c:handle_mmio Unexecuted instantiation: sched_null.c:handle_mmio Unexecuted instantiation: schedule.c:handle_mmio Unexecuted instantiation: shutdown.c:handle_mmio Unexecuted instantiation: softirq.c:handle_mmio Unexecuted instantiation: spinlock.c:handle_mmio Unexecuted instantiation: stop_machine.c:handle_mmio Unexecuted instantiation: symbols.c:handle_mmio Unexecuted instantiation: sysctl.c:handle_mmio Unexecuted instantiation: tasklet.c:handle_mmio Unexecuted instantiation: time.c:handle_mmio Unexecuted instantiation: timer.c:handle_mmio Unexecuted instantiation: trace.c:handle_mmio Unexecuted instantiation: vm_event.c:handle_mmio Unexecuted instantiation: vsprintf.c:handle_mmio Unexecuted instantiation: wait.c:handle_mmio Unexecuted instantiation: xenoprof.c:handle_mmio Unexecuted instantiation: tmem.c:handle_mmio Unexecuted instantiation: tmem_xen.c:handle_mmio Unexecuted instantiation: tmem_control.c:handle_mmio Unexecuted instantiation: llvm.c:handle_mmio Unexecuted instantiation: libelf-loader.c:handle_mmio Unexecuted instantiation: console.c:handle_mmio Unexecuted instantiation: ns16550.c:handle_mmio Unexecuted instantiation: cpufreq.c:handle_mmio Unexecuted instantiation: cpufreq_ondemand.c:handle_mmio Unexecuted instantiation: cpufreq_misc_governors.c:handle_mmio Unexecuted instantiation: utility.c:handle_mmio Unexecuted instantiation: vpci.c:handle_mmio Unexecuted instantiation: header.c:handle_mmio Unexecuted instantiation: msi.c:handle_mmio Unexecuted instantiation: msix.c:handle_mmio Unexecuted instantiation: iommu.c:handle_mmio Line | Count | Source | 87 | 60.1k | { | 88 | 60.1k | return hvm_emulate_one_insn(x86_insn_is_mem_access, "MMIO"); | 89 | 60.1k | } |
Unexecuted instantiation: pci.c:handle_mmio Unexecuted instantiation: utils.c:handle_mmio Unexecuted instantiation: qinval.c:handle_mmio Unexecuted instantiation: intremap.c:handle_mmio Unexecuted instantiation: quirks.c:handle_mmio Unexecuted instantiation: vtd.c:handle_mmio Unexecuted instantiation: ats.c:handle_mmio Unexecuted instantiation: iommu_init.c:handle_mmio Unexecuted instantiation: iommu_map.c:handle_mmio Unexecuted instantiation: pci_amd_iommu.c:handle_mmio Unexecuted instantiation: iommu_intr.c:handle_mmio Unexecuted instantiation: iommu_cmd.c:handle_mmio Unexecuted instantiation: iommu_guest.c:handle_mmio Unexecuted instantiation: pmstat.c:handle_mmio Unexecuted instantiation: xsm_core.c:handle_mmio Unexecuted instantiation: apic.c:handle_mmio Unexecuted instantiation: cpuid.c:handle_mmio Unexecuted instantiation: compat.c:handle_mmio Unexecuted instantiation: crash.c:handle_mmio Unexecuted instantiation: debug.c:handle_mmio Unexecuted instantiation: domain_page.c:handle_mmio Unexecuted instantiation: flushtlb.c:handle_mmio Unexecuted instantiation: hypercall.c:handle_mmio Unexecuted instantiation: i387.c:handle_mmio Unexecuted instantiation: i8259.c:handle_mmio Unexecuted instantiation: io_apic.c:handle_mmio Unexecuted instantiation: msr.c:handle_mmio Unexecuted instantiation: ioport_emulate.c:handle_mmio Unexecuted instantiation: irq.c:handle_mmio Unexecuted instantiation: machine_kexec.c:handle_mmio Unexecuted instantiation: microcode_amd.c:handle_mmio Unexecuted instantiation: microcode_intel.c:handle_mmio Unexecuted instantiation: microcode.c:handle_mmio Unexecuted instantiation: mm.c:handle_mmio Unexecuted instantiation: mpparse.c:handle_mmio Unexecuted instantiation: nmi.c:handle_mmio Unexecuted instantiation: numa.c:handle_mmio Unexecuted instantiation: physdev.c:handle_mmio Unexecuted instantiation: platform_hypercall.c:handle_mmio Unexecuted instantiation: psr.c:handle_mmio Unexecuted instantiation: setup.c:handle_mmio Unexecuted instantiation: smp.c:handle_mmio Unexecuted instantiation: smpboot.c:handle_mmio Unexecuted instantiation: traps.c:handle_mmio Unexecuted instantiation: usercopy.c:handle_mmio Unexecuted instantiation: x86_emulate.c:handle_mmio Unexecuted instantiation: tboot.c:handle_mmio Unexecuted instantiation: xstate.c:handle_mmio Unexecuted instantiation: power.c:handle_mmio Unexecuted instantiation: suspend.c:handle_mmio Unexecuted instantiation: cpu_idle.c:handle_mmio Unexecuted instantiation: amd.c:handle_mmio Unexecuted instantiation: common.c:handle_mmio Unexecuted instantiation: intel.c:handle_mmio Unexecuted instantiation: mwait-idle.c:handle_mmio Unexecuted instantiation: vpmu.c:handle_mmio Unexecuted instantiation: vpmu_amd.c:handle_mmio Unexecuted instantiation: vpmu_intel.c:handle_mmio Unexecuted instantiation: amd_nonfatal.c:handle_mmio Unexecuted instantiation: mce_amd.c:handle_mmio Unexecuted instantiation: mcaction.c:handle_mmio Unexecuted instantiation: barrier.c:handle_mmio Unexecuted instantiation: mctelem.c:handle_mmio Unexecuted instantiation: mce.c:handle_mmio Unexecuted instantiation: mce-apei.c:handle_mmio Unexecuted instantiation: mce_intel.c:handle_mmio Unexecuted instantiation: non-fatal.c:handle_mmio Unexecuted instantiation: util.c:handle_mmio Unexecuted instantiation: vmce.c:handle_mmio Unexecuted instantiation: delivery.c:handle_mmio Unexecuted instantiation: asid.c:handle_mmio Unexecuted instantiation: dm.c:handle_mmio Unexecuted instantiation: emulate.c:handle_mmio Unexecuted instantiation: hpet.c:handle_mmio Unexecuted instantiation: hvm.c:handle_mmio Unexecuted instantiation: i8254.c:handle_mmio Unexecuted instantiation: intercept.c:handle_mmio Unexecuted instantiation: ioreq.c:handle_mmio Unexecuted instantiation: mtrr.c:handle_mmio Unexecuted instantiation: nestedhvm.c:handle_mmio Unexecuted instantiation: pmtimer.c:handle_mmio Unexecuted instantiation: rtc.c:handle_mmio Unexecuted instantiation: save.c:handle_mmio Unexecuted instantiation: stdvga.c:handle_mmio Unexecuted instantiation: vioapic.c:handle_mmio Unexecuted instantiation: viridian.c:handle_mmio Unexecuted instantiation: vlapic.c:handle_mmio Unexecuted instantiation: vmsi.c:handle_mmio Unexecuted instantiation: vpic.c:handle_mmio Unexecuted instantiation: vpt.c:handle_mmio Unexecuted instantiation: intr.c:handle_mmio Unexecuted instantiation: nestedsvm.c:handle_mmio Unexecuted instantiation: svm.c:handle_mmio Unexecuted instantiation: svmdebug.c:handle_mmio Unexecuted instantiation: vmcb.c:handle_mmio Unexecuted instantiation: realmode.c:handle_mmio Unexecuted instantiation: vmcs.c:handle_mmio Unexecuted instantiation: vmx.c:handle_mmio Unexecuted instantiation: vvmx.c:handle_mmio Unexecuted instantiation: paging.c:handle_mmio Unexecuted instantiation: p2m.c:handle_mmio Unexecuted instantiation: p2m-pt.c:handle_mmio Unexecuted instantiation: p2m-ept.c:handle_mmio Unexecuted instantiation: p2m-pod.c:handle_mmio Unexecuted instantiation: altp2m.c:handle_mmio Unexecuted instantiation: guest_walk.c:handle_mmio Unexecuted instantiation: mem_paging.c:handle_mmio Unexecuted instantiation: mem_sharing.c:handle_mmio Unexecuted instantiation: multi.c:handle_mmio Unexecuted instantiation: hap.c:handle_mmio Unexecuted instantiation: nested_hap.c:handle_mmio Unexecuted instantiation: nested_ept.c:handle_mmio Unexecuted instantiation: nmi_int.c:handle_mmio Unexecuted instantiation: op_model_ppro.c:handle_mmio Unexecuted instantiation: op_model_athlon.c:handle_mmio Unexecuted instantiation: backtrace.c:handle_mmio Unexecuted instantiation: callback.c:handle_mmio Unexecuted instantiation: descriptor-tables.c:handle_mmio Unexecuted instantiation: emul-gate-op.c:handle_mmio Unexecuted instantiation: emul-inv-op.c:handle_mmio Unexecuted instantiation: emul-priv-op.c:handle_mmio Unexecuted instantiation: iret.c:handle_mmio Unexecuted instantiation: misc-hypercalls.c:handle_mmio Unexecuted instantiation: ro-page-fault.c:handle_mmio |
90 | | |
91 | | int hvmemul_insn_fetch(enum x86_segment seg, |
92 | | unsigned long offset, |
93 | | void *p_data, |
94 | | unsigned int bytes, |
95 | | struct x86_emulate_ctxt *ctxt); |
96 | | int hvmemul_do_pio_buffer(uint16_t port, |
97 | | unsigned int size, |
98 | | uint8_t dir, |
99 | | void *buffer); |
100 | | |
101 | | void hvm_dump_emulation_state(const char *loglvl, const char *prefix, |
102 | | struct hvm_emulate_ctxt *hvmemul_ctxt, int rc); |
103 | | |
104 | | #endif /* __ASM_X86_HVM_EMULATE_H__ */ |
105 | | |
106 | | /* |
107 | | * Local variables: |
108 | | * mode: C |
109 | | * c-file-style: "BSD" |
110 | | * c-basic-offset: 4 |
111 | | * tab-width: 4 |
112 | | * indent-tabs-mode: nil |
113 | | * End: |
114 | | */ |