On Wed, Aug 29, 2012 at 6:41 PM, Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> wrote: > Co-written with Marc Zyngier (in pair - yeah!) this is just better. > > Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> > Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx> > --- > arch/arm/kvm/interrupts.S | 32 +++++++++++++------------------- > 1 file changed, 13 insertions(+), 19 deletions(-) > > diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S > index 1c8d627..28ecf22 100644 > --- a/arch/arm/kvm/interrupts.S > +++ b/arch/arm/kvm/interrupts.S > @@ -602,36 +602,30 @@ after_vfp_restore: > bx lr @ return to IOCTL > > @ Arguments: > -@ r0: pointer to vcpu struct > +@ r0: pointer to kvm struct > @ r1: virtual address to map (rounded to page) > -@ r2: 1 = P1 (read) mapping, 0 = P0 (read) mapping. > +@ r2: 1 = PL1 (read) mapping, 0 = PL0 (read) mapping. > @ Returns 64 bit PAR value. > ENTRY(__kvm_va_to_pa) > - hvc #0 @ switch to hyp-mode > + hvc #0 @ Switch to Hyp mode > + push {r4, r5} > > - push {r4-r12} > + add r0, r0, #KVM_VTTBR > + ldrd r4, r5, [r0] > + mcrr p15, 6, r4, r5, c2 @ Write VTTBR > > - @ Fold flag into r1, easier than using stack. > cmp r2, #0 > - movne r2, #1 > - orr r1, r1, r2 > - > - @ This swaps too many registers, but we're in the slow path anyway. > - read_cp15_state > - write_cp15_state 1, r0 > - > - ands r2, r1, #1 > - bic r1, r1, r2 > mcrne p15, 0, r1, c7, c8, 0 @ VA to PA, ATS1CPR > mcreq p15, 0, r1, c7, c8, 2 @ VA to PA, ATS1CUR > isb > + mrrc p15, 0, r0, r1, c7 @ PAR > > - @ Restore host state. > - read_cp15_state 1, r0 > - write_cp15_state > + mov r4, #0 > + mov r5, #0 > + mcrr p15, 6, r4, r5, c2 @ Back to VMID #0 > + isb > > - mrrc p15, 0, r0, r1, c7 @ PAR > - pop {r4-r12} > + pop {r4, r5} > hvc #0 @ Back to SVC > bx lr > nope, doesn't work, we need to change TTBR and TTBCR as well: diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S index 28ecf22..aa4cb8c 100644 --- a/arch/arm/kvm/interrupts.S +++ b/arch/arm/kvm/interrupts.S @@ -602,18 +602,34 @@ after_vfp_restore: bx lr @ return to IOCTL @ Arguments: -@ r0: pointer to kvm struct +@ r0: pointer to vcpu struct @ r1: virtual address to map (rounded to page) @ r2: 1 = PL1 (read) mapping, 0 = PL0 (read) mapping. @ Returns 64 bit PAR value. ENTRY(__kvm_va_to_pa) hvc #0 @ Switch to Hyp mode - push {r4, r5} + push {r4, r5, r6, r7} - add r0, r0, #KVM_VTTBR - ldrd r4, r5, [r0] + ldr r3, [r0, #VCPU_KVM] + add r3, r3, #KVM_VTTBR + ldrd r4, r5, [r3] mcrr p15, 6, r4, r5, c2 @ Write VTTBR + mrc p15, 0, r6, c2, c0, 2 @ TTBCR + push {r6} + mrrc p15, 0, r6, r7, c2 @ TTBR 0 + push {r6, r7} + mrrc p15, 1, r6, r7, c2 @ TTBR 1 + push {r6, r7} + + add r0, r0, #VCPU_TTBR0 + ldrd r6, r7, [r0] + mcrr p15, 0, r6, r7, c2 @ TTBR 0 + add r0, r0, #(VCPU_TTBR1 - VCPU_TTBR0) + ldrd r6, r7, [r0] + mcrr p15, 1, r6, r7, c2 @ TTBR 1 + isb + cmp r2, #0 mcrne p15, 0, r1, c7, c8, 0 @ VA to PA, ATS1CPR mcreq p15, 0, r1, c7, c8, 2 @ VA to PA, ATS1CUR @@ -623,9 +639,16 @@ ENTRY(__kvm_va_to_pa) mov r4, #0 mov r5, #0 mcrr p15, 6, r4, r5, c2 @ Back to VMID #0 + + pop {r6, r7} + mcrr p15, 1, r6, r7, c2 @ TTBR 1 + pop {r6, r7} + mcrr p15, 0, r6, r7, c2 @ TTBR 1 + pop {r6} + mcr p15, 0, r6, c2, c0, 2 @ TTBCR isb - pop {r4, r5} + pop {r4, r5, r6, r7} hvc #0 @ Back to SVC bx lr _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm