kvm.h revision e36a683b547e540c68bf9c5578e05b29c8676f47
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * QEMU KVM support 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright IBM, Corp. 2008 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Authors: 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Anthony Liguori <aliguori@us.ibm.com> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This work is licensed under the terms of the GNU GPL, version 2 or later. 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See the COPYING file in the top-level directory. 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) * 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef QEMU_KVM_H 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define QEMU_KVM_H 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "config.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cpu.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "qemu/queue.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef CONFIG_KVM 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef TARGET_I386 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern int kvm_allowed; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define kvm_enabled() (kvm_allowed) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define kvm_enabled() (0) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define kvm_enabled() (0) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct kvm_run; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* external API */ 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_init(int smp_cpus); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_init_vcpu(CPUState *env); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_sync_vcpus(void); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_cpu_exec(CPUState *env); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void kvm_set_phys_mem(hwaddr start_addr, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ram_addr_t size, 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ram_addr_t phys_offset); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_physical_sync_dirty_bitmap(hwaddr start_addr, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hwaddr end_addr); 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int kvm_log_start(hwaddr phys_addr, ram_addr_t size); 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int kvm_log_stop(hwaddr phys_addr, ram_addr_t size); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_set_migration_log(int enable); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_has_sync_mmu(void); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void kvm_setup_guest_memory(void *start, size_t size); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_coalesce_mmio_region(hwaddr start, ram_addr_t size); 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int kvm_uncoalesce_mmio_region(hwaddr start, ram_addr_t size); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int kvm_insert_breakpoint(CPUState *current_env, target_ulong addr, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_ulong len, int type); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_remove_breakpoint(CPUState *current_env, target_ulong addr, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_ulong len, int type); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void kvm_remove_all_breakpoints(CPUState *current_env); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* internal API */ 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct KVMState; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct KVMState KVMState; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_ioctl(KVMState *s, int type, ...); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_vm_ioctl(KVMState *s, int type, ...); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_vcpu_ioctl(CPUState *env, int type, ...); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_get_mp_state(CPUState *env); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_put_mp_state(CPUState *env); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Arch specific hooks */ 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_arch_post_run(CPUState *env, struct kvm_run *run); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_vcpu_run(CPUState *env); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint kvm_arch_handle_exit(CPUState *env, struct kvm_run *run); 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint kvm_arch_pre_run(CPUState *env, struct kvm_run *run); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_get_registers(CPUState *env); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_put_registers(CPUState *env); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_init(KVMState *s, int smp_cpus); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_init_vcpu(CPUState *env); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct kvm_guest_debug; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct kvm_debug_exit_arch; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct kvm_sw_breakpoint { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_ulong pc; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_ulong saved_insn; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int use_count; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QTAILQ_ENTRY(kvm_sw_breakpoint) entry; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_debug(struct kvm_debug_exit_arch *arch_info); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_ulong pc); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_sw_breakpoints_active(CPUState *env); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int kvm_arch_insert_sw_breakpoint(CPUState *current_env, 123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch struct kvm_sw_breakpoint *bp); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int kvm_arch_remove_sw_breakpoint(CPUState *current_env, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct kvm_sw_breakpoint *bp); 126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint kvm_arch_insert_hw_breakpoint(target_ulong addr, 127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch target_ulong len, int type); 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint kvm_arch_remove_hw_breakpoint(target_ulong addr, 129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch target_ulong len, int type); 130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid kvm_arch_remove_all_hw_breakpoints(void); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134int kvm_check_extension(KVMState *s, unsigned int extension); 135 136uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, 137 int reg); 138 139/* generic hooks - to be moved/refactored once there are more users */ 140#ifdef CONFIG_HAX 141void hax_vcpu_sync_state(CPUOldState *env, int modified); 142#endif 143static inline void cpu_synchronize_state(CPUState *cpu, int modified) 144{ 145 if (kvm_enabled()) { 146 if (modified) 147 kvm_arch_put_registers(cpu); 148 else 149 kvm_arch_get_registers(cpu); 150 } 151#ifdef CONFIG_HAX 152 hax_vcpu_sync_state(cpu->env_ptr, modified); 153#endif 154} 155 156int kvm_get_sregs(CPUState *env); 157 158 159#endif 160