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