diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-21 00:13:26 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-21 00:13:26 -0400 |
commit | f076ab8d048f152b968bb1c6313fed88abb037fe (patch) | |
tree | fe9ff7bc40d04c5a12eb41a90cc0e1dbf8ae4e45 /include | |
parent | db6d8c7a4027b48d797b369a53f8470aaeed7063 (diff) | |
parent | 597a5f551ec4cd0aa0966e4fff4684ecc8c31c0d (diff) |
Merge branch 'kvm-updates-2.6.27' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
* 'kvm-updates-2.6.27' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm: (70 commits)
KVM: Adjust smp_call_function_mask() callers to new requirements
KVM: MMU: Fix potential race setting upper shadow ptes on nonpae hosts
KVM: x86 emulator: emulate clflush
KVM: MMU: improve invalid shadow root page handling
KVM: MMU: nuke shadowed pgtable pages and ptes on memslot destruction
KVM: Prefix some x86 low level function with kvm_, to avoid namespace issues
KVM: check injected pic irq within valid pic irqs
KVM: x86 emulator: Fix HLT instruction
KVM: Apply the kernel sigmask to vcpus blocked due to being uninitialized
KVM: VMX: Add ept_sync_context in flush_tlb
KVM: mmu_shrink: kvm_mmu_zap_page requires slots_lock to be held
x86: KVM guest: make kvm_smp_prepare_boot_cpu() static
KVM: SVM: fix suspend/resume support
KVM: s390: rename private structures
KVM: s390: Set guest storage limit and offset to sane values
KVM: Fix memory leak on guest exit
KVM: s390: dont allocate dirty bitmap
KVM: move slots_lock acquision down to vapic_exit
KVM: VMX: Fake emulate Intel perfctr MSRs
KVM: VMX: Fix a wrong usage of vmcs_config
...
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-ia64/kvm_host.h | 3 | ||||
-rw-r--r-- | include/asm-powerpc/kvm_host.h | 2 | ||||
-rw-r--r-- | include/asm-s390/kvm_host.h | 36 | ||||
-rw-r--r-- | include/asm-x86/kvm.h | 1 | ||||
-rw-r--r-- | include/asm-x86/kvm_host.h | 69 | ||||
-rw-r--r-- | include/asm-x86/kvm_x86_emulate.h | 11 | ||||
-rw-r--r-- | include/linux/kvm.h | 33 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 11 |
8 files changed, 118 insertions, 48 deletions
diff --git a/include/asm-ia64/kvm_host.h b/include/asm-ia64/kvm_host.h index c082c208c1f3..1efe513a9941 100644 --- a/include/asm-ia64/kvm_host.h +++ b/include/asm-ia64/kvm_host.h | |||
@@ -38,6 +38,7 @@ | |||
38 | /* memory slots that does not exposed to userspace */ | 38 | /* memory slots that does not exposed to userspace */ |
39 | #define KVM_PRIVATE_MEM_SLOTS 4 | 39 | #define KVM_PRIVATE_MEM_SLOTS 4 |
40 | 40 | ||
41 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | ||
41 | 42 | ||
42 | /* define exit reasons from vmm to kvm*/ | 43 | /* define exit reasons from vmm to kvm*/ |
43 | #define EXIT_REASON_VM_PANIC 0 | 44 | #define EXIT_REASON_VM_PANIC 0 |
@@ -521,4 +522,6 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu); | |||
521 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); | 522 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run); |
522 | void kvm_sal_emul(struct kvm_vcpu *vcpu); | 523 | void kvm_sal_emul(struct kvm_vcpu *vcpu); |
523 | 524 | ||
525 | static inline void kvm_inject_nmi(struct kvm_vcpu *vcpu) {} | ||
526 | |||
524 | #endif | 527 | #endif |
diff --git a/include/asm-powerpc/kvm_host.h b/include/asm-powerpc/kvm_host.h index 81a69d711017..2655e2a4831e 100644 --- a/include/asm-powerpc/kvm_host.h +++ b/include/asm-powerpc/kvm_host.h | |||
@@ -31,6 +31,8 @@ | |||
31 | /* memory slots that does not exposed to userspace */ | 31 | /* memory slots that does not exposed to userspace */ |
32 | #define KVM_PRIVATE_MEM_SLOTS 4 | 32 | #define KVM_PRIVATE_MEM_SLOTS 4 |
33 | 33 | ||
34 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | ||
35 | |||
34 | /* We don't currently support large pages. */ | 36 | /* We don't currently support large pages. */ |
35 | #define KVM_PAGES_PER_HPAGE (1<<31) | 37 | #define KVM_PAGES_PER_HPAGE (1<<31) |
36 | 38 | ||
diff --git a/include/asm-s390/kvm_host.h b/include/asm-s390/kvm_host.h index 18cbd8a39796..3234dd5b3511 100644 --- a/include/asm-s390/kvm_host.h +++ b/include/asm-s390/kvm_host.h | |||
@@ -62,7 +62,7 @@ struct sca_block { | |||
62 | #define CPUSTAT_J 0x00000002 | 62 | #define CPUSTAT_J 0x00000002 |
63 | #define CPUSTAT_P 0x00000001 | 63 | #define CPUSTAT_P 0x00000001 |
64 | 64 | ||
65 | struct sie_block { | 65 | struct kvm_s390_sie_block { |
66 | atomic_t cpuflags; /* 0x0000 */ | 66 | atomic_t cpuflags; /* 0x0000 */ |
67 | __u32 prefix; /* 0x0004 */ | 67 | __u32 prefix; /* 0x0004 */ |
68 | __u8 reserved8[32]; /* 0x0008 */ | 68 | __u8 reserved8[32]; /* 0x0008 */ |
@@ -140,14 +140,14 @@ struct kvm_vcpu_stat { | |||
140 | u32 diagnose_44; | 140 | u32 diagnose_44; |
141 | }; | 141 | }; |
142 | 142 | ||
143 | struct io_info { | 143 | struct kvm_s390_io_info { |
144 | __u16 subchannel_id; /* 0x0b8 */ | 144 | __u16 subchannel_id; /* 0x0b8 */ |
145 | __u16 subchannel_nr; /* 0x0ba */ | 145 | __u16 subchannel_nr; /* 0x0ba */ |
146 | __u32 io_int_parm; /* 0x0bc */ | 146 | __u32 io_int_parm; /* 0x0bc */ |
147 | __u32 io_int_word; /* 0x0c0 */ | 147 | __u32 io_int_word; /* 0x0c0 */ |
148 | }; | 148 | }; |
149 | 149 | ||
150 | struct ext_info { | 150 | struct kvm_s390_ext_info { |
151 | __u32 ext_params; | 151 | __u32 ext_params; |
152 | __u64 ext_params2; | 152 | __u64 ext_params2; |
153 | }; | 153 | }; |
@@ -160,22 +160,22 @@ struct ext_info { | |||
160 | #define PGM_SPECIFICATION 0x06 | 160 | #define PGM_SPECIFICATION 0x06 |
161 | #define PGM_DATA 0x07 | 161 | #define PGM_DATA 0x07 |
162 | 162 | ||
163 | struct pgm_info { | 163 | struct kvm_s390_pgm_info { |
164 | __u16 code; | 164 | __u16 code; |
165 | }; | 165 | }; |
166 | 166 | ||
167 | struct prefix_info { | 167 | struct kvm_s390_prefix_info { |
168 | __u32 address; | 168 | __u32 address; |
169 | }; | 169 | }; |
170 | 170 | ||
171 | struct interrupt_info { | 171 | struct kvm_s390_interrupt_info { |
172 | struct list_head list; | 172 | struct list_head list; |
173 | u64 type; | 173 | u64 type; |
174 | union { | 174 | union { |
175 | struct io_info io; | 175 | struct kvm_s390_io_info io; |
176 | struct ext_info ext; | 176 | struct kvm_s390_ext_info ext; |
177 | struct pgm_info pgm; | 177 | struct kvm_s390_pgm_info pgm; |
178 | struct prefix_info prefix; | 178 | struct kvm_s390_prefix_info prefix; |
179 | }; | 179 | }; |
180 | }; | 180 | }; |
181 | 181 | ||
@@ -183,35 +183,35 @@ struct interrupt_info { | |||
183 | #define ACTION_STORE_ON_STOP 1 | 183 | #define ACTION_STORE_ON_STOP 1 |
184 | #define ACTION_STOP_ON_STOP 2 | 184 | #define ACTION_STOP_ON_STOP 2 |
185 | 185 | ||
186 | struct local_interrupt { | 186 | struct kvm_s390_local_interrupt { |
187 | spinlock_t lock; | 187 | spinlock_t lock; |
188 | struct list_head list; | 188 | struct list_head list; |
189 | atomic_t active; | 189 | atomic_t active; |
190 | struct float_interrupt *float_int; | 190 | struct kvm_s390_float_interrupt *float_int; |
191 | int timer_due; /* event indicator for waitqueue below */ | 191 | int timer_due; /* event indicator for waitqueue below */ |
192 | wait_queue_head_t wq; | 192 | wait_queue_head_t wq; |
193 | atomic_t *cpuflags; | 193 | atomic_t *cpuflags; |
194 | unsigned int action_bits; | 194 | unsigned int action_bits; |
195 | }; | 195 | }; |
196 | 196 | ||
197 | struct float_interrupt { | 197 | struct kvm_s390_float_interrupt { |
198 | spinlock_t lock; | 198 | spinlock_t lock; |
199 | struct list_head list; | 199 | struct list_head list; |
200 | atomic_t active; | 200 | atomic_t active; |
201 | int next_rr_cpu; | 201 | int next_rr_cpu; |
202 | unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)]; | 202 | unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)]; |
203 | struct local_interrupt *local_int[64]; | 203 | struct kvm_s390_local_interrupt *local_int[64]; |
204 | }; | 204 | }; |
205 | 205 | ||
206 | 206 | ||
207 | struct kvm_vcpu_arch { | 207 | struct kvm_vcpu_arch { |
208 | struct sie_block *sie_block; | 208 | struct kvm_s390_sie_block *sie_block; |
209 | unsigned long guest_gprs[16]; | 209 | unsigned long guest_gprs[16]; |
210 | s390_fp_regs host_fpregs; | 210 | s390_fp_regs host_fpregs; |
211 | unsigned int host_acrs[NUM_ACRS]; | 211 | unsigned int host_acrs[NUM_ACRS]; |
212 | s390_fp_regs guest_fpregs; | 212 | s390_fp_regs guest_fpregs; |
213 | unsigned int guest_acrs[NUM_ACRS]; | 213 | unsigned int guest_acrs[NUM_ACRS]; |
214 | struct local_interrupt local_int; | 214 | struct kvm_s390_local_interrupt local_int; |
215 | struct timer_list ckc_timer; | 215 | struct timer_list ckc_timer; |
216 | union { | 216 | union { |
217 | cpuid_t cpu_id; | 217 | cpuid_t cpu_id; |
@@ -228,8 +228,8 @@ struct kvm_arch{ | |||
228 | unsigned long guest_memsize; | 228 | unsigned long guest_memsize; |
229 | struct sca_block *sca; | 229 | struct sca_block *sca; |
230 | debug_info_t *dbf; | 230 | debug_info_t *dbf; |
231 | struct float_interrupt float_int; | 231 | struct kvm_s390_float_interrupt float_int; |
232 | }; | 232 | }; |
233 | 233 | ||
234 | extern int sie64a(struct sie_block *, __u64 *); | 234 | extern int sie64a(struct kvm_s390_sie_block *, __u64 *); |
235 | #endif | 235 | #endif |
diff --git a/include/asm-x86/kvm.h b/include/asm-x86/kvm.h index 80eefef2cc76..6f1840812e59 100644 --- a/include/asm-x86/kvm.h +++ b/include/asm-x86/kvm.h | |||
@@ -228,5 +228,6 @@ struct kvm_pit_state { | |||
228 | #define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) | 228 | #define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12) |
229 | #define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) | 229 | #define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13) |
230 | #define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) | 230 | #define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) |
231 | #define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) | ||
231 | 232 | ||
232 | #endif | 233 | #endif |
diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h index 844f2a89afbc..f995783b1fdb 100644 --- a/include/asm-x86/kvm_host.h +++ b/include/asm-x86/kvm_host.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #define KVM_PRIVATE_MEM_SLOTS 4 | 27 | #define KVM_PRIVATE_MEM_SLOTS 4 |
28 | 28 | ||
29 | #define KVM_PIO_PAGE_OFFSET 1 | 29 | #define KVM_PIO_PAGE_OFFSET 1 |
30 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 2 | ||
30 | 31 | ||
31 | #define CR3_PAE_RESERVED_BITS ((X86_CR3_PWT | X86_CR3_PCD) - 1) | 32 | #define CR3_PAE_RESERVED_BITS ((X86_CR3_PWT | X86_CR3_PCD) - 1) |
32 | #define CR3_NONPAE_RESERVED_BITS ((PAGE_SIZE-1) & ~(X86_CR3_PWT | X86_CR3_PCD)) | 33 | #define CR3_NONPAE_RESERVED_BITS ((PAGE_SIZE-1) & ~(X86_CR3_PWT | X86_CR3_PCD)) |
@@ -79,6 +80,7 @@ | |||
79 | #define KVM_MIN_FREE_MMU_PAGES 5 | 80 | #define KVM_MIN_FREE_MMU_PAGES 5 |
80 | #define KVM_REFILL_PAGES 25 | 81 | #define KVM_REFILL_PAGES 25 |
81 | #define KVM_MAX_CPUID_ENTRIES 40 | 82 | #define KVM_MAX_CPUID_ENTRIES 40 |
83 | #define KVM_NR_VAR_MTRR 8 | ||
82 | 84 | ||
83 | extern spinlock_t kvm_lock; | 85 | extern spinlock_t kvm_lock; |
84 | extern struct list_head vm_list; | 86 | extern struct list_head vm_list; |
@@ -109,12 +111,12 @@ enum { | |||
109 | }; | 111 | }; |
110 | 112 | ||
111 | enum { | 113 | enum { |
114 | VCPU_SREG_ES, | ||
112 | VCPU_SREG_CS, | 115 | VCPU_SREG_CS, |
116 | VCPU_SREG_SS, | ||
113 | VCPU_SREG_DS, | 117 | VCPU_SREG_DS, |
114 | VCPU_SREG_ES, | ||
115 | VCPU_SREG_FS, | 118 | VCPU_SREG_FS, |
116 | VCPU_SREG_GS, | 119 | VCPU_SREG_GS, |
117 | VCPU_SREG_SS, | ||
118 | VCPU_SREG_TR, | 120 | VCPU_SREG_TR, |
119 | VCPU_SREG_LDTR, | 121 | VCPU_SREG_LDTR, |
120 | }; | 122 | }; |
@@ -243,6 +245,7 @@ struct kvm_vcpu_arch { | |||
243 | gfn_t last_pt_write_gfn; | 245 | gfn_t last_pt_write_gfn; |
244 | int last_pt_write_count; | 246 | int last_pt_write_count; |
245 | u64 *last_pte_updated; | 247 | u64 *last_pte_updated; |
248 | gfn_t last_pte_gfn; | ||
246 | 249 | ||
247 | struct { | 250 | struct { |
248 | gfn_t gfn; /* presumed gfn during guest pte update */ | 251 | gfn_t gfn; /* presumed gfn during guest pte update */ |
@@ -287,6 +290,10 @@ struct kvm_vcpu_arch { | |||
287 | unsigned int hv_clock_tsc_khz; | 290 | unsigned int hv_clock_tsc_khz; |
288 | unsigned int time_offset; | 291 | unsigned int time_offset; |
289 | struct page *time_page; | 292 | struct page *time_page; |
293 | |||
294 | bool nmi_pending; | ||
295 | |||
296 | u64 mtrr[0x100]; | ||
290 | }; | 297 | }; |
291 | 298 | ||
292 | struct kvm_mem_alias { | 299 | struct kvm_mem_alias { |
@@ -344,6 +351,7 @@ struct kvm_vcpu_stat { | |||
344 | u32 mmio_exits; | 351 | u32 mmio_exits; |
345 | u32 signal_exits; | 352 | u32 signal_exits; |
346 | u32 irq_window_exits; | 353 | u32 irq_window_exits; |
354 | u32 nmi_window_exits; | ||
347 | u32 halt_exits; | 355 | u32 halt_exits; |
348 | u32 halt_wakeup; | 356 | u32 halt_wakeup; |
349 | u32 request_irq_exits; | 357 | u32 request_irq_exits; |
@@ -379,7 +387,6 @@ struct kvm_x86_ops { | |||
379 | void (*prepare_guest_switch)(struct kvm_vcpu *vcpu); | 387 | void (*prepare_guest_switch)(struct kvm_vcpu *vcpu); |
380 | void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu); | 388 | void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu); |
381 | void (*vcpu_put)(struct kvm_vcpu *vcpu); | 389 | void (*vcpu_put)(struct kvm_vcpu *vcpu); |
382 | void (*vcpu_decache)(struct kvm_vcpu *vcpu); | ||
383 | 390 | ||
384 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, | 391 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, |
385 | struct kvm_debug_guest *dbg); | 392 | struct kvm_debug_guest *dbg); |
@@ -497,6 +504,10 @@ int emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr, | |||
497 | int emulator_set_dr(struct x86_emulate_ctxt *ctxt, int dr, | 504 | int emulator_set_dr(struct x86_emulate_ctxt *ctxt, int dr, |
498 | unsigned long value); | 505 | unsigned long value); |
499 | 506 | ||
507 | void kvm_get_segment(struct kvm_vcpu *vcpu, struct kvm_segment *var, int seg); | ||
508 | int kvm_load_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector, | ||
509 | int type_bits, int seg); | ||
510 | |||
500 | int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason); | 511 | int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason); |
501 | 512 | ||
502 | void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0); | 513 | void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0); |
@@ -515,6 +526,8 @@ void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); | |||
515 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, | 526 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, |
516 | u32 error_code); | 527 | u32 error_code); |
517 | 528 | ||
529 | void kvm_inject_nmi(struct kvm_vcpu *vcpu); | ||
530 | |||
518 | void fx_init(struct kvm_vcpu *vcpu); | 531 | void fx_init(struct kvm_vcpu *vcpu); |
519 | 532 | ||
520 | int emulator_read_std(unsigned long addr, | 533 | int emulator_read_std(unsigned long addr, |
@@ -554,55 +567,53 @@ static inline struct kvm_mmu_page *page_header(hpa_t shadow_page) | |||
554 | return (struct kvm_mmu_page *)page_private(page); | 567 | return (struct kvm_mmu_page *)page_private(page); |
555 | } | 568 | } |
556 | 569 | ||
557 | static inline u16 read_fs(void) | 570 | static inline u16 kvm_read_fs(void) |
558 | { | 571 | { |
559 | u16 seg; | 572 | u16 seg; |
560 | asm("mov %%fs, %0" : "=g"(seg)); | 573 | asm("mov %%fs, %0" : "=g"(seg)); |
561 | return seg; | 574 | return seg; |
562 | } | 575 | } |
563 | 576 | ||
564 | static inline u16 read_gs(void) | 577 | static inline u16 kvm_read_gs(void) |
565 | { | 578 | { |
566 | u16 seg; | 579 | u16 seg; |
567 | asm("mov %%gs, %0" : "=g"(seg)); | 580 | asm("mov %%gs, %0" : "=g"(seg)); |
568 | return seg; | 581 | return seg; |
569 | } | 582 | } |
570 | 583 | ||
571 | static inline u16 read_ldt(void) | 584 | static inline u16 kvm_read_ldt(void) |
572 | { | 585 | { |
573 | u16 ldt; | 586 | u16 ldt; |
574 | asm("sldt %0" : "=g"(ldt)); | 587 | asm("sldt %0" : "=g"(ldt)); |
575 | return ldt; | 588 | return ldt; |
576 | } | 589 | } |
577 | 590 | ||
578 | static inline void load_fs(u16 sel) | 591 | static inline void kvm_load_fs(u16 sel) |
579 | { | 592 | { |
580 | asm("mov %0, %%fs" : : "rm"(sel)); | 593 | asm("mov %0, %%fs" : : "rm"(sel)); |
581 | } | 594 | } |
582 | 595 | ||
583 | static inline void load_gs(u16 sel) | 596 | static inline void kvm_load_gs(u16 sel) |
584 | { | 597 | { |
585 | asm("mov %0, %%gs" : : "rm"(sel)); | 598 | asm("mov %0, %%gs" : : "rm"(sel)); |
586 | } | 599 | } |
587 | 600 | ||
588 | #ifndef load_ldt | 601 | static inline void kvm_load_ldt(u16 sel) |
589 | static inline void load_ldt(u16 sel) | ||
590 | { | 602 | { |
591 | asm("lldt %0" : : "rm"(sel)); | 603 | asm("lldt %0" : : "rm"(sel)); |
592 | } | 604 | } |
593 | #endif | ||
594 | 605 | ||
595 | static inline void get_idt(struct descriptor_table *table) | 606 | static inline void kvm_get_idt(struct descriptor_table *table) |
596 | { | 607 | { |
597 | asm("sidt %0" : "=m"(*table)); | 608 | asm("sidt %0" : "=m"(*table)); |
598 | } | 609 | } |
599 | 610 | ||
600 | static inline void get_gdt(struct descriptor_table *table) | 611 | static inline void kvm_get_gdt(struct descriptor_table *table) |
601 | { | 612 | { |
602 | asm("sgdt %0" : "=m"(*table)); | 613 | asm("sgdt %0" : "=m"(*table)); |
603 | } | 614 | } |
604 | 615 | ||
605 | static inline unsigned long read_tr_base(void) | 616 | static inline unsigned long kvm_read_tr_base(void) |
606 | { | 617 | { |
607 | u16 tr; | 618 | u16 tr; |
608 | asm("str %0" : "=g"(tr)); | 619 | asm("str %0" : "=g"(tr)); |
@@ -619,17 +630,17 @@ static inline unsigned long read_msr(unsigned long msr) | |||
619 | } | 630 | } |
620 | #endif | 631 | #endif |
621 | 632 | ||
622 | static inline void fx_save(struct i387_fxsave_struct *image) | 633 | static inline void kvm_fx_save(struct i387_fxsave_struct *image) |
623 | { | 634 | { |
624 | asm("fxsave (%0)":: "r" (image)); | 635 | asm("fxsave (%0)":: "r" (image)); |
625 | } | 636 | } |
626 | 637 | ||
627 | static inline void fx_restore(struct i387_fxsave_struct *image) | 638 | static inline void kvm_fx_restore(struct i387_fxsave_struct *image) |
628 | { | 639 | { |
629 | asm("fxrstor (%0)":: "r" (image)); | 640 | asm("fxrstor (%0)":: "r" (image)); |
630 | } | 641 | } |
631 | 642 | ||
632 | static inline void fx_finit(void) | 643 | static inline void kvm_fx_finit(void) |
633 | { | 644 | { |
634 | asm("finit"); | 645 | asm("finit"); |
635 | } | 646 | } |
@@ -691,4 +702,28 @@ enum { | |||
691 | trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ | 702 | trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \ |
692 | vcpu, 0, 0, 0, 0, 0, 0) | 703 | vcpu, 0, 0, 0, 0, 0, 0) |
693 | 704 | ||
705 | #ifdef CONFIG_64BIT | ||
706 | #define KVM_EX_ENTRY ".quad" | ||
707 | #else | ||
708 | #define KVM_EX_ENTRY ".long" | ||
709 | #endif | ||
710 | |||
711 | /* | ||
712 | * Hardware virtualization extension instructions may fault if a | ||
713 | * reboot turns off virtualization while processes are running. | ||
714 | * Trap the fault and ignore the instruction if that happens. | ||
715 | */ | ||
716 | asmlinkage void kvm_handle_fault_on_reboot(void); | ||
717 | |||
718 | #define __kvm_handle_fault_on_reboot(insn) \ | ||
719 | "666: " insn "\n\t" \ | ||
720 | ".pushsection .text.fixup, \"ax\" \n" \ | ||
721 | "667: \n\t" \ | ||
722 | "push $666b \n\t" \ | ||
723 | "jmp kvm_handle_fault_on_reboot \n\t" \ | ||
724 | ".popsection \n\t" \ | ||
725 | ".pushsection __ex_table, \"a\" \n\t" \ | ||
726 | KVM_EX_ENTRY " 666b, 667b \n\t" \ | ||
727 | ".popsection" | ||
728 | |||
694 | #endif | 729 | #endif |
diff --git a/include/asm-x86/kvm_x86_emulate.h b/include/asm-x86/kvm_x86_emulate.h index b877bbd2d3a7..4e8c1e48d91d 100644 --- a/include/asm-x86/kvm_x86_emulate.h +++ b/include/asm-x86/kvm_x86_emulate.h | |||
@@ -124,7 +124,8 @@ struct decode_cache { | |||
124 | u8 rex_prefix; | 124 | u8 rex_prefix; |
125 | struct operand src; | 125 | struct operand src; |
126 | struct operand dst; | 126 | struct operand dst; |
127 | unsigned long *override_base; | 127 | bool has_seg_override; |
128 | u8 seg_override; | ||
128 | unsigned int d; | 129 | unsigned int d; |
129 | unsigned long regs[NR_VCPU_REGS]; | 130 | unsigned long regs[NR_VCPU_REGS]; |
130 | unsigned long eip; | 131 | unsigned long eip; |
@@ -134,6 +135,7 @@ struct decode_cache { | |||
134 | u8 modrm_reg; | 135 | u8 modrm_reg; |
135 | u8 modrm_rm; | 136 | u8 modrm_rm; |
136 | u8 use_modrm_ea; | 137 | u8 use_modrm_ea; |
138 | bool rip_relative; | ||
137 | unsigned long modrm_ea; | 139 | unsigned long modrm_ea; |
138 | void *modrm_ptr; | 140 | void *modrm_ptr; |
139 | unsigned long modrm_val; | 141 | unsigned long modrm_val; |
@@ -150,12 +152,7 @@ struct x86_emulate_ctxt { | |||
150 | /* Emulated execution mode, represented by an X86EMUL_MODE value. */ | 152 | /* Emulated execution mode, represented by an X86EMUL_MODE value. */ |
151 | int mode; | 153 | int mode; |
152 | 154 | ||
153 | unsigned long cs_base; | 155 | u32 cs_base; |
154 | unsigned long ds_base; | ||
155 | unsigned long es_base; | ||
156 | unsigned long ss_base; | ||
157 | unsigned long gs_base; | ||
158 | unsigned long fs_base; | ||
159 | 156 | ||
160 | /* decode cache */ | 157 | /* decode cache */ |
161 | 158 | ||
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index a281afeddfbb..0ea064cbfbc8 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -173,6 +173,30 @@ struct kvm_run { | |||
173 | }; | 173 | }; |
174 | }; | 174 | }; |
175 | 175 | ||
176 | /* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */ | ||
177 | |||
178 | struct kvm_coalesced_mmio_zone { | ||
179 | __u64 addr; | ||
180 | __u32 size; | ||
181 | __u32 pad; | ||
182 | }; | ||
183 | |||
184 | struct kvm_coalesced_mmio { | ||
185 | __u64 phys_addr; | ||
186 | __u32 len; | ||
187 | __u32 pad; | ||
188 | __u8 data[8]; | ||
189 | }; | ||
190 | |||
191 | struct kvm_coalesced_mmio_ring { | ||
192 | __u32 first, last; | ||
193 | struct kvm_coalesced_mmio coalesced_mmio[0]; | ||
194 | }; | ||
195 | |||
196 | #define KVM_COALESCED_MMIO_MAX \ | ||
197 | ((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \ | ||
198 | sizeof(struct kvm_coalesced_mmio)) | ||
199 | |||
176 | /* for KVM_TRANSLATE */ | 200 | /* for KVM_TRANSLATE */ |
177 | struct kvm_translation { | 201 | struct kvm_translation { |
178 | /* in */ | 202 | /* in */ |
@@ -294,14 +318,14 @@ struct kvm_trace_rec { | |||
294 | __u32 vcpu_id; | 318 | __u32 vcpu_id; |
295 | union { | 319 | union { |
296 | struct { | 320 | struct { |
297 | __u32 cycle_lo, cycle_hi; | 321 | __u64 cycle_u64; |
298 | __u32 extra_u32[KVM_TRC_EXTRA_MAX]; | 322 | __u32 extra_u32[KVM_TRC_EXTRA_MAX]; |
299 | } cycle; | 323 | } cycle; |
300 | struct { | 324 | struct { |
301 | __u32 extra_u32[KVM_TRC_EXTRA_MAX]; | 325 | __u32 extra_u32[KVM_TRC_EXTRA_MAX]; |
302 | } nocycle; | 326 | } nocycle; |
303 | } u; | 327 | } u; |
304 | }; | 328 | } __attribute__((packed)); |
305 | 329 | ||
306 | #define KVMIO 0xAE | 330 | #define KVMIO 0xAE |
307 | 331 | ||
@@ -346,6 +370,7 @@ struct kvm_trace_rec { | |||
346 | #define KVM_CAP_NOP_IO_DELAY 12 | 370 | #define KVM_CAP_NOP_IO_DELAY 12 |
347 | #define KVM_CAP_PV_MMU 13 | 371 | #define KVM_CAP_PV_MMU 13 |
348 | #define KVM_CAP_MP_STATE 14 | 372 | #define KVM_CAP_MP_STATE 14 |
373 | #define KVM_CAP_COALESCED_MMIO 15 | ||
349 | 374 | ||
350 | /* | 375 | /* |
351 | * ioctls for VM fds | 376 | * ioctls for VM fds |
@@ -371,6 +396,10 @@ struct kvm_trace_rec { | |||
371 | #define KVM_CREATE_PIT _IO(KVMIO, 0x64) | 396 | #define KVM_CREATE_PIT _IO(KVMIO, 0x64) |
372 | #define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_state) | 397 | #define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_state) |
373 | #define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_state) | 398 | #define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_state) |
399 | #define KVM_REGISTER_COALESCED_MMIO \ | ||
400 | _IOW(KVMIO, 0x67, struct kvm_coalesced_mmio_zone) | ||
401 | #define KVM_UNREGISTER_COALESCED_MMIO \ | ||
402 | _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone) | ||
374 | 403 | ||
375 | /* | 404 | /* |
376 | * ioctls for vcpu fds | 405 | * ioctls for vcpu fds |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index de9d1df4bba2..07d68a8ae8e9 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -52,7 +52,8 @@ struct kvm_io_bus { | |||
52 | 52 | ||
53 | void kvm_io_bus_init(struct kvm_io_bus *bus); | 53 | void kvm_io_bus_init(struct kvm_io_bus *bus); |
54 | void kvm_io_bus_destroy(struct kvm_io_bus *bus); | 54 | void kvm_io_bus_destroy(struct kvm_io_bus *bus); |
55 | struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus, gpa_t addr); | 55 | struct kvm_io_device *kvm_io_bus_find_dev(struct kvm_io_bus *bus, |
56 | gpa_t addr, int len, int is_write); | ||
56 | void kvm_io_bus_register_dev(struct kvm_io_bus *bus, | 57 | void kvm_io_bus_register_dev(struct kvm_io_bus *bus, |
57 | struct kvm_io_device *dev); | 58 | struct kvm_io_device *dev); |
58 | 59 | ||
@@ -116,6 +117,10 @@ struct kvm { | |||
116 | struct kvm_vm_stat stat; | 117 | struct kvm_vm_stat stat; |
117 | struct kvm_arch arch; | 118 | struct kvm_arch arch; |
118 | atomic_t users_count; | 119 | atomic_t users_count; |
120 | #ifdef KVM_COALESCED_MMIO_PAGE_OFFSET | ||
121 | struct kvm_coalesced_mmio_dev *coalesced_mmio_dev; | ||
122 | struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; | ||
123 | #endif | ||
119 | }; | 124 | }; |
120 | 125 | ||
121 | /* The guest did something we don't support. */ | 126 | /* The guest did something we don't support. */ |
@@ -135,9 +140,6 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); | |||
135 | void vcpu_load(struct kvm_vcpu *vcpu); | 140 | void vcpu_load(struct kvm_vcpu *vcpu); |
136 | void vcpu_put(struct kvm_vcpu *vcpu); | 141 | void vcpu_put(struct kvm_vcpu *vcpu); |
137 | 142 | ||
138 | void decache_vcpus_on_cpu(int cpu); | ||
139 | |||
140 | |||
141 | int kvm_init(void *opaque, unsigned int vcpu_size, | 143 | int kvm_init(void *opaque, unsigned int vcpu_size, |
142 | struct module *module); | 144 | struct module *module); |
143 | void kvm_exit(void); | 145 | void kvm_exit(void); |
@@ -166,6 +168,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
166 | struct kvm_userspace_memory_region *mem, | 168 | struct kvm_userspace_memory_region *mem, |
167 | struct kvm_memory_slot old, | 169 | struct kvm_memory_slot old, |
168 | int user_alloc); | 170 | int user_alloc); |
171 | void kvm_arch_flush_shadow(struct kvm *kvm); | ||
169 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); | 172 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn); |
170 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); | 173 | struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn); |
171 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); | 174 | unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn); |