diff options
-rw-r--r-- | arch/arm/include/asm/kvm_asm.h | 22 | ||||
-rw-r--r-- | arch/arm/kvm/coproc.c | 4 | ||||
-rw-r--r-- | arch/arm/kvm/interrupts.S | 12 | ||||
-rw-r--r-- | arch/arm/kvm/interrupts_head.S | 10 |
4 files changed, 35 insertions, 13 deletions
diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h index 18d50322a9e2..4bb08e3e52bc 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 |
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/interrupts.S b/arch/arm/kvm/interrupts.S index f7793df62f58..d0a8fa33409a 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S | |||
@@ -414,6 +414,10 @@ guest_trap: | |||
414 | mrcne p15, 4, r2, c6, c0, 4 @ HPFAR | 414 | mrcne p15, 4, r2, c6, c0, 4 @ HPFAR |
415 | bne 3f | 415 | bne 3f |
416 | 416 | ||
417 | /* Preserve PAR */ | ||
418 | mrrc p15, 0, r0, r1, c7 @ PAR | ||
419 | push {r0, r1} | ||
420 | |||
417 | /* Resolve IPA using the xFAR */ | 421 | /* Resolve IPA using the xFAR */ |
418 | mcr p15, 0, r2, c7, c8, 0 @ ATS1CPR | 422 | mcr p15, 0, r2, c7, c8, 0 @ ATS1CPR |
419 | isb | 423 | isb |
@@ -424,13 +428,19 @@ guest_trap: | |||
424 | lsl r2, r2, #4 | 428 | lsl r2, r2, #4 |
425 | orr r2, r2, r1, lsl #24 | 429 | orr r2, r2, r1, lsl #24 |
426 | 430 | ||
431 | /* Restore PAR */ | ||
432 | pop {r0, r1} | ||
433 | mcrr p15, 0, r0, r1, c7 @ PAR | ||
434 | |||
427 | 3: load_vcpu @ Load VCPU pointer to r0 | 435 | 3: load_vcpu @ Load VCPU pointer to r0 |
428 | str r2, [r0, #VCPU_HPFAR] | 436 | str r2, [r0, #VCPU_HPFAR] |
429 | 437 | ||
430 | 1: mov r1, #ARM_EXCEPTION_HVC | 438 | 1: mov r1, #ARM_EXCEPTION_HVC |
431 | b __kvm_vcpu_return | 439 | b __kvm_vcpu_return |
432 | 440 | ||
433 | 4: pop {r0, r1, r2} @ Failed translation, return to guest | 441 | 4: pop {r0, r1} @ Failed translation, return to guest |
442 | mcrr p15, 0, r0, r1, c7 @ PAR | ||
443 | pop {r0, r1, r2} | ||
434 | eret | 444 | eret |
435 | 445 | ||
436 | /* | 446 | /* |
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} |