[PATCH 3/7] ARM: KVM: enforce use of vcpu_pc/vcpu_cpsr

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

 



Instead of directly accessing PC and CPSR in the register structure,
use the defined accessors.

Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
---
 arch/arm/kvm/arm.c     | 8 ++++----
 arch/arm/kvm/coproc.c  | 2 +-
 arch/arm/kvm/coproc.h  | 4 ++--
 arch/arm/kvm/emulate.c | 7 +++----
 arch/arm/kvm/mmu.c     | 6 +++---
 5 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 0606759..79ea0b5 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -471,7 +471,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
 	 * Let it know we don't want that by injecting an undefined exception.
 	 */
 	kvm_debug("hvc: %x (at %08lx)", vcpu->arch.hsr & ((1 << 16) - 1),
-				     vcpu->arch.regs.usr_regs.ARM_pc);
+		  *vcpu_pc(vcpu));
 	kvm_debug("         HSR: %8x", vcpu->arch.hsr);
 	kvm_inject_undefined(vcpu);
 	return 1;
@@ -480,7 +480,7 @@ static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)
 static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run)
 {
 	/* We don't support SMC; don't do that. */
-	kvm_debug("smc: at %08lx", vcpu->arch.regs.usr_regs.ARM_pc);
+	kvm_debug("smc: at %08lx", *vcpu_pc(vcpu));
 	kvm_inject_undefined(vcpu);
 	return 1;
 }
@@ -675,7 +675,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
 		/**************************************************************
 		 * Enter the guest
 		 */
-		trace_kvm_entry(vcpu->arch.regs.usr_regs.ARM_pc);
+		trace_kvm_entry(*vcpu_pc(vcpu));
 		kvm_guest_enter();
 		vcpu->mode = IN_GUEST_MODE;
 
@@ -690,7 +690,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
 		vcpu->mode = OUTSIDE_GUEST_MODE;
 		vcpu->arch.last_pcpu = smp_processor_id();
 		kvm_guest_exit();
-		trace_kvm_exit(vcpu->arch.regs.usr_regs.ARM_pc);
+		trace_kvm_exit(*vcpu_pc(vcpu));
 		/*
 		 * We may have taken a host interrupt in HYP mode (ie
 		 * while executing the guest). This interrupt is still
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c
index 7006c55..ea646ae 100644
--- a/arch/arm/kvm/coproc.c
+++ b/arch/arm/kvm/coproc.c
@@ -295,7 +295,7 @@ static int emulate_cp15(struct kvm_vcpu *vcpu,
 		/* If access function fails, it should complain. */
 	} else {
 		kvm_err("Unsupported guest CP15 access at: %08lx\n",
-			vcpu->arch.regs.usr_regs.ARM_pc);
+			*vcpu_pc(vcpu));
 		print_cp_instr(params);
 	}
 	kvm_inject_undefined(vcpu);
diff --git a/arch/arm/kvm/coproc.h b/arch/arm/kvm/coproc.h
index 0f4bf0b..b7301d3 100644
--- a/arch/arm/kvm/coproc.h
+++ b/arch/arm/kvm/coproc.h
@@ -85,7 +85,7 @@ static inline bool write_to_read_only(struct kvm_vcpu *vcpu,
 				      const struct coproc_params *params)
 {
 	kvm_debug("CP15 write to read-only register at: %08lx\n",
-		  vcpu->arch.regs.usr_regs.ARM_pc);
+		  *vcpu_pc(vcpu));
 	print_cp_instr(params);
 	return false;
 }
@@ -94,7 +94,7 @@ static inline bool read_from_write_only(struct kvm_vcpu *vcpu,
 					const struct coproc_params *params)
 {
 	kvm_debug("CP15 read to write-only register at: %08lx\n",
-		  vcpu->arch.regs.usr_regs.ARM_pc);
+		  *vcpu_pc(vcpu));
 	print_cp_instr(params);
 	return false;
 }
diff --git a/arch/arm/kvm/emulate.c b/arch/arm/kvm/emulate.c
index 995c59f..5c80265 100644
--- a/arch/arm/kvm/emulate.c
+++ b/arch/arm/kvm/emulate.c
@@ -171,7 +171,7 @@ u32 *vcpu_spsr(struct kvm_vcpu *vcpu)
  */
 int kvm_handle_wfi(struct kvm_vcpu *vcpu, struct kvm_run *run)
 {
-	trace_kvm_wfi(vcpu->arch.regs.usr_regs.ARM_pc);
+	trace_kvm_wfi(*vcpu_pc(vcpu));
 	kvm_vcpu_block(vcpu);
 	return 1;
 }
@@ -332,8 +332,7 @@ static unsigned long ls_word_calc_offset(struct kvm_vcpu *vcpu,
 			break;
 		case SCALE_SHIFT_ROR_RRX:
 			if (shift_imm == 0) {
-				u32 C = (vcpu->arch.regs.usr_regs.ARM_cpsr &
-						(1U << PSR_BIT_C));
+				u32 C = (*vcpu_cpsr(vcpu) & (1U << PSR_BIT_C));
 				offset = (C << 31) | offset >> 1;
 			} else {
 				/* Ensure arithmetic shift */
@@ -594,7 +593,7 @@ int kvm_emulate_mmio_ls(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
 {
 	bool is_thumb;
 
-	trace_kvm_mmio_emulate(vcpu->arch.regs.usr_regs.ARM_pc, instr, vcpu->arch.regs.usr_regs.ARM_cpsr);
+	trace_kvm_mmio_emulate(*vcpu_pc(vcpu), instr, *vcpu_cpsr(vcpu));
 
 	mmio->phys_addr = fault_ipa;
 	is_thumb = !!(*vcpu_cpsr(vcpu) & PSR_T_BIT);
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index e5226e6..d41b60d 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -703,10 +703,10 @@ static bool copy_current_insn(struct kvm_vcpu *vcpu, unsigned long *instr)
 	is_thumb = !!(*vcpu_cpsr(vcpu) & PSR_T_BIT);
 	instr_len = (is_thumb) ? 2 : 4;
 
-	BUG_ON(!is_thumb && vcpu->arch.regs.usr_regs.ARM_pc & 0x3);
+	BUG_ON(!is_thumb && *vcpu_pc(vcpu) & 0x3);
 
 	/* Now guest isn't running, we can va->pa map and copy atomically. */
-	ret = copy_from_guest_va(vcpu, instr, vcpu->arch.regs.usr_regs.ARM_pc, instr_len,
+	ret = copy_from_guest_va(vcpu, instr, *vcpu_pc(vcpu), instr_len,
 				 vcpu_mode_priv(vcpu));
 	if (!ret)
 		goto out;
@@ -714,7 +714,7 @@ static bool copy_current_insn(struct kvm_vcpu *vcpu, unsigned long *instr)
 	/* A 32-bit thumb2 instruction can actually go over a page boundary! */
 	if (is_thumb && is_wide_instruction(*instr)) {
 		*instr = *instr << 16;
-		ret = copy_from_guest_va(vcpu, instr, vcpu->arch.regs.usr_regs.ARM_pc + 2, 2,
+		ret = copy_from_guest_va(vcpu, instr, *vcpu_pc(vcpu) + 2, 2,
 					 vcpu_mode_priv(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