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
?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