Re: [PATCH 1/2] KVM: ARM: Cleanup _kvm_va_t_pa

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux