Re: [PATCH 1/7] ARM: KVM: make sure the VTTBR field can be accessed from asm code

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

 



I'm not sure about the inkernel coding standards.
But why can't this be:
#if KVM_VTTBR > 255
    add r1, r1, #KVM_VTTBR
    ldrd    r2, r3, [r1]
#else
    ldrd    r2, r3, [r1, #KVM_VTTBR]
#endif
?
This way you wont add additional cycles if its not needed in particular configuration.

On Wed, Oct 17, 2012 at 5:12 PM, Marc Zyngier <marc.zyngier@xxxxxxx> wrote:
Anton Romanov reports the following:

  AS      arch/arm/kvm/interrupts.o
/tmp/ccw2DnTo.s: Assembler messages:
/tmp/ccw2DnTo.s: Error: bad immediate value for 8-bit offset (256)

which is due to the vttbr field being out of reach from an ldrd
instruction for some random configuration.

Two workaround are implemented in this patch:
- move the fields accessed by the assembly code towards the beginning
  of the structure,
- use an add instead of an immediate indexing to load vttbr.

Reported-by: Anton Romanov <theli.ua@xxxxxxxxx>
Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
---
 arch/arm/include/asm/kvm_host.h | 17 +++++++++++------
 arch/arm/kvm/interrupts.S       |  3 ++-
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 4e2cd67..149c92a 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -45,6 +45,17 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu);
 void kvm_reset_coprocs(struct kvm_vcpu *vcpu);

 struct kvm_arch {
+       /* VTTBR value associated with below pgd and vmid */
+       u64    vttbr;
+
+       /* Timer */
+       struct arch_timer_kvm   timer;
+
+       /*
+        * Anything that is not used directly from assembly code goes
+        * here.
+        */
+
        /* The VMID generation used for the virt. memory system */
        u64    vmid_gen;
        u32    vmid;
@@ -52,14 +63,8 @@ struct kvm_arch {
        /* Stage-2 page table */
        pgd_t *pgd;

-       /* VTTBR value associated with above pgd and vmid */
-       u64    vttbr;
-
        /* Interrupt controller */
        struct vgic_dist        vgic;
-
-       /* Timer */
-       struct arch_timer_kvm   timer;
 };

 #define KVM_NR_MEM_OBJS     40
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
index 775b29d..e08a985 100644
--- a/arch/arm/kvm/interrupts.S
+++ b/arch/arm/kvm/interrupts.S
@@ -126,7 +126,8 @@ ENTRY(__kvm_vcpu_run)

        @ Set up guest memory translation
        ldr     r1, [r0, #VCPU_KVM]
-       ldrd    r2, r3, [r1, #KVM_VTTBR]
+       add     r1, r1, #KVM_VTTBR
+       ldrd    r2, r3, [r1]
        mcrr    p15, 6, r2, r3, c2      @ Write VTTBR

        @ At this point, r0 must contain the pointer to the VCPU
--
1.7.12



_______________________________________________
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