[PATCH 2/3] KVM: ARM: Clenaup decode hxfar and use decode accessors

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

 



Since the decode functionality is meant to be more generic looking that
pure KVM related, we change the hxfar field to be the fault_addr field.

Also create accessors for the registers and the cpsr like we do in the
main kvm code, which should make things easier if anyone's brave enough
to implement this for arm64.

Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx>
---
 arch/arm/include/asm/kvm_decode.h |   12 +++++++++++-
 arch/arm/kvm/decode.c             |   18 +++++++++---------
 arch/arm/kvm/emulate.c            |    2 +-
 3 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/arch/arm/include/asm/kvm_decode.h b/arch/arm/include/asm/kvm_decode.h
index 6fd1e39..3c37cb9 100644
--- a/arch/arm/include/asm/kvm_decode.h
+++ b/arch/arm/include/asm/kvm_decode.h
@@ -26,7 +26,7 @@ struct kvm_exit_mmio;
 
 struct kvm_decode {
 	struct pt_regs *regs;
-	unsigned long hxfar;
+	unsigned long fault_addr;
 	unsigned long rt;
 	bool sign_extend;
 };
@@ -34,4 +34,14 @@ struct kvm_decode {
 int kvm_decode_load_store(struct kvm_decode *decode, unsigned long instr,
 			  struct kvm_exit_mmio *mmio);
 
+static inline unsigned long *kvm_decode_reg(struct kvm_decode *decode, int reg)
+{
+	return &decode->regs->uregs[reg];
+}
+
+static inline unsigned long *kvm_decode_cpsr(struct kvm_decode *decode)
+{
+	return &decode->regs->ARM_cpsr;
+}
+
 #endif /* __ARM_KVM_DECODE_H__ */
diff --git a/arch/arm/kvm/decode.c b/arch/arm/kvm/decode.c
index 48e6bef..aedddfc 100644
--- a/arch/arm/kvm/decode.c
+++ b/arch/arm/kvm/decode.c
@@ -124,7 +124,7 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio,
 	u8 W = (instr >> 21) & 1;
 	u8 U = (instr >> 23) & 1;
 	u8 P = (instr >> 24) & 1;
-	u32 base_addr = decode->regs->uregs[Rn];
+	u32 base_addr = *kvm_decode_reg(decode, Rn);
 	u32 offset_addr, offset;
 
 	/*
@@ -145,8 +145,8 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio,
 		/* Register operation */
 		enum SRType s_type;
 		u8 shift_n = 0;
-		bool c_bit = decode->regs->ARM_cpsr & PSR_C_BIT;
-		u32 s_reg = decode->regs->uregs[ai->Rm];
+		bool c_bit = *kvm_decode_cpsr(decode) & PSR_C_BIT;
+		u32 s_reg = *kvm_decode_reg(decode, ai->Rm);
 
 		s_type = decode_imm_shift(ai->type, ai->shift_n, &shift_n);
 		offset = shift(s_reg, 5, s_type, shift_n, c_bit);
@@ -160,7 +160,7 @@ static bool decode_arm_wb(struct kvm_decode *decode, struct kvm_exit_mmio *mmio,
 		offset_addr = base_addr + offset;
 	else
 		offset_addr = base_addr - offset;
-	decode->regs->uregs[Rn] = offset_addr;
+	*kvm_decode_reg(decode, Rn) = offset_addr;
 	return true;
 }
 
@@ -305,7 +305,7 @@ static bool decode_thumb_wb(struct kvm_decode *decode,
 	bool P = (instr >> 10) & 1;
 	bool U = (instr >> 9) & 1;
 	u8 imm8 = instr & 0xff;
-	u32 offset_addr = decode->hxfar;
+	u32 offset_addr = decode->fault_addr;
 	u8 Rn = (instr >> 16) & 0xf;
 
 	decode->rt = (instr >> 12) & 0xf;
@@ -315,9 +315,9 @@ static bool decode_thumb_wb(struct kvm_decode *decode,
 
 	/* Handle Writeback */
 	if (!P && U)
-		decode->regs->uregs[Rn] = offset_addr + imm8;
+		*kvm_decode_reg(decode, Rn) = offset_addr + imm8;
 	else if (!P && !U)
-		decode->regs->uregs[Rn] = offset_addr - imm8;
+		*kvm_decode_reg(decode, Rn) = offset_addr - imm8;
 	return true;
 }
 
@@ -441,7 +441,7 @@ static bool kvm_decode_thumb_ls(struct kvm_decode *decode, unsigned long instr,
 
 /**
  * kvm_decode_load_store - decodes load/store instructions
- * @decode: reads regs and hxfar, writes rt and sign_extend
+ * @decode: reads regs and fault_addr, writes rt and sign_extend
  * @instr:  instruction to decode
  * @mmio:   fills in len and is_write
  *
@@ -455,7 +455,7 @@ int kvm_decode_load_store(struct kvm_decode *decode, unsigned long instr,
 {
 	bool is_thumb;
 
-	is_thumb = !!(decode->regs->ARM_cpsr & PSR_T_BIT);
+	is_thumb = !!(*kvm_decode_cpsr(decode) & PSR_T_BIT);
 	if (!is_thumb)
 		return kvm_decode_arm_ls(decode, instr, mmio) ? 0 : 1;
 	else
diff --git a/arch/arm/kvm/emulate.c b/arch/arm/kvm/emulate.c
index fff1199..4e8a127 100644
--- a/arch/arm/kvm/emulate.c
+++ b/arch/arm/kvm/emulate.c
@@ -321,7 +321,7 @@ int kvm_emulate_mmio_ls(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 	current_regs.ARM_lr = *vcpu_reg(vcpu, 14);
 
 	decode->regs = &current_regs;
-	decode->hxfar = vcpu->arch.hxfar;
+	decode->fault_addr = vcpu->arch.hxfar;
 	ret = kvm_decode_load_store(decode, instr, mmio);
 	if (ret) {
 		kvm_debug("Insrn. decode error: %#08lx (cpsr: %#08x"
-- 
1.7.9.5

_______________________________________________
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