1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef QEMU_KVM_H
15#define QEMU_KVM_H
16
17#include <errno.h>
18#include "config-host.h"
19#include "qemu/queue.h"
20#include "qom/cpu.h"
21
22#ifdef CONFIG_KVM
23#include <linux/kvm.h>
24#include <linux/kvm_para.h>
25#else
26
27
28
29
30#define KVM_CPUID_SIGNATURE 0
31#define KVM_CPUID_FEATURES 0
32#define KVM_FEATURE_CLOCKSOURCE 0
33#define KVM_FEATURE_NOP_IO_DELAY 0
34#define KVM_FEATURE_MMU_OP 0
35#define KVM_FEATURE_CLOCKSOURCE2 0
36#define KVM_FEATURE_ASYNC_PF 0
37#define KVM_FEATURE_STEAL_TIME 0
38#define KVM_FEATURE_PV_EOI 0
39#define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT 0
40#endif
41
42extern bool kvm_allowed;
43extern bool kvm_kernel_irqchip;
44extern bool kvm_async_interrupts_allowed;
45extern bool kvm_halt_in_kernel_allowed;
46extern bool kvm_irqfds_allowed;
47extern bool kvm_msi_via_irqfd_allowed;
48extern bool kvm_gsi_routing_allowed;
49extern bool kvm_gsi_direct_mapping;
50extern bool kvm_readonly_mem_allowed;
51
52#if defined CONFIG_KVM || !defined NEED_CPU_H
53#define kvm_enabled() (kvm_allowed)
54
55
56
57
58
59
60
61
62
63
64
65#define kvm_irqchip_in_kernel() (kvm_kernel_irqchip)
66
67
68
69
70
71
72
73
74
75#define kvm_async_interrupts_enabled() (kvm_async_interrupts_allowed)
76
77
78
79
80
81
82
83#define kvm_halt_in_kernel() (kvm_halt_in_kernel_allowed)
84
85
86
87
88
89
90
91
92#define kvm_irqfds_enabled() (kvm_irqfds_allowed)
93
94
95
96
97
98
99
100
101#define kvm_msi_via_irqfd_enabled() (kvm_msi_via_irqfd_allowed)
102
103
104
105
106
107
108
109#define kvm_gsi_routing_enabled() (kvm_gsi_routing_allowed)
110
111
112
113
114
115
116#define kvm_gsi_direct_mapping() (kvm_gsi_direct_mapping)
117
118
119
120
121
122
123
124#define kvm_readonly_mem_enabled() (kvm_readonly_mem_allowed)
125
126#else
127#define kvm_enabled() (0)
128#define kvm_irqchip_in_kernel() (false)
129#define kvm_async_interrupts_enabled() (false)
130#define kvm_halt_in_kernel() (false)
131#define kvm_irqfds_enabled() (false)
132#define kvm_msi_via_irqfd_enabled() (false)
133#define kvm_gsi_routing_allowed() (false)
134#define kvm_gsi_direct_mapping() (false)
135#define kvm_readonly_mem_enabled() (false)
136#endif
137
138struct kvm_run;
139struct kvm_lapic_state;
140
141typedef struct KVMCapabilityInfo {
142 const char *name;
143 int value;
144} KVMCapabilityInfo;
145
146#define KVM_CAP_INFO(CAP) { "KVM_CAP_" stringify(CAP), KVM_CAP_##CAP }
147#define KVM_CAP_LAST_INFO { NULL, 0 }
148
149struct KVMState;
150typedef struct KVMState KVMState;
151extern KVMState *kvm_state;
152
153
154
155int kvm_init(void);
156
157int kvm_has_sync_mmu(void);
158int kvm_has_vcpu_events(void);
159int kvm_has_robust_singlestep(void);
160int kvm_has_debugregs(void);
161int kvm_has_xsave(void);
162int kvm_has_xcrs(void);
163int kvm_has_pit_state2(void);
164int kvm_has_many_ioeventfds(void);
165int kvm_has_gsi_routing(void);
166int kvm_has_intx_set_mask(void);
167
168int kvm_init_vcpu(CPUState *cpu);
169int kvm_cpu_exec(CPUState *cpu);
170
171#ifdef NEED_CPU_H
172
173void kvm_setup_guest_memory(void *start, size_t size);
174void kvm_flush_coalesced_mmio_buffer(void);
175
176int kvm_insert_breakpoint(CPUState *cpu, target_ulong addr,
177 target_ulong len, int type);
178int kvm_remove_breakpoint(CPUState *cpu, target_ulong addr,
179 target_ulong len, int type);
180void kvm_remove_all_breakpoints(CPUState *cpu);
181int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap);
182#ifndef _WIN32
183int kvm_set_signal_mask(CPUState *cpu, const sigset_t *sigset);
184#endif
185
186int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
187int kvm_on_sigbus(int code, void *addr);
188
189
190
191int kvm_ioctl(KVMState *s, int type, ...);
192
193int kvm_vm_ioctl(KVMState *s, int type, ...);
194
195int kvm_vcpu_ioctl(CPUState *cpu, int type, ...);
196
197
198
199extern const KVMCapabilityInfo kvm_arch_required_capabilities[];
200
201void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run);
202void kvm_arch_post_run(CPUState *cpu, struct kvm_run *run);
203
204int kvm_arch_handle_exit(CPUState *cpu, struct kvm_run *run);
205
206int kvm_arch_process_async_events(CPUState *cpu);
207
208int kvm_arch_get_registers(CPUState *cpu);
209
210
211#define KVM_PUT_RUNTIME_STATE 1
212
213#define KVM_PUT_RESET_STATE 2
214
215#define KVM_PUT_FULL_STATE 3
216
217int kvm_arch_put_registers(CPUState *cpu, int level);
218
219int kvm_arch_init(KVMState *s);
220
221int kvm_arch_init_vcpu(CPUState *cpu);
222
223
224unsigned long kvm_arch_vcpu_id(CPUState *cpu);
225
226void kvm_arch_reset_vcpu(CPUState *cpu);
227
228int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr);
229int kvm_arch_on_sigbus(int code, void *addr);
230
231void kvm_arch_init_irq_routing(KVMState *s);
232
233int kvm_set_irq(KVMState *s, int irq, int level);
234int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg);
235
236void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin);
237void kvm_irqchip_commit_routes(KVMState *s);
238
239void kvm_put_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
240void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
241
242struct kvm_guest_debug;
243struct kvm_debug_exit_arch;
244
245struct kvm_sw_breakpoint {
246 target_ulong pc;
247 target_ulong saved_insn;
248 int use_count;
249 QTAILQ_ENTRY(kvm_sw_breakpoint) entry;
250};
251
252QTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint);
253
254struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *cpu,
255 target_ulong pc);
256
257int kvm_sw_breakpoints_active(CPUState *cpu);
258
259int kvm_arch_insert_sw_breakpoint(CPUState *cpu,
260 struct kvm_sw_breakpoint *bp);
261int kvm_arch_remove_sw_breakpoint(CPUState *cpu,
262 struct kvm_sw_breakpoint *bp);
263int kvm_arch_insert_hw_breakpoint(target_ulong addr,
264 target_ulong len, int type);
265int kvm_arch_remove_hw_breakpoint(target_ulong addr,
266 target_ulong len, int type);
267void kvm_arch_remove_all_hw_breakpoints(void);
268
269void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg);
270
271bool kvm_arch_stop_on_emulation_error(CPUState *cpu);
272
273int kvm_check_extension(KVMState *s, unsigned int extension);
274
275uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
276 uint32_t index, int reg);
277
278#if !defined(CONFIG_USER_ONLY)
279int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
280 hwaddr *phys_addr);
281#endif
282
283#endif
284
285void kvm_cpu_synchronize_state(CPUState *cpu);
286void kvm_cpu_synchronize_post_reset(CPUState *cpu);
287void kvm_cpu_synchronize_post_init(CPUState *cpu);
288
289
290
291static inline void cpu_synchronize_state(CPUState *cpu)
292{
293 if (kvm_enabled()) {
294 kvm_cpu_synchronize_state(cpu);
295 }
296}
297
298static inline void cpu_synchronize_post_reset(CPUState *cpu)
299{
300 if (kvm_enabled()) {
301 kvm_cpu_synchronize_post_reset(cpu);
302 }
303}
304
305static inline void cpu_synchronize_post_init(CPUState *cpu)
306{
307 if (kvm_enabled()) {
308 kvm_cpu_synchronize_post_init(cpu);
309 }
310}
311
312int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg);
313int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg);
314void kvm_irqchip_release_virq(KVMState *s, int virq);
315
316int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
317 EventNotifier *rn, int virq);
318int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
319void kvm_pc_gsi_handler(void *opaque, int n, int level);
320void kvm_pc_setup_irq_routing(bool pci_enabled);
321void kvm_init_irq_routing(KVMState *s);
322#endif
323