aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 1 | /* |
| 2 | * QEMU KVM support |
| 3 | * |
| 4 | * Copyright IBM, Corp. 2008 |
| 5 | * |
| 6 | * Authors: |
| 7 | * Anthony Liguori <aliguori@us.ibm.com> |
| 8 | * |
| 9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| 10 | * See the COPYING file in the top-level directory. |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | #ifndef QEMU_KVM_H |
| 15 | #define QEMU_KVM_H |
| 16 | |
Michael S. Tsirkin | ca82180 | 2010-03-17 13:07:54 +0200 | [diff] [blame] | 17 | #include <errno.h> |
Blue Swirl | 1c14f16 | 2010-03-29 19:23:47 +0000 | [diff] [blame] | 18 | #include "config-host.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 19 | #include "qemu/queue.h" |
Andreas Färber | 504134d | 2012-12-17 06:38:45 +0100 | [diff] [blame] | 20 | #include "qom/cpu.h" |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 21 | |
Michael S. Tsirkin | ca82180 | 2010-03-17 13:07:54 +0200 | [diff] [blame] | 22 | #ifdef CONFIG_KVM |
| 23 | #include <linux/kvm.h> |
Eduardo Habkost | bc74b7d | 2012-10-04 17:49:05 -0300 | [diff] [blame] | 24 | #include <linux/kvm_para.h> |
Eduardo Habkost | 9ca5892 | 2013-01-07 16:20:42 -0200 | [diff] [blame] | 25 | #else |
| 26 | /* These constants must never be used at runtime if kvm_enabled() is false. |
| 27 | * They exist so we don't need #ifdefs around KVM-specific code that already |
| 28 | * checks kvm_enabled() properly. |
| 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 |
Eduardo Habkost | d61a23b | 2013-01-17 18:59:27 -0200 | [diff] [blame] | 39 | #define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT 0 |
Michael S. Tsirkin | ca82180 | 2010-03-17 13:07:54 +0200 | [diff] [blame] | 40 | #endif |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 41 | |
liguang | d5286af | 2013-01-24 13:03:27 +0800 | [diff] [blame] | 42 | extern bool kvm_allowed; |
Jan Kiszka | 3d4b264 | 2012-01-31 19:17:52 +0100 | [diff] [blame] | 43 | extern bool kvm_kernel_irqchip; |
Peter Maydell | 7ae26bd | 2012-07-26 15:35:11 +0100 | [diff] [blame] | 44 | extern bool kvm_async_interrupts_allowed; |
Alexander Graf | 215e79c | 2013-04-24 22:24:12 +0200 | [diff] [blame] | 45 | extern bool kvm_halt_in_kernel_allowed; |
Peter Maydell | cc7e0dd | 2012-07-26 15:35:14 +0100 | [diff] [blame] | 46 | extern bool kvm_irqfds_allowed; |
Peter Maydell | 614e41b | 2012-07-26 15:35:15 +0100 | [diff] [blame] | 47 | extern bool kvm_msi_via_irqfd_allowed; |
Peter Maydell | f3e1bed | 2012-07-26 15:35:16 +0100 | [diff] [blame] | 48 | extern bool kvm_gsi_routing_allowed; |
Alexey Kardashevskiy | 76fe21d | 2013-09-03 18:08:25 +1000 | [diff] [blame] | 49 | extern bool kvm_gsi_direct_mapping; |
Jordan Justen | df9c8b7 | 2013-05-29 01:27:25 -0700 | [diff] [blame] | 50 | extern bool kvm_readonly_mem_allowed; |
Paolo Bonzini | 98c8573 | 2010-04-19 18:59:30 +0000 | [diff] [blame] | 51 | |
| 52 | #if defined CONFIG_KVM || !defined NEED_CPU_H |
Jan Kiszka | 3d4b264 | 2012-01-31 19:17:52 +0100 | [diff] [blame] | 53 | #define kvm_enabled() (kvm_allowed) |
Peter Maydell | 96fda35 | 2012-07-26 15:35:17 +0100 | [diff] [blame] | 54 | /** |
| 55 | * kvm_irqchip_in_kernel: |
| 56 | * |
| 57 | * Returns: true if the user asked us to create an in-kernel |
| 58 | * irqchip via the "kernel_irqchip=on" machine option. |
| 59 | * What this actually means is architecture and machine model |
| 60 | * specific: on PC, for instance, it means that the LAPIC, |
| 61 | * IOAPIC and PIT are all in kernel. This function should never |
| 62 | * be used from generic target-independent code: use one of the |
| 63 | * following functions or some other specific check instead. |
| 64 | */ |
Jan Kiszka | 3d4b264 | 2012-01-31 19:17:52 +0100 | [diff] [blame] | 65 | #define kvm_irqchip_in_kernel() (kvm_kernel_irqchip) |
Peter Maydell | 7ae26bd | 2012-07-26 15:35:11 +0100 | [diff] [blame] | 66 | |
| 67 | /** |
| 68 | * kvm_async_interrupts_enabled: |
| 69 | * |
| 70 | * Returns: true if we can deliver interrupts to KVM |
| 71 | * asynchronously (ie by ioctl from any thread at any time) |
| 72 | * rather than having to do interrupt delivery synchronously |
| 73 | * (where the vcpu must be stopped at a suitable point first). |
| 74 | */ |
| 75 | #define kvm_async_interrupts_enabled() (kvm_async_interrupts_allowed) |
| 76 | |
Peter Maydell | cc7e0dd | 2012-07-26 15:35:14 +0100 | [diff] [blame] | 77 | /** |
Alexander Graf | 215e79c | 2013-04-24 22:24:12 +0200 | [diff] [blame] | 78 | * kvm_halt_in_kernel |
| 79 | * |
| 80 | * Returns: true if halted cpus should still get a KVM_RUN ioctl to run |
| 81 | * inside of kernel space. This only works if MP state is implemented. |
| 82 | */ |
| 83 | #define kvm_halt_in_kernel() (kvm_halt_in_kernel_allowed) |
| 84 | |
| 85 | /** |
Peter Maydell | cc7e0dd | 2012-07-26 15:35:14 +0100 | [diff] [blame] | 86 | * kvm_irqfds_enabled: |
| 87 | * |
| 88 | * Returns: true if we can use irqfds to inject interrupts into |
| 89 | * a KVM CPU (ie the kernel supports irqfds and we are running |
| 90 | * with a configuration where it is meaningful to use them). |
| 91 | */ |
| 92 | #define kvm_irqfds_enabled() (kvm_irqfds_allowed) |
| 93 | |
Peter Maydell | 614e41b | 2012-07-26 15:35:15 +0100 | [diff] [blame] | 94 | /** |
| 95 | * kvm_msi_via_irqfd_enabled: |
| 96 | * |
| 97 | * Returns: true if we can route a PCI MSI (Message Signaled Interrupt) |
| 98 | * to a KVM CPU via an irqfd. This requires that the kernel supports |
| 99 | * this and that we're running in a configuration that permits it. |
| 100 | */ |
| 101 | #define kvm_msi_via_irqfd_enabled() (kvm_msi_via_irqfd_allowed) |
| 102 | |
Peter Maydell | f3e1bed | 2012-07-26 15:35:16 +0100 | [diff] [blame] | 103 | /** |
| 104 | * kvm_gsi_routing_enabled: |
| 105 | * |
| 106 | * Returns: true if GSI routing is enabled (ie the kernel supports |
| 107 | * it and we're running in a configuration that permits it). |
| 108 | */ |
| 109 | #define kvm_gsi_routing_enabled() (kvm_gsi_routing_allowed) |
| 110 | |
Jordan Justen | df9c8b7 | 2013-05-29 01:27:25 -0700 | [diff] [blame] | 111 | /** |
Alexey Kardashevskiy | 76fe21d | 2013-09-03 18:08:25 +1000 | [diff] [blame] | 112 | * kvm_gsi_direct_mapping: |
| 113 | * |
| 114 | * Returns: true if GSI direct mapping is enabled. |
| 115 | */ |
| 116 | #define kvm_gsi_direct_mapping() (kvm_gsi_direct_mapping) |
| 117 | |
| 118 | /** |
Jordan Justen | df9c8b7 | 2013-05-29 01:27:25 -0700 | [diff] [blame] | 119 | * kvm_readonly_mem_enabled: |
| 120 | * |
| 121 | * Returns: true if KVM readonly memory is enabled (ie the kernel |
| 122 | * supports it and we're running in a configuration that permits it). |
| 123 | */ |
| 124 | #define kvm_readonly_mem_enabled() (kvm_readonly_mem_allowed) |
| 125 | |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 126 | #else |
Jan Kiszka | 3d4b264 | 2012-01-31 19:17:52 +0100 | [diff] [blame] | 127 | #define kvm_enabled() (0) |
| 128 | #define kvm_irqchip_in_kernel() (false) |
Peter Maydell | 7ae26bd | 2012-07-26 15:35:11 +0100 | [diff] [blame] | 129 | #define kvm_async_interrupts_enabled() (false) |
Alexander Graf | 215e79c | 2013-04-24 22:24:12 +0200 | [diff] [blame] | 130 | #define kvm_halt_in_kernel() (false) |
Peter Maydell | cc7e0dd | 2012-07-26 15:35:14 +0100 | [diff] [blame] | 131 | #define kvm_irqfds_enabled() (false) |
Peter Maydell | 614e41b | 2012-07-26 15:35:15 +0100 | [diff] [blame] | 132 | #define kvm_msi_via_irqfd_enabled() (false) |
Peter Maydell | f3e1bed | 2012-07-26 15:35:16 +0100 | [diff] [blame] | 133 | #define kvm_gsi_routing_allowed() (false) |
Alexey Kardashevskiy | 76fe21d | 2013-09-03 18:08:25 +1000 | [diff] [blame] | 134 | #define kvm_gsi_direct_mapping() (false) |
Jordan Justen | df9c8b7 | 2013-05-29 01:27:25 -0700 | [diff] [blame] | 135 | #define kvm_readonly_mem_enabled() (false) |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 136 | #endif |
| 137 | |
| 138 | struct kvm_run; |
Jan Kiszka | 680c1c6 | 2011-10-16 13:23:26 +0200 | [diff] [blame] | 139 | struct kvm_lapic_state; |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 140 | |
Jan Kiszka | 94a8d39 | 2011-01-21 21:48:17 +0100 | [diff] [blame] | 141 | typedef 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 | |
Jan Kiszka | 92b4e48 | 2012-05-17 10:32:33 -0300 | [diff] [blame] | 149 | struct KVMState; |
| 150 | typedef struct KVMState KVMState; |
| 151 | extern KVMState *kvm_state; |
| 152 | |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 153 | /* external API */ |
| 154 | |
Jan Kiszka | cad1e28 | 2011-01-21 21:48:16 +0100 | [diff] [blame] | 155 | int kvm_init(void); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 156 | |
Paolo Bonzini | 00a1555 | 2010-04-01 19:57:11 +0200 | [diff] [blame] | 157 | int kvm_has_sync_mmu(void); |
| 158 | int kvm_has_vcpu_events(void); |
| 159 | int kvm_has_robust_singlestep(void); |
Jan Kiszka | ff44f1a | 2010-03-12 15:20:49 +0100 | [diff] [blame] | 160 | int kvm_has_debugregs(void); |
Sheng Yang | f1665b2 | 2010-06-17 17:53:07 +0800 | [diff] [blame] | 161 | int kvm_has_xsave(void); |
| 162 | int kvm_has_xcrs(void); |
Jan Kiszka | 8a7c739 | 2012-03-02 20:28:48 +0100 | [diff] [blame] | 163 | int kvm_has_pit_state2(void); |
Stefan Hajnoczi | d2f2b8a | 2011-01-10 13:50:05 +0200 | [diff] [blame] | 164 | int kvm_has_many_ioeventfds(void); |
Jan Kiszka | 84b058d | 2011-10-15 11:49:47 +0200 | [diff] [blame] | 165 | int kvm_has_gsi_routing(void); |
Jan Kiszka | 3ab7384 | 2012-08-27 08:28:39 +0200 | [diff] [blame] | 166 | int kvm_has_intx_set_mask(void); |
Paolo Bonzini | 00a1555 | 2010-04-01 19:57:11 +0200 | [diff] [blame] | 167 | |
Andreas Färber | 504134d | 2012-12-17 06:38:45 +0100 | [diff] [blame] | 168 | int kvm_init_vcpu(CPUState *cpu); |
Andreas Färber | 1458c36 | 2013-05-26 23:46:55 +0200 | [diff] [blame] | 169 | int kvm_cpu_exec(CPUState *cpu); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 170 | |
Andreas Färber | 504134d | 2012-12-17 06:38:45 +0100 | [diff] [blame] | 171 | #ifdef NEED_CPU_H |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 172 | |
Igor Mammedov | c4cfef5 | 2013-04-23 10:29:35 +0200 | [diff] [blame] | 173 | void kvm_setup_guest_memory(void *start, size_t size); |
| 174 | void kvm_flush_coalesced_mmio_buffer(void); |
| 175 | |
Andreas Färber | 6227881 | 2013-06-27 17:12:06 +0200 | [diff] [blame] | 176 | int kvm_insert_breakpoint(CPUState *cpu, target_ulong addr, |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 177 | target_ulong len, int type); |
Andreas Färber | 6227881 | 2013-06-27 17:12:06 +0200 | [diff] [blame] | 178 | int kvm_remove_breakpoint(CPUState *cpu, target_ulong addr, |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 179 | target_ulong len, int type); |
Andreas Färber | 1d5791f | 2013-05-27 14:40:48 +0200 | [diff] [blame] | 180 | void kvm_remove_all_breakpoints(CPUState *cpu); |
Stefan Weil | 38e478e | 2013-07-25 20:50:21 +0200 | [diff] [blame] | 181 | int kvm_update_guest_debug(CPUState *cpu, unsigned long reinject_trap); |
Blue Swirl | 20c2052 | 2010-02-23 21:46:28 +0000 | [diff] [blame] | 182 | #ifndef _WIN32 |
Andreas Färber | 491d6e8 | 2013-05-26 23:38:10 +0200 | [diff] [blame] | 183 | int kvm_set_signal_mask(CPUState *cpu, const sigset_t *sigset); |
Blue Swirl | 20c2052 | 2010-02-23 21:46:28 +0000 | [diff] [blame] | 184 | #endif |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 185 | |
Andreas Färber | 290adf3 | 2013-01-17 09:30:27 +0100 | [diff] [blame] | 186 | int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr); |
Jan Kiszka | a1b87fe | 2011-02-01 22:15:51 +0100 | [diff] [blame] | 187 | int kvm_on_sigbus(int code, void *addr); |
| 188 | |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 189 | /* internal API */ |
| 190 | |
aliguori | 984b518 | 2008-11-13 19:21:00 +0000 | [diff] [blame] | 191 | int kvm_ioctl(KVMState *s, int type, ...); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 192 | |
aliguori | 984b518 | 2008-11-13 19:21:00 +0000 | [diff] [blame] | 193 | int kvm_vm_ioctl(KVMState *s, int type, ...); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 194 | |
Andreas Färber | 1bc2265 | 2012-10-31 06:06:49 +0100 | [diff] [blame] | 195 | int kvm_vcpu_ioctl(CPUState *cpu, int type, ...); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 196 | |
| 197 | /* Arch specific hooks */ |
| 198 | |
Jan Kiszka | 94a8d39 | 2011-01-21 21:48:17 +0100 | [diff] [blame] | 199 | extern const KVMCapabilityInfo kvm_arch_required_capabilities[]; |
| 200 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 201 | void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run); |
| 202 | void kvm_arch_post_run(CPUState *cpu, struct kvm_run *run); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 203 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 204 | int kvm_arch_handle_exit(CPUState *cpu, struct kvm_run *run); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 205 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 206 | int kvm_arch_process_async_events(CPUState *cpu); |
Marcelo Tosatti | 0af691d | 2010-05-04 09:45:27 -0300 | [diff] [blame] | 207 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 208 | int kvm_arch_get_registers(CPUState *cpu); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 209 | |
Jan Kiszka | ea375f9 | 2010-03-01 19:10:30 +0100 | [diff] [blame] | 210 | /* state subset only touched by the VCPU itself during runtime */ |
| 211 | #define KVM_PUT_RUNTIME_STATE 1 |
| 212 | /* state subset modified during VCPU reset */ |
| 213 | #define KVM_PUT_RESET_STATE 2 |
| 214 | /* full state set, modified during initialization or on vmload */ |
| 215 | #define KVM_PUT_FULL_STATE 3 |
| 216 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 217 | int kvm_arch_put_registers(CPUState *cpu, int level); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 218 | |
Jan Kiszka | cad1e28 | 2011-01-21 21:48:16 +0100 | [diff] [blame] | 219 | int kvm_arch_init(KVMState *s); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 220 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 221 | int kvm_arch_init_vcpu(CPUState *cpu); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 222 | |
Eduardo Habkost | b164e48 | 2013-01-22 18:25:01 -0200 | [diff] [blame] | 223 | /* Returns VCPU ID to be used on KVM_CREATE_VCPU ioctl() */ |
| 224 | unsigned long kvm_arch_vcpu_id(CPUState *cpu); |
| 225 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 226 | void kvm_arch_reset_vcpu(CPUState *cpu); |
Jan Kiszka | caa5af0 | 2009-11-06 19:39:24 +0100 | [diff] [blame] | 227 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 228 | int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr); |
Jan Kiszka | a1b87fe | 2011-02-01 22:15:51 +0100 | [diff] [blame] | 229 | int kvm_arch_on_sigbus(int code, void *addr); |
Marcelo Tosatti | c0532a7 | 2010-10-11 15:31:21 -0300 | [diff] [blame] | 230 | |
Jan Kiszka | 84b058d | 2011-10-15 11:49:47 +0200 | [diff] [blame] | 231 | void kvm_arch_init_irq_routing(KVMState *s); |
| 232 | |
Peter Maydell | 3889c3f | 2012-07-26 15:35:12 +0100 | [diff] [blame] | 233 | int kvm_set_irq(KVMState *s, int irq, int level); |
Jan Kiszka | 04fa27f | 2012-05-16 15:41:10 -0300 | [diff] [blame] | 234 | int kvm_irqchip_send_msi(KVMState *s, MSIMessage msg); |
Jan Kiszka | 84b058d | 2011-10-15 11:49:47 +0200 | [diff] [blame] | 235 | |
Jan Kiszka | 1df186d | 2012-05-17 10:32:32 -0300 | [diff] [blame] | 236 | void kvm_irqchip_add_irq_route(KVMState *s, int gsi, int irqchip, int pin); |
Alexander Graf | cb925cf | 2013-04-17 01:11:55 +0200 | [diff] [blame] | 237 | void kvm_irqchip_commit_routes(KVMState *s); |
Jan Kiszka | 84b058d | 2011-10-15 11:49:47 +0200 | [diff] [blame] | 238 | |
Jan Kiszka | 680c1c6 | 2011-10-16 13:23:26 +0200 | [diff] [blame] | 239 | void kvm_put_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); |
| 240 | void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic); |
| 241 | |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 242 | struct kvm_guest_debug; |
| 243 | struct kvm_debug_exit_arch; |
| 244 | |
| 245 | struct kvm_sw_breakpoint { |
| 246 | target_ulong pc; |
| 247 | target_ulong saved_insn; |
| 248 | int use_count; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 249 | QTAILQ_ENTRY(kvm_sw_breakpoint) entry; |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 250 | }; |
| 251 | |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 252 | QTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint); |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 253 | |
Andreas Färber | a60f24b | 2012-12-01 05:35:08 +0100 | [diff] [blame] | 254 | struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *cpu, |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 255 | target_ulong pc); |
| 256 | |
Andreas Färber | a60f24b | 2012-12-01 05:35:08 +0100 | [diff] [blame] | 257 | int kvm_sw_breakpoints_active(CPUState *cpu); |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 258 | |
Andreas Färber | 80b7cd7 | 2013-06-19 17:37:31 +0200 | [diff] [blame] | 259 | int kvm_arch_insert_sw_breakpoint(CPUState *cpu, |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 260 | struct kvm_sw_breakpoint *bp); |
Andreas Färber | 80b7cd7 | 2013-06-19 17:37:31 +0200 | [diff] [blame] | 261 | int kvm_arch_remove_sw_breakpoint(CPUState *cpu, |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 262 | struct kvm_sw_breakpoint *bp); |
| 263 | int kvm_arch_insert_hw_breakpoint(target_ulong addr, |
| 264 | target_ulong len, int type); |
| 265 | int kvm_arch_remove_hw_breakpoint(target_ulong addr, |
| 266 | target_ulong len, int type); |
| 267 | void kvm_arch_remove_all_hw_breakpoints(void); |
| 268 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 269 | void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg); |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 270 | |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 271 | bool kvm_arch_stop_on_emulation_error(CPUState *cpu); |
Gleb Natapov | 4513d92 | 2010-05-10 11:21:34 +0300 | [diff] [blame] | 272 | |
Anthony Liguori | ad7b8b3 | 2009-05-08 15:33:24 -0500 | [diff] [blame] | 273 | int kvm_check_extension(KVMState *s, unsigned int extension); |
| 274 | |
Jan Kiszka | ba9bc59 | 2011-06-08 16:11:05 +0200 | [diff] [blame] | 275 | uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function, |
Sheng Yang | c958a8b | 2010-06-17 15:18:13 +0800 | [diff] [blame] | 276 | uint32_t index, int reg); |
James Hogan | 97577fd | 2013-08-27 12:19:10 +0100 | [diff] [blame] | 277 | |
| 278 | #if !defined(CONFIG_USER_ONLY) |
| 279 | int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr, |
| 280 | hwaddr *phys_addr); |
| 281 | #endif |
| 282 | |
| 283 | #endif /* NEED_CPU_H */ |
| 284 | |
Andreas Färber | dd1750d | 2013-05-01 13:45:44 +0200 | [diff] [blame] | 285 | void kvm_cpu_synchronize_state(CPUState *cpu); |
James Hogan | 97577fd | 2013-08-27 12:19:10 +0100 | [diff] [blame] | 286 | void kvm_cpu_synchronize_post_reset(CPUState *cpu); |
| 287 | void kvm_cpu_synchronize_post_init(CPUState *cpu); |
Avi Kivity | b827df5 | 2009-05-03 17:04:01 +0300 | [diff] [blame] | 288 | |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 289 | /* generic hooks - to be moved/refactored once there are more users */ |
| 290 | |
Andreas Färber | cb446ec | 2013-05-01 14:24:52 +0200 | [diff] [blame] | 291 | static inline void cpu_synchronize_state(CPUState *cpu) |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 292 | { |
| 293 | if (kvm_enabled()) { |
Andreas Färber | cb446ec | 2013-05-01 14:24:52 +0200 | [diff] [blame] | 294 | kvm_cpu_synchronize_state(cpu); |
aliguori | e22a25c | 2009-03-12 20:12:48 +0000 | [diff] [blame] | 295 | } |
| 296 | } |
| 297 | |
Igor Mammedov | 3f24a58 | 2013-04-11 16:51:41 +0200 | [diff] [blame] | 298 | static inline void cpu_synchronize_post_reset(CPUState *cpu) |
Jan Kiszka | ea375f9 | 2010-03-01 19:10:30 +0100 | [diff] [blame] | 299 | { |
| 300 | if (kvm_enabled()) { |
Igor Mammedov | 3f24a58 | 2013-04-11 16:51:41 +0200 | [diff] [blame] | 301 | kvm_cpu_synchronize_post_reset(cpu); |
Jan Kiszka | ea375f9 | 2010-03-01 19:10:30 +0100 | [diff] [blame] | 302 | } |
| 303 | } |
| 304 | |
Igor Mammedov | 3f24a58 | 2013-04-11 16:51:41 +0200 | [diff] [blame] | 305 | static inline void cpu_synchronize_post_init(CPUState *cpu) |
Jan Kiszka | ea375f9 | 2010-03-01 19:10:30 +0100 | [diff] [blame] | 306 | { |
| 307 | if (kvm_enabled()) { |
Igor Mammedov | 3f24a58 | 2013-04-11 16:51:41 +0200 | [diff] [blame] | 308 | kvm_cpu_synchronize_post_init(cpu); |
Jan Kiszka | ea375f9 | 2010-03-01 19:10:30 +0100 | [diff] [blame] | 309 | } |
| 310 | } |
Michael S. Tsirkin | ca82180 | 2010-03-17 13:07:54 +0200 | [diff] [blame] | 311 | |
Jan Kiszka | 92b4e48 | 2012-05-17 10:32:33 -0300 | [diff] [blame] | 312 | int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg); |
Jan Kiszka | cc57407 | 2012-08-27 08:28:38 +0200 | [diff] [blame] | 313 | int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg); |
Jan Kiszka | 1e2aa8b | 2012-05-17 10:32:34 -0300 | [diff] [blame] | 314 | void kvm_irqchip_release_virq(KVMState *s, int virq); |
Jan Kiszka | 39853bb | 2012-05-17 10:32:36 -0300 | [diff] [blame] | 315 | |
Vincenzo Maffione | ca916d3 | 2013-07-22 11:51:33 +0200 | [diff] [blame] | 316 | int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n, |
| 317 | EventNotifier *rn, int virq); |
Jan Kiszka | b131c74 | 2012-08-20 10:55:56 +0200 | [diff] [blame] | 318 | int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq); |
Jason Baron | d8ee038 | 2012-11-14 15:54:02 -0500 | [diff] [blame] | 319 | void kvm_pc_gsi_handler(void *opaque, int n, int level); |
| 320 | void kvm_pc_setup_irq_routing(bool pci_enabled); |
Alexander Graf | 7b77459 | 2013-04-16 15:58:13 +0200 | [diff] [blame] | 321 | void kvm_init_irq_routing(KVMState *s); |
aliguori | 0533044 | 2008-11-05 16:29:27 +0000 | [diff] [blame] | 322 | #endif |