diff options
author | Gleb Natapov <gleb@redhat.com> | 2013-06-27 02:50:33 -0400 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-06-27 07:20:54 -0400 |
commit | 96f7edf9a54ca834f030ddf30f91750b3d737a03 (patch) | |
tree | e5761ffd63f8a4c8a125953073cf0f44d09707e7 /arch | |
parent | 24f7bb52e952912b6a936ebcdc4e744b03e9e5cf (diff) | |
parent | 8bd4ffd6b3a98f00267051dc095076ea2ff06ea8 (diff) |
Merge git://git.linaro.org/people/cdall/linux-kvm-arm.git tags/kvm-arm-3.11 into queue
KVM/ARM pull request for 3.11 merge window
* tag 'kvm-arm-3.11' of git://git.linaro.org/people/cdall/linux-kvm-arm.git:
ARM: kvm: don't include drivers/virtio/Kconfig
Update MAINTAINERS: KVM/ARM work now funded by Linaro
arm/kvm: Cleanup KVM_ARM_MAX_VCPUS logic
ARM: KVM: clear exclusive monitor on all exception returns
ARM: KVM: add missing dsb before invalidating Stage-2 TLBs
ARM: KVM: perform save/restore of PAR
ARM: KVM: get rid of S2_PGD_SIZE
ARM: KVM: don't special case PC when doing an MMIO
ARM: KVM: use phys_addr_t instead of unsigned long long for HYP PGDs
ARM: KVM: remove dead prototype for __kvm_tlb_flush_vmid
ARM: KVM: Don't handle PSCI calls via SMC
ARM: KVM: Allow host virt timer irq to be different from guest timer virt irq
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/include/asm/kvm_arm.h | 1 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_asm.h | 24 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_emulate.h | 5 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_host.h | 9 | ||||
-rw-r--r-- | arch/arm/kvm/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/kvm/arm.c | 8 | ||||
-rw-r--r-- | arch/arm/kvm/coproc.c | 4 | ||||
-rw-r--r-- | arch/arm/kvm/handle_exit.c | 3 | ||||
-rw-r--r-- | arch/arm/kvm/interrupts.S | 16 | ||||
-rw-r--r-- | arch/arm/kvm/interrupts_head.S | 10 | ||||
-rw-r--r-- | arch/arm/kvm/mmio.c | 6 | ||||
-rw-r--r-- | arch/arm/kvm/mmu.c | 3 | ||||
-rw-r--r-- | arch/arm/kvm/psci.c | 2 | ||||
-rw-r--r-- | arch/arm/kvm/reset.c | 12 |
14 files changed, 66 insertions, 45 deletions
diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h index 124623e5ef14..64e96960de29 100644 --- a/arch/arm/include/asm/kvm_arm.h +++ b/arch/arm/include/asm/kvm_arm.h | |||
@@ -135,7 +135,6 @@ | |||
135 | #define KVM_PHYS_MASK (KVM_PHYS_SIZE - 1ULL) | 135 | #define KVM_PHYS_MASK (KVM_PHYS_SIZE - 1ULL) |
136 | #define PTRS_PER_S2_PGD (1ULL << (KVM_PHYS_SHIFT - 30)) | 136 | #define PTRS_PER_S2_PGD (1ULL << (KVM_PHYS_SHIFT - 30)) |
137 | #define S2_PGD_ORDER get_order(PTRS_PER_S2_PGD * sizeof(pgd_t)) | 137 | #define S2_PGD_ORDER get_order(PTRS_PER_S2_PGD * sizeof(pgd_t)) |
138 | #define S2_PGD_SIZE (1 << S2_PGD_ORDER) | ||
139 | 138 | ||
140 | /* Virtualization Translation Control Register (VTCR) bits */ | 139 | /* Virtualization Translation Control Register (VTCR) bits */ |
141 | #define VTCR_SH0 (3 << 12) | 140 | #define VTCR_SH0 (3 << 12) |
diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h index 18d50322a9e2..a2f43ddcc300 100644 --- a/arch/arm/include/asm/kvm_asm.h +++ b/arch/arm/include/asm/kvm_asm.h | |||
@@ -37,16 +37,18 @@ | |||
37 | #define c5_AIFSR 15 /* Auxilary Instrunction Fault Status R */ | 37 | #define c5_AIFSR 15 /* Auxilary Instrunction Fault Status R */ |
38 | #define c6_DFAR 16 /* Data Fault Address Register */ | 38 | #define c6_DFAR 16 /* Data Fault Address Register */ |
39 | #define c6_IFAR 17 /* Instruction Fault Address Register */ | 39 | #define c6_IFAR 17 /* Instruction Fault Address Register */ |
40 | #define c9_L2CTLR 18 /* Cortex A15 L2 Control Register */ | 40 | #define c7_PAR 18 /* Physical Address Register */ |
41 | #define c10_PRRR 19 /* Primary Region Remap Register */ | 41 | #define c7_PAR_high 19 /* PAR top 32 bits */ |
42 | #define c10_NMRR 20 /* Normal Memory Remap Register */ | 42 | #define c9_L2CTLR 20 /* Cortex A15 L2 Control Register */ |
43 | #define c12_VBAR 21 /* Vector Base Address Register */ | 43 | #define c10_PRRR 21 /* Primary Region Remap Register */ |
44 | #define c13_CID 22 /* Context ID Register */ | 44 | #define c10_NMRR 22 /* Normal Memory Remap Register */ |
45 | #define c13_TID_URW 23 /* Thread ID, User R/W */ | 45 | #define c12_VBAR 23 /* Vector Base Address Register */ |
46 | #define c13_TID_URO 24 /* Thread ID, User R/O */ | 46 | #define c13_CID 24 /* Context ID Register */ |
47 | #define c13_TID_PRIV 25 /* Thread ID, Privileged */ | 47 | #define c13_TID_URW 25 /* Thread ID, User R/W */ |
48 | #define c14_CNTKCTL 26 /* Timer Control Register (PL1) */ | 48 | #define c13_TID_URO 26 /* Thread ID, User R/O */ |
49 | #define NR_CP15_REGS 27 /* Number of regs (incl. invalid) */ | 49 | #define c13_TID_PRIV 27 /* Thread ID, Privileged */ |
50 | #define c14_CNTKCTL 28 /* Timer Control Register (PL1) */ | ||
51 | #define NR_CP15_REGS 29 /* Number of regs (incl. invalid) */ | ||
50 | 52 | ||
51 | #define ARM_EXCEPTION_RESET 0 | 53 | #define ARM_EXCEPTION_RESET 0 |
52 | #define ARM_EXCEPTION_UNDEFINED 1 | 54 | #define ARM_EXCEPTION_UNDEFINED 1 |
@@ -72,8 +74,6 @@ extern char __kvm_hyp_vector[]; | |||
72 | extern char __kvm_hyp_code_start[]; | 74 | extern char __kvm_hyp_code_start[]; |
73 | extern char __kvm_hyp_code_end[]; | 75 | extern char __kvm_hyp_code_end[]; |
74 | 76 | ||
75 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); | ||
76 | |||
77 | extern void __kvm_flush_vm_context(void); | 77 | extern void __kvm_flush_vm_context(void); |
78 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | 78 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); |
79 | 79 | ||
diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h index 82b4babead2c..a464e8d7b6c5 100644 --- a/arch/arm/include/asm/kvm_emulate.h +++ b/arch/arm/include/asm/kvm_emulate.h | |||
@@ -65,11 +65,6 @@ static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu) | |||
65 | return cpsr_mode > USR_MODE;; | 65 | return cpsr_mode > USR_MODE;; |
66 | } | 66 | } |
67 | 67 | ||
68 | static inline bool kvm_vcpu_reg_is_pc(struct kvm_vcpu *vcpu, int reg) | ||
69 | { | ||
70 | return reg == 15; | ||
71 | } | ||
72 | |||
73 | static inline u32 kvm_vcpu_get_hsr(struct kvm_vcpu *vcpu) | 68 | static inline u32 kvm_vcpu_get_hsr(struct kvm_vcpu *vcpu) |
74 | { | 69 | { |
75 | return vcpu->arch.fault.hsr; | 70 | return vcpu->arch.fault.hsr; |
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index ff5aaf10e6ec..7d22517d8071 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h | |||
@@ -25,7 +25,12 @@ | |||
25 | #include <asm/fpstate.h> | 25 | #include <asm/fpstate.h> |
26 | #include <kvm/arm_arch_timer.h> | 26 | #include <kvm/arm_arch_timer.h> |
27 | 27 | ||
28 | #if defined(CONFIG_KVM_ARM_MAX_VCPUS) | ||
28 | #define KVM_MAX_VCPUS CONFIG_KVM_ARM_MAX_VCPUS | 29 | #define KVM_MAX_VCPUS CONFIG_KVM_ARM_MAX_VCPUS |
30 | #else | ||
31 | #define KVM_MAX_VCPUS 0 | ||
32 | #endif | ||
33 | |||
29 | #define KVM_USER_MEM_SLOTS 32 | 34 | #define KVM_USER_MEM_SLOTS 32 |
30 | #define KVM_PRIVATE_MEM_SLOTS 4 | 35 | #define KVM_PRIVATE_MEM_SLOTS 4 |
31 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | 36 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 |
@@ -190,8 +195,8 @@ int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *); | |||
190 | int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, | 195 | int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, |
191 | int exception_index); | 196 | int exception_index); |
192 | 197 | ||
193 | static inline void __cpu_init_hyp_mode(unsigned long long boot_pgd_ptr, | 198 | static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr, |
194 | unsigned long long pgd_ptr, | 199 | phys_addr_t pgd_ptr, |
195 | unsigned long hyp_stack_ptr, | 200 | unsigned long hyp_stack_ptr, |
196 | unsigned long vector_ptr) | 201 | unsigned long vector_ptr) |
197 | { | 202 | { |
diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig index 370e1a8af6ac..ebf5015508b5 100644 --- a/arch/arm/kvm/Kconfig +++ b/arch/arm/kvm/Kconfig | |||
@@ -41,9 +41,9 @@ config KVM_ARM_HOST | |||
41 | Provides host support for ARM processors. | 41 | Provides host support for ARM processors. |
42 | 42 | ||
43 | config KVM_ARM_MAX_VCPUS | 43 | config KVM_ARM_MAX_VCPUS |
44 | int "Number maximum supported virtual CPUs per VM" if KVM_ARM_HOST | 44 | int "Number maximum supported virtual CPUs per VM" |
45 | default 4 if KVM_ARM_HOST | 45 | depends on KVM_ARM_HOST |
46 | default 0 | 46 | default 4 |
47 | help | 47 | help |
48 | Static number of max supported virtual CPUs per VM. | 48 | Static number of max supported virtual CPUs per VM. |
49 | 49 | ||
@@ -67,6 +67,4 @@ config KVM_ARM_TIMER | |||
67 | ---help--- | 67 | ---help--- |
68 | Adds support for the Architected Timers in virtual machines | 68 | Adds support for the Architected Timers in virtual machines |
69 | 69 | ||
70 | source drivers/virtio/Kconfig | ||
71 | |||
72 | endif # VIRTUALIZATION | 70 | endif # VIRTUALIZATION |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 37d216d814cd..327a1fb70fc9 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -789,8 +789,8 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
789 | 789 | ||
790 | static void cpu_init_hyp_mode(void *dummy) | 790 | static void cpu_init_hyp_mode(void *dummy) |
791 | { | 791 | { |
792 | unsigned long long boot_pgd_ptr; | 792 | phys_addr_t boot_pgd_ptr; |
793 | unsigned long long pgd_ptr; | 793 | phys_addr_t pgd_ptr; |
794 | unsigned long hyp_stack_ptr; | 794 | unsigned long hyp_stack_ptr; |
795 | unsigned long stack_page; | 795 | unsigned long stack_page; |
796 | unsigned long vector_ptr; | 796 | unsigned long vector_ptr; |
@@ -798,8 +798,8 @@ static void cpu_init_hyp_mode(void *dummy) | |||
798 | /* Switch from the HYP stub to our own HYP init vector */ | 798 | /* Switch from the HYP stub to our own HYP init vector */ |
799 | __hyp_set_vectors(kvm_get_idmap_vector()); | 799 | __hyp_set_vectors(kvm_get_idmap_vector()); |
800 | 800 | ||
801 | boot_pgd_ptr = (unsigned long long)kvm_mmu_get_boot_httbr(); | 801 | boot_pgd_ptr = kvm_mmu_get_boot_httbr(); |
802 | pgd_ptr = (unsigned long long)kvm_mmu_get_httbr(); | 802 | pgd_ptr = kvm_mmu_get_httbr(); |
803 | stack_page = __get_cpu_var(kvm_arm_hyp_stack_page); | 803 | stack_page = __get_cpu_var(kvm_arm_hyp_stack_page); |
804 | hyp_stack_ptr = stack_page + PAGE_SIZE; | 804 | hyp_stack_ptr = stack_page + PAGE_SIZE; |
805 | vector_ptr = (unsigned long)__kvm_hyp_vector; | 805 | vector_ptr = (unsigned long)__kvm_hyp_vector; |
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c index 8eea97be1ed5..4a5199070430 100644 --- a/arch/arm/kvm/coproc.c +++ b/arch/arm/kvm/coproc.c | |||
@@ -180,6 +180,10 @@ static const struct coproc_reg cp15_regs[] = { | |||
180 | NULL, reset_unknown, c6_DFAR }, | 180 | NULL, reset_unknown, c6_DFAR }, |
181 | { CRn( 6), CRm( 0), Op1( 0), Op2( 2), is32, | 181 | { CRn( 6), CRm( 0), Op1( 0), Op2( 2), is32, |
182 | NULL, reset_unknown, c6_IFAR }, | 182 | NULL, reset_unknown, c6_IFAR }, |
183 | |||
184 | /* PAR swapped by interrupt.S */ | ||
185 | { CRn( 7), Op1( 0), is64, NULL, reset_unknown64, c7_PAR }, | ||
186 | |||
183 | /* | 187 | /* |
184 | * DC{C,I,CI}SW operations: | 188 | * DC{C,I,CI}SW operations: |
185 | */ | 189 | */ |
diff --git a/arch/arm/kvm/handle_exit.c b/arch/arm/kvm/handle_exit.c index 3d74a0be47db..df4c82d47ad7 100644 --- a/arch/arm/kvm/handle_exit.c +++ b/arch/arm/kvm/handle_exit.c | |||
@@ -52,9 +52,6 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
52 | 52 | ||
53 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) | 53 | static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) |
54 | { | 54 | { |
55 | if (kvm_psci_call(vcpu)) | ||
56 | return 1; | ||
57 | |||
58 | kvm_inject_undefined(vcpu); | 55 | kvm_inject_undefined(vcpu); |
59 | return 1; | 56 | return 1; |
60 | } | 57 | } |
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S index f7793df62f58..16cd4ba5d7fd 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S | |||
@@ -49,6 +49,7 @@ __kvm_hyp_code_start: | |||
49 | ENTRY(__kvm_tlb_flush_vmid_ipa) | 49 | ENTRY(__kvm_tlb_flush_vmid_ipa) |
50 | push {r2, r3} | 50 | push {r2, r3} |
51 | 51 | ||
52 | dsb ishst | ||
52 | add r0, r0, #KVM_VTTBR | 53 | add r0, r0, #KVM_VTTBR |
53 | ldrd r2, r3, [r0] | 54 | ldrd r2, r3, [r0] |
54 | mcrr p15, 6, r2, r3, c2 @ Write VTTBR | 55 | mcrr p15, 6, r2, r3, c2 @ Write VTTBR |
@@ -291,6 +292,7 @@ THUMB( orr r2, r2, #PSR_T_BIT ) | |||
291 | ldr r2, =BSYM(panic) | 292 | ldr r2, =BSYM(panic) |
292 | msr ELR_hyp, r2 | 293 | msr ELR_hyp, r2 |
293 | ldr r0, =\panic_str | 294 | ldr r0, =\panic_str |
295 | clrex @ Clear exclusive monitor | ||
294 | eret | 296 | eret |
295 | .endm | 297 | .endm |
296 | 298 | ||
@@ -414,6 +416,10 @@ guest_trap: | |||
414 | mrcne p15, 4, r2, c6, c0, 4 @ HPFAR | 416 | mrcne p15, 4, r2, c6, c0, 4 @ HPFAR |
415 | bne 3f | 417 | bne 3f |
416 | 418 | ||
419 | /* Preserve PAR */ | ||
420 | mrrc p15, 0, r0, r1, c7 @ PAR | ||
421 | push {r0, r1} | ||
422 | |||
417 | /* Resolve IPA using the xFAR */ | 423 | /* Resolve IPA using the xFAR */ |
418 | mcr p15, 0, r2, c7, c8, 0 @ ATS1CPR | 424 | mcr p15, 0, r2, c7, c8, 0 @ ATS1CPR |
419 | isb | 425 | isb |
@@ -424,13 +430,20 @@ guest_trap: | |||
424 | lsl r2, r2, #4 | 430 | lsl r2, r2, #4 |
425 | orr r2, r2, r1, lsl #24 | 431 | orr r2, r2, r1, lsl #24 |
426 | 432 | ||
433 | /* Restore PAR */ | ||
434 | pop {r0, r1} | ||
435 | mcrr p15, 0, r0, r1, c7 @ PAR | ||
436 | |||
427 | 3: load_vcpu @ Load VCPU pointer to r0 | 437 | 3: load_vcpu @ Load VCPU pointer to r0 |
428 | str r2, [r0, #VCPU_HPFAR] | 438 | str r2, [r0, #VCPU_HPFAR] |
429 | 439 | ||
430 | 1: mov r1, #ARM_EXCEPTION_HVC | 440 | 1: mov r1, #ARM_EXCEPTION_HVC |
431 | b __kvm_vcpu_return | 441 | b __kvm_vcpu_return |
432 | 442 | ||
433 | 4: pop {r0, r1, r2} @ Failed translation, return to guest | 443 | 4: pop {r0, r1} @ Failed translation, return to guest |
444 | mcrr p15, 0, r0, r1, c7 @ PAR | ||
445 | clrex | ||
446 | pop {r0, r1, r2} | ||
434 | eret | 447 | eret |
435 | 448 | ||
436 | /* | 449 | /* |
@@ -456,6 +469,7 @@ switch_to_guest_vfp: | |||
456 | 469 | ||
457 | pop {r3-r7} | 470 | pop {r3-r7} |
458 | pop {r0-r2} | 471 | pop {r0-r2} |
472 | clrex | ||
459 | eret | 473 | eret |
460 | #endif | 474 | #endif |
461 | 475 | ||
diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S index 3c8f2f0b4c5e..2b44b95a86dd 100644 --- a/arch/arm/kvm/interrupts_head.S +++ b/arch/arm/kvm/interrupts_head.S | |||
@@ -302,11 +302,14 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
302 | .endif | 302 | .endif |
303 | 303 | ||
304 | mrc p15, 0, r2, c14, c1, 0 @ CNTKCTL | 304 | mrc p15, 0, r2, c14, c1, 0 @ CNTKCTL |
305 | mrrc p15, 0, r4, r5, c7 @ PAR | ||
305 | 306 | ||
306 | .if \store_to_vcpu == 0 | 307 | .if \store_to_vcpu == 0 |
307 | push {r2} | 308 | push {r2,r4-r5} |
308 | .else | 309 | .else |
309 | str r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] | 310 | str r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] |
311 | add r12, vcpu, #CP15_OFFSET(c7_PAR) | ||
312 | strd r4, r5, [r12] | ||
310 | .endif | 313 | .endif |
311 | .endm | 314 | .endm |
312 | 315 | ||
@@ -319,12 +322,15 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
319 | */ | 322 | */ |
320 | .macro write_cp15_state read_from_vcpu | 323 | .macro write_cp15_state read_from_vcpu |
321 | .if \read_from_vcpu == 0 | 324 | .if \read_from_vcpu == 0 |
322 | pop {r2} | 325 | pop {r2,r4-r5} |
323 | .else | 326 | .else |
324 | ldr r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] | 327 | ldr r2, [vcpu, #CP15_OFFSET(c14_CNTKCTL)] |
328 | add r12, vcpu, #CP15_OFFSET(c7_PAR) | ||
329 | ldrd r4, r5, [r12] | ||
325 | .endif | 330 | .endif |
326 | 331 | ||
327 | mcr p15, 0, r2, c14, c1, 0 @ CNTKCTL | 332 | mcr p15, 0, r2, c14, c1, 0 @ CNTKCTL |
333 | mcrr p15, 0, r4, r5, c7 @ PAR | ||
328 | 334 | ||
329 | .if \read_from_vcpu == 0 | 335 | .if \read_from_vcpu == 0 |
330 | pop {r2-r12} | 336 | pop {r2-r12} |
diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c index 72a12f2171b2..b8e06b7a2833 100644 --- a/arch/arm/kvm/mmio.c +++ b/arch/arm/kvm/mmio.c | |||
@@ -86,12 +86,6 @@ static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | |||
86 | sign_extend = kvm_vcpu_dabt_issext(vcpu); | 86 | sign_extend = kvm_vcpu_dabt_issext(vcpu); |
87 | rt = kvm_vcpu_dabt_get_rd(vcpu); | 87 | rt = kvm_vcpu_dabt_get_rd(vcpu); |
88 | 88 | ||
89 | if (kvm_vcpu_reg_is_pc(vcpu, rt)) { | ||
90 | /* IO memory trying to read/write pc */ | ||
91 | kvm_inject_pabt(vcpu, kvm_vcpu_get_hfar(vcpu)); | ||
92 | return 1; | ||
93 | } | ||
94 | |||
95 | mmio->is_write = is_write; | 89 | mmio->is_write = is_write; |
96 | mmio->phys_addr = fault_ipa; | 90 | mmio->phys_addr = fault_ipa; |
97 | mmio->len = len; | 91 | mmio->len = len; |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 965706578f13..5385462d693a 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -370,9 +370,6 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm) | |||
370 | if (!pgd) | 370 | if (!pgd) |
371 | return -ENOMEM; | 371 | return -ENOMEM; |
372 | 372 | ||
373 | /* stage-2 pgd must be aligned to its size */ | ||
374 | VM_BUG_ON((unsigned long)pgd & (S2_PGD_SIZE - 1)); | ||
375 | |||
376 | memset(pgd, 0, PTRS_PER_S2_PGD * sizeof(pgd_t)); | 373 | memset(pgd, 0, PTRS_PER_S2_PGD * sizeof(pgd_t)); |
377 | kvm_clean_pgd(pgd); | 374 | kvm_clean_pgd(pgd); |
378 | kvm->arch.pgd = pgd; | 375 | kvm->arch.pgd = pgd; |
diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c index 7ee5bb7a3667..86a693a02ba3 100644 --- a/arch/arm/kvm/psci.c +++ b/arch/arm/kvm/psci.c | |||
@@ -75,7 +75,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) | |||
75 | * kvm_psci_call - handle PSCI call if r0 value is in range | 75 | * kvm_psci_call - handle PSCI call if r0 value is in range |
76 | * @vcpu: Pointer to the VCPU struct | 76 | * @vcpu: Pointer to the VCPU struct |
77 | * | 77 | * |
78 | * Handle PSCI calls from guests through traps from HVC or SMC instructions. | 78 | * Handle PSCI calls from guests through traps from HVC instructions. |
79 | * The calling convention is similar to SMC calls to the secure world where | 79 | * The calling convention is similar to SMC calls to the secure world where |
80 | * the function number is placed in r0 and this function returns true if the | 80 | * the function number is placed in r0 and this function returns true if the |
81 | * function number specified in r0 is withing the PSCI range, and false | 81 | * function number specified in r0 is withing the PSCI range, and false |
diff --git a/arch/arm/kvm/reset.c b/arch/arm/kvm/reset.c index b80256b554cd..b7840e7aa452 100644 --- a/arch/arm/kvm/reset.c +++ b/arch/arm/kvm/reset.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <asm/kvm_arm.h> | 27 | #include <asm/kvm_arm.h> |
28 | #include <asm/kvm_coproc.h> | 28 | #include <asm/kvm_coproc.h> |
29 | 29 | ||
30 | #include <kvm/arm_arch_timer.h> | ||
31 | |||
30 | /****************************************************************************** | 32 | /****************************************************************************** |
31 | * Cortex-A15 Reset Values | 33 | * Cortex-A15 Reset Values |
32 | */ | 34 | */ |
@@ -37,6 +39,11 @@ static struct kvm_regs a15_regs_reset = { | |||
37 | .usr_regs.ARM_cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT, | 39 | .usr_regs.ARM_cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT, |
38 | }; | 40 | }; |
39 | 41 | ||
42 | static const struct kvm_irq_level a15_vtimer_irq = { | ||
43 | .irq = 27, | ||
44 | .level = 1, | ||
45 | }; | ||
46 | |||
40 | 47 | ||
41 | /******************************************************************************* | 48 | /******************************************************************************* |
42 | * Exported reset function | 49 | * Exported reset function |
@@ -52,6 +59,7 @@ static struct kvm_regs a15_regs_reset = { | |||
52 | int kvm_reset_vcpu(struct kvm_vcpu *vcpu) | 59 | int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
53 | { | 60 | { |
54 | struct kvm_regs *cpu_reset; | 61 | struct kvm_regs *cpu_reset; |
62 | const struct kvm_irq_level *cpu_vtimer_irq; | ||
55 | 63 | ||
56 | switch (vcpu->arch.target) { | 64 | switch (vcpu->arch.target) { |
57 | case KVM_ARM_TARGET_CORTEX_A15: | 65 | case KVM_ARM_TARGET_CORTEX_A15: |
@@ -59,6 +67,7 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) | |||
59 | return -EINVAL; | 67 | return -EINVAL; |
60 | cpu_reset = &a15_regs_reset; | 68 | cpu_reset = &a15_regs_reset; |
61 | vcpu->arch.midr = read_cpuid_id(); | 69 | vcpu->arch.midr = read_cpuid_id(); |
70 | cpu_vtimer_irq = &a15_vtimer_irq; | ||
62 | break; | 71 | break; |
63 | default: | 72 | default: |
64 | return -ENODEV; | 73 | return -ENODEV; |
@@ -70,5 +79,8 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) | |||
70 | /* Reset CP15 registers */ | 79 | /* Reset CP15 registers */ |
71 | kvm_reset_coprocs(vcpu); | 80 | kvm_reset_coprocs(vcpu); |
72 | 81 | ||
82 | /* Reset arch_timer context */ | ||
83 | kvm_timer_vcpu_reset(vcpu, cpu_vtimer_irq); | ||
84 | |||
73 | return 0; | 85 | return 0; |
74 | } | 86 | } |