aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/include/asm
diff options
context:
space:
mode:
authorXiantao Zhang <xiantao.zhang@intel.com>2008-10-23 02:56:44 -0400
committerAvi Kivity <avi@redhat.com>2008-12-31 09:51:49 -0500
commita917f7af3905953329361d29b6db78eb17b4d44c (patch)
treea873216c93f09af69f9a68fa831df822a3810fd8 /arch/ia64/include/asm
parent1d5a4d9b92028d9fe77da34037bd5a1ebfecc733 (diff)
KVM: ia64: Re-organize data sturure of guests' data area
1. Increase the size of data area to 64M 2. Support more vcpus and memory, 128 vcpus and 256G memory are supported for guests. 3. Add the boundary check for memory and vcpu allocation. With this patch, 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. */ Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/ia64/include/asm')
-rw-r--r--arch/ia64/include/asm/kvm_host.h192
1 files changed, 120 insertions, 72 deletions
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h
index c60d324da540..678e2646a500 100644
--- a/arch/ia64/include/asm/kvm_host.h
+++ b/arch/ia64/include/asm/kvm_host.h
@@ -23,17 +23,6 @@
23#ifndef __ASM_KVM_HOST_H 23#ifndef __ASM_KVM_HOST_H
24#define __ASM_KVM_HOST_H 24#define __ASM_KVM_HOST_H
25 25
26
27#include <linux/types.h>
28#include <linux/mm.h>
29#include <linux/kvm.h>
30#include <linux/kvm_para.h>
31#include <linux/kvm_types.h>
32
33#include <asm/pal.h>
34#include <asm/sal.h>
35
36#define KVM_MAX_VCPUS 4
37#define KVM_MEMORY_SLOTS 32 26#define KVM_MEMORY_SLOTS 32
38/* memory slots that does not exposed to userspace */ 27/* memory slots that does not exposed to userspace */
39#define KVM_PRIVATE_MEM_SLOTS 4 28#define KVM_PRIVATE_MEM_SLOTS 4
@@ -52,68 +41,127 @@
52#define EXIT_REASON_PTC_G 8 41#define EXIT_REASON_PTC_G 8
53 42
54/*Define vmm address space and vm data space.*/ 43/*Define vmm address space and vm data space.*/
55#define KVM_VMM_SIZE (16UL<<20) 44#define KVM_VMM_SIZE (__IA64_UL_CONST(16)<<20)
56#define KVM_VMM_SHIFT 24 45#define KVM_VMM_SHIFT 24
57#define KVM_VMM_BASE 0xD000000000000000UL 46#define KVM_VMM_BASE 0xD000000000000000
58#define VMM_SIZE (8UL<<20) 47#define VMM_SIZE (__IA64_UL_CONST(8)<<20)
59 48
60/* 49/*
61 * Define vm_buffer, used by PAL Services, base address. 50 * Define vm_buffer, used by PAL Services, base address.
62 * Note: vmbuffer is in the VMM-BLOCK, the size must be < 8M 51 * Note: vm_buffer is in the VMM-BLOCK, the size must be < 8M
63 */ 52 */
64#define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE) 53#define KVM_VM_BUFFER_BASE (KVM_VMM_BASE + VMM_SIZE)
65#define KVM_VM_BUFFER_SIZE (8UL<<20) 54#define KVM_VM_BUFFER_SIZE (__IA64_UL_CONST(8)<<20)
66 55
67/*Define Virtual machine data layout.*/ 56/*
68#define KVM_VM_DATA_SHIFT 24 57 * kvm guest's data area looks as follow:
69#define KVM_VM_DATA_SIZE (1UL << KVM_VM_DATA_SHIFT) 58 *
70#define KVM_VM_DATA_BASE (KVM_VMM_BASE + KVM_VMM_SIZE) 59 * +----------------------+ ------- KVM_VM_DATA_SIZE
71 60 * | vcpu[n]'s data | | ___________________KVM_STK_OFFSET
72 61 * | | | / |
73#define KVM_P2M_BASE KVM_VM_DATA_BASE 62 * | .......... | | /vcpu's struct&stack |
74#define KVM_P2M_OFS 0 63 * | .......... | | /---------------------|---- 0
75#define KVM_P2M_SIZE (8UL << 20) 64 * | vcpu[5]'s data | | / vpd |
76 65 * | vcpu[4]'s data | |/-----------------------|
77#define KVM_VHPT_BASE (KVM_P2M_BASE + KVM_P2M_SIZE) 66 * | vcpu[3]'s data | / vtlb |
78#define KVM_VHPT_OFS KVM_P2M_SIZE 67 * | vcpu[2]'s data | /|------------------------|
79#define KVM_VHPT_BLOCK_SIZE (2UL << 20) 68 * | vcpu[1]'s data |/ | vhpt |
80#define VHPT_SHIFT 18 69 * | vcpu[0]'s data |____________________________|
81#define VHPT_SIZE (1UL << VHPT_SHIFT) 70 * +----------------------+ |
82#define VHPT_NUM_ENTRIES (1<<(VHPT_SHIFT-5)) 71 * | memory dirty log | |
83 72 * +----------------------+ |
84#define KVM_VTLB_BASE (KVM_VHPT_BASE+KVM_VHPT_BLOCK_SIZE) 73 * | vm's data struct | |
85#define KVM_VTLB_OFS (KVM_VHPT_OFS+KVM_VHPT_BLOCK_SIZE) 74 * +----------------------+ |
86#define KVM_VTLB_BLOCK_SIZE (1UL<<20) 75 * | | |
87#define VTLB_SHIFT 17 76 * | | |
88#define VTLB_SIZE (1UL<<VTLB_SHIFT) 77 * | | |
89#define VTLB_NUM_ENTRIES (1<<(VTLB_SHIFT-5)) 78 * | | |
90 79 * | | |
91#define KVM_VPD_BASE (KVM_VTLB_BASE+KVM_VTLB_BLOCK_SIZE) 80 * | | |
92#define KVM_VPD_OFS (KVM_VTLB_OFS+KVM_VTLB_BLOCK_SIZE) 81 * | | |
93#define KVM_VPD_BLOCK_SIZE (2UL<<20) 82 * | vm's p2m table | |
94#define VPD_SHIFT 16 83 * | | |
95#define VPD_SIZE (1UL<<VPD_SHIFT) 84 * | | |
96 85 * | | | |
97#define KVM_VCPU_BASE (KVM_VPD_BASE+KVM_VPD_BLOCK_SIZE) 86 * vm's data->| | | |
98#define KVM_VCPU_OFS (KVM_VPD_OFS+KVM_VPD_BLOCK_SIZE) 87 * +----------------------+ ------- 0
99#define KVM_VCPU_BLOCK_SIZE (2UL<<20) 88 * To support large memory, needs to increase the size of p2m.
100#define VCPU_SHIFT 18 89 * To support more vcpus, needs to ensure it has enough space to
101#define VCPU_SIZE (1UL<<VCPU_SHIFT) 90 * hold vcpus' data.
102#define MAX_VCPU_NUM KVM_VCPU_BLOCK_SIZE/VCPU_SIZE 91 */
103 92
104#define KVM_VM_BASE (KVM_VCPU_BASE+KVM_VCPU_BLOCK_SIZE) 93#define KVM_VM_DATA_SHIFT 26
105#define KVM_VM_OFS (KVM_VCPU_OFS+KVM_VCPU_BLOCK_SIZE) 94#define KVM_VM_DATA_SIZE (__IA64_UL_CONST(1) << KVM_VM_DATA_SHIFT)
106#define KVM_VM_BLOCK_SIZE (1UL<<19) 95#define KVM_VM_DATA_BASE (KVM_VMM_BASE + KVM_VM_DATA_SIZE)
107 96
108#define KVM_MEM_DIRTY_LOG_BASE (KVM_VM_BASE+KVM_VM_BLOCK_SIZE) 97#define KVM_P2M_BASE KVM_VM_DATA_BASE
109#define KVM_MEM_DIRTY_LOG_OFS (KVM_VM_OFS+KVM_VM_BLOCK_SIZE) 98#define KVM_P2M_SIZE (__IA64_UL_CONST(24) << 20)
110#define KVM_MEM_DIRTY_LOG_SIZE (1UL<<19) 99
111 100#define VHPT_SHIFT 16
112/* Get vpd, vhpt, tlb, vcpu, base*/ 101#define VHPT_SIZE (__IA64_UL_CONST(1) << VHPT_SHIFT)
113#define VPD_ADDR(n) (KVM_VPD_BASE+n*VPD_SIZE) 102#define VHPT_NUM_ENTRIES (__IA64_UL_CONST(1) << (VHPT_SHIFT-5))
114#define VHPT_ADDR(n) (KVM_VHPT_BASE+n*VHPT_SIZE) 103
115#define VTLB_ADDR(n) (KVM_VTLB_BASE+n*VTLB_SIZE) 104#define VTLB_SHIFT 16
116#define VCPU_ADDR(n) (KVM_VCPU_BASE+n*VCPU_SIZE) 105#define VTLB_SIZE (__IA64_UL_CONST(1) << VTLB_SHIFT)
106#define VTLB_NUM_ENTRIES (1UL << (VHPT_SHIFT-5))
107
108#define VPD_SHIFT 16
109#define VPD_SIZE (__IA64_UL_CONST(1) << VPD_SHIFT)
110
111#define VCPU_STRUCT_SHIFT 16
112#define VCPU_STRUCT_SIZE (__IA64_UL_CONST(1) << VCPU_STRUCT_SHIFT)
113
114#define KVM_STK_OFFSET VCPU_STRUCT_SIZE
115
116#define KVM_VM_STRUCT_SHIFT 19
117#define KVM_VM_STRUCT_SIZE (__IA64_UL_CONST(1) << KVM_VM_STRUCT_SHIFT)
118
119#define KVM_MEM_DIRY_LOG_SHIFT 19
120#define KVM_MEM_DIRTY_LOG_SIZE (__IA64_UL_CONST(1) << KVM_MEM_DIRY_LOG_SHIFT)
121
122#ifndef __ASSEMBLY__
123
124/*Define the max vcpus and memory for Guests.*/
125#define KVM_MAX_VCPUS (KVM_VM_DATA_SIZE - KVM_P2M_SIZE - KVM_VM_STRUCT_SIZE -\
126 KVM_MEM_DIRTY_LOG_SIZE) / sizeof(struct kvm_vcpu_data)
127#define KVM_MAX_MEM_SIZE (KVM_P2M_SIZE >> 3 << PAGE_SHIFT)
128
129#include <linux/types.h>
130#include <linux/mm.h>
131#include <linux/kvm.h>
132#include <linux/kvm_para.h>
133#include <linux/kvm_types.h>
134
135#include <asm/pal.h>
136#include <asm/sal.h>
137#include <asm/page.h>
138
139struct kvm_vcpu_data {
140 char vcpu_vhpt[VHPT_SIZE];
141 char vcpu_vtlb[VTLB_SIZE];
142 char vcpu_vpd[VPD_SIZE];
143 char vcpu_struct[VCPU_STRUCT_SIZE];
144};
145
146struct kvm_vm_data {
147 char kvm_p2m[KVM_P2M_SIZE];
148 char kvm_vm_struct[KVM_VM_STRUCT_SIZE];
149 char kvm_mem_dirty_log[KVM_MEM_DIRTY_LOG_SIZE];
150 struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS];
151};
152
153#define VCPU_BASE(n) KVM_VM_DATA_BASE + \
154 offsetof(struct kvm_vm_data, vcpu_data[n])
155#define VM_BASE KVM_VM_DATA_BASE + \
156 offsetof(struct kvm_vm_data, kvm_vm_struct)
157#define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \
158 offsetof(struct kvm_vm_data, kvm_mem_dirty_log)
159
160#define VHPT_BASE(n) (VCPU_BASE(n) + offsetof(struct kvm_vcpu_data, vcpu_vhpt))
161#define VTLB_BASE(n) (VCPU_BASE(n) + offsetof(struct kvm_vcpu_data, vcpu_vtlb))
162#define VPD_BASE(n) (VCPU_BASE(n) + offsetof(struct kvm_vcpu_data, vcpu_vpd))
163#define VCPU_STRUCT_BASE(n) (VCPU_BASE(n) + \
164 offsetof(struct kvm_vcpu_data, vcpu_struct))
117 165
118/*IO section definitions*/ 166/*IO section definitions*/
119#define IOREQ_READ 1 167#define IOREQ_READ 1
@@ -403,14 +451,13 @@ struct kvm_sal_data {
403}; 451};
404 452
405struct kvm_arch { 453struct kvm_arch {
454 spinlock_t dirty_log_lock;
455
406 unsigned long vm_base; 456 unsigned long vm_base;
407 unsigned long metaphysical_rr0; 457 unsigned long metaphysical_rr0;
408 unsigned long metaphysical_rr4; 458 unsigned long metaphysical_rr4;
409 unsigned long vmm_init_rr; 459 unsigned long vmm_init_rr;
410 unsigned long vhpt_base; 460
411 unsigned long vtlb_base;
412 unsigned long vpd_base;
413 spinlock_t dirty_log_lock;
414 struct kvm_ioapic *vioapic; 461 struct kvm_ioapic *vioapic;
415 struct kvm_vm_stat stat; 462 struct kvm_vm_stat stat;
416 struct kvm_sal_data rdv_sal_data; 463 struct kvm_sal_data rdv_sal_data;
@@ -512,7 +559,7 @@ struct kvm_pt_regs {
512 559
513static inline struct kvm_pt_regs *vcpu_regs(struct kvm_vcpu *v) 560static inline struct kvm_pt_regs *vcpu_regs(struct kvm_vcpu *v)
514{ 561{
515 return (struct kvm_pt_regs *) ((unsigned long) v + IA64_STK_OFFSET) - 1; 562 return (struct kvm_pt_regs *) ((unsigned long) v + KVM_STK_OFFSET) - 1;
516} 563}
517 564
518typedef int kvm_vmm_entry(void); 565typedef int kvm_vmm_entry(void);
@@ -531,5 +578,6 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run);
531void kvm_sal_emul(struct kvm_vcpu *vcpu); 578void kvm_sal_emul(struct kvm_vcpu *vcpu);
532 579
533static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {} 580static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {}
581#endif /* __ASSEMBLY__*/
534 582
535#endif 583#endif