kvm.h revision bb0140b925cb2adce03ebc0885067ea3bfd19a20
15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * QEMU KVM support 35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Copyright IBM, Corp. 2008 55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Authors: 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Anthony Liguori <aliguori@us.ibm.com> 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This work is licensed under the terms of the GNU GPL, version 2 or later. 105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * See the COPYING file in the top-level directory. 115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef QEMU_KVM_H 155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QEMU_KVM_H 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "config.h" 18a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner#include "qemu-queue.h" 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef CONFIG_KVM 211321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima 221321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#ifdef TARGET_I386 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerextern int kvm_allowed; 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define kvm_enabled() (kvm_allowed) 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define kvm_enabled() (0) 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 301321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#else 311321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#define kvm_enabled() (0) 321321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima#endif 331321c76d96910c2c807207f3fdfeb560c598ca60Jun Nakajima 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_run; 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* external API */ 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_init(int smp_cpus); 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_init_vcpu(CPUState *env); 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_sync_vcpus(void); 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_cpu_exec(CPUState *env); 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_set_phys_mem(target_phys_addr_t start_addr, 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ram_addr_t size, 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ram_addr_t phys_offset); 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_phys_addr_t end_addr); 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t size); 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size); 545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_set_migration_log(int enable); 555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_has_sync_mmu(void); 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_setup_guest_memory(void *start, size_t size); 595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_insert_breakpoint(CPUState *current_env, target_ulong addr, 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong len, int type); 655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_remove_breakpoint(CPUState *current_env, target_ulong addr, 665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong len, int type); 675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_remove_all_breakpoints(CPUState *current_env); 685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap); 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* internal API */ 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct KVMState; 735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct KVMState KVMState; 745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_ioctl(KVMState *s, int type, ...); 765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_vm_ioctl(KVMState *s, int type, ...); 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_vcpu_ioctl(CPUState *env, int type, ...); 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_get_mp_state(CPUState *env); 825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_put_mp_state(CPUState *env); 835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Arch specific hooks */ 855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_post_run(CPUState *env, struct kvm_run *run); 875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 88bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajimaint kvm_arch_vcpu_run(CPUState *env); 89bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima 905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_handle_exit(CPUState *env, struct kvm_run *run); 915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_pre_run(CPUState *env, struct kvm_run *run); 935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_get_registers(CPUState *env); 955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_put_registers(CPUState *env); 975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_init(KVMState *s, int smp_cpus); 995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_init_vcpu(CPUState *env); 1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_guest_debug; 1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_debug_exit_arch; 1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_sw_breakpoint { 1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong pc; 1075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong saved_insn; 1085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int use_count; 109a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner QTAILQ_ENTRY(kvm_sw_breakpoint) entry; 1105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 112a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' TurnerQTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint); 1135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_debug(struct kvm_debug_exit_arch *arch_info); 1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env, 1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong pc); 1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_sw_breakpoints_active(CPUState *env); 1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_insert_sw_breakpoint(CPUState *current_env, 1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct kvm_sw_breakpoint *bp); 1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_remove_sw_breakpoint(CPUState *current_env, 1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner struct kvm_sw_breakpoint *bp); 1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_insert_hw_breakpoint(target_ulong addr, 1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong len, int type); 1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_remove_hw_breakpoint(target_ulong addr, 1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner target_ulong len, int type); 1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_arch_remove_all_hw_breakpoints(void); 1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg); 1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_check_extension(KVMState *s, unsigned int extension); 1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, 1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int reg); 1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* generic hooks - to be moved/refactored once there are more users */ 1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void cpu_synchronize_state(CPUState *env, int modified) 1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (kvm_enabled()) { 1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (modified) 1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kvm_arch_put_registers(env); 1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else 1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner kvm_arch_get_registers(env); 1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 151