/* * kvm_host.h: used for kvm module, and hold ia64-specific sections. * * Copyright (C) 2007, Intel Corporation. * * Xiantao Zhang * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. * */ #ifndef __ASM_KVM_HOST_H #define __ASM_KVM_HOST_H #define KVM_MEMORY_SLOTS 32 /* memory slots that does not exposed to userspace */ #define KVM_PRIVATE_MEM_SLOTS 4 #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 /* define exit reasons from vmm to kvm*/ #define EXIT_REASON_VM_PANIC 0 #define EXIT_REASON_MMIO_INSTRUCTION 1 #define EXIT_REASON_PAL_CALL 2 #define EXIT_REASON_SAL_CALL 3 #define EXIT_REASON_SWITCH_RR6 4 #define EXIT_REASON_VM_DESTROY 5 #define EXIT_REASON_EXTERNAL_INTERRUPT 6 #define EXIT_REASON_IPI 7 #define EXIT_REASON_PTC_G 8 #define EXIT_REASON_DEBUG 20 /*Define vmm address space and vm data space.*/ #define KVM_VMM_SIZE (__IA64_UL_CONST(16)<<20) #define KVM_VMM_SHIFT 24 #define KVM_VMM_BASE 0xD000000000000000 #define VMM_SIZE (__IA64_UL_CONST(8)<<20) /* * Define vm_buffer, used by PAL Services, base address. * Note: vm_buffer is in the VMM-BLOCK, the size must be < 8M */ #define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE) #define KVM_VM_BUFFER_SIZE (__IA64_UL_CONST(8)<<20) /* * kvm guest's data area looks as follow: * * +----------------------+ ------- KVM_VM_DATA_SIZE * | vcpu[n]'s data | | ___________________KVM_STK_OFFSET * | | | / | * | .......... | | /vcpu's struct&stack | * | .......... | | /---------------------|---- 0 * | vcpu[5]'s data | | / vpd | * | vcpu[4]'s data | |/-----------------------| * | vcpu[3]'s data | / vtlb | * | vcpu[2]'s data | /|------------------------| * | vcpu[1]'s data |/ | vhpt | * | vcpu[0]'s data |____________________________| * +----------------------+ | * | memory dirty log | | * +----------------------+ | * | vm's data struct | | * +----------------------+ | * | | | * | | | * | | | * | | | * | | | * | | | * | | | * | vm's p2m table | | * | | | * | | | * | | | | * vm's data->| | | | * +----------------------+ ------- 0 * To support large memory, needs to increase the size of p2m. * To support more vcpus, needs to ensure it has enough space to * hold vcpus' data. */ #define KVM_VM_DATA_SHIFT 26 #define KVM_VM_DATA_SIZE (__IA64_UL_CONST(1) << KVM_VM_DATA_SHIFT) #define KVM_VM_DATA_BASE (KVM_VMM_BASE + KVM_VM_DATA_SIZE) #define KVM_P2M_BASE KVM_VM_DATA_BASE #define KVM_P2M_SIZE (__IA64_UL_CONST(24) << 20) #define VHPT_SHIFT 16 #define VHPT_SIZE (__IA64_UL_CONST(1) << VHPT_SHIFT) #define VHPT_NUM_ENTRIES (__IA64_UL_CONST(1) << (VHPT_SHIFT-5)) #define VTLB_SHIFT 16 #define VTLB_SIZE (__IA64_UL_CONST(1) << VTLB_SHIFT) #define VTLB_NUM_ENTRIES (1UL << (VHPT_SHIFT-5)) #define VPD_SHIFT 16 #define VPD_SIZE (__IA64_UL_CONST(1) << VPD_SHIFT) #define VCPU_STRUCT_SHIFT 16 #define VCPU_STRUCT_SIZE (__IA64_UL_CONST(1) << VCPU_STRUCT_SHIFT) /* * This must match KVM_IA64_VCPU_STACK_{SHIFT,SIZE} arch/ia64/include/asm/kvm.h */ #define KVM_STK_SHIFT 16 #define KVM_STK_OFFSET (__IA64_UL_CONST(1)<< KVM_STK_SHIFT) #define KVM_VM_STRUCT_SHIFT 19 #define KVM_VM_STRUCT_SIZE (__IA64_UL_CONST(1) << KVM_VM_STRUCT_SHIFT) #define KVM_MEM_DIRY_LOG_SHIFT 19 #define KVM_MEM_DIRTY_LOG_SIZE (__IA64_UL_CONST(1) << KVM_MEM_DIRY_LOG_SHIFT) #ifndef __ASSEMBLY__ /*Define the max vcpus and memory for Guests.*/ #define KVM_MAX_VCPUS (KVM_VM_DATA_SIZE - KVM_P2M_SIZE - KVM_VM_STRUCT_SIZE -\ KVM_MEM_DIRTY_LOG_SIZE) / sizeof(struct kvm_vcpu_data) #define KVM_MAX_MEM_SIZE (KVM_P2M_SIZE >> 3 << PAGE_SHIFT) #define VMM_LOG_LEN 256 #include #include #include #include #include #include #include #include struct kvm_vcpu_data { char vcpu_vhpt[VHPT_SIZE]; char vcpu_vtlb[VTLB_SIZE]; char vcpu_vpd[VPD_SIZE]; char vcpu_struct[VCPU_STRUCT_SIZE]; }; struct kvm_vm_data { char kvm_p2m[KVM_P2M_SIZE]; char kvm_vm_struct[KVM_VM_STRUCT_SIZE]; char kvm_mem_dirty_log[KVM_MEM_DIRTY_LOG_SIZE]; struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; }; #define VCPU_BASE(n) (KVM_VM_DATA_BASE + \ offsetof(struct kvm_vm_data, vcpu_data[n])) #define KVM_VM_BASE (KVM_VM_DATA_BASE + \ offsetof(struct kvm_vm_data, kvm_vm_struct)) #define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \