kvm.h revision 1321c76d96910c2c807207f3fdfeb560c598ca60
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
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_handle_exit(CPUState *env, struct kvm_run *run);
895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_pre_run(CPUState *env, struct kvm_run *run);
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_get_registers(CPUState *env);
935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_put_registers(CPUState *env);
955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_init(KVMState *s, int smp_cpus);
975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_init_vcpu(CPUState *env);
995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_guest_debug;
1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_debug_exit_arch;
1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_sw_breakpoint {
1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    target_ulong pc;
1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    target_ulong saved_insn;
1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int use_count;
107a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' Turner    QTAILQ_ENTRY(kvm_sw_breakpoint) entry;
1085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
1095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
110a5d412078b8e7478d81df03710eacc7a21096ba2David 'Digit' TurnerQTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint);
1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_debug(struct kvm_debug_exit_arch *arch_info);
1135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                                 target_ulong pc);
1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_sw_breakpoints_active(CPUState *env);
1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_insert_sw_breakpoint(CPUState *current_env,
1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                  struct kvm_sw_breakpoint *bp);
1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_remove_sw_breakpoint(CPUState *current_env,
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                  struct kvm_sw_breakpoint *bp);
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_insert_hw_breakpoint(target_ulong addr,
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                  target_ulong len, int type);
1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_arch_remove_hw_breakpoint(target_ulong addr,
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                  target_ulong len, int type);
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_arch_remove_all_hw_breakpoints(void);
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid kvm_arch_update_guest_debug(CPUState *env, struct kvm_guest_debug *dbg);
1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint kvm_check_extension(KVMState *s, unsigned int extension);
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      int reg);
1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* generic hooks - to be moved/refactored once there are more users */
1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void cpu_synchronize_state(CPUState *env, int modified)
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (kvm_enabled()) {
1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        if (modified)
1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            kvm_arch_put_registers(env);
1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        else
1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner            kvm_arch_get_registers(env);
1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
149