[PATCH] KVM: ARM: move struct pt_regs back to usr regs

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

 



This partially reverts commit f7c6882646ebd12ee0daab1055cd38c23f47c610:
ARM: KVM: move usr regs to struct pt_regs

The kvm_regs struct is part of the user space ABI to provide an index
for which registers are get/set using the corresponding ioctl's and
should really be explicitly typed in line with the remaining KVM code.

If we want to move away from that we should provide fixed indices for
the registers, but I've never been a fan of hiding the pc and cpsr under
the usr_regs field in the first place.

This (once again) breaks compatibility with QEMU, and I will update the
kvm-arm branch on git://github.com/virtualopensystems/qemu.git
accordingly.

Signed-off-by: Christoffer Dall <c.dall@xxxxxxxxxxxxxxxxxxxxxx>
---
 arch/arm/include/asm/kvm.h         |    5 +++--
 arch/arm/include/asm/kvm_emulate.h |    8 ++++----
 arch/arm/kernel/asm-offsets.c      |    4 ++--
 arch/arm/kvm/emulate.c             |    4 +++-
 arch/arm/kvm/guest.c               |    2 +-
 arch/arm/kvm/reset.c               |    2 +-
 6 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/arch/arm/include/asm/kvm.h b/arch/arm/include/asm/kvm.h
index 5142cab..fb41608 100644
--- a/arch/arm/include/asm/kvm.h
+++ b/arch/arm/include/asm/kvm.h
@@ -20,7 +20,6 @@
 #define __ARM_KVM_H__
 
 #include <asm/types.h>
-#include <asm/ptrace.h>
 
 #define __KVM_HAVE_GUEST_DEBUG
 #define __KVM_HAVE_IRQ_LINE
@@ -29,12 +28,14 @@
 	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT))
 
 struct kvm_regs {
-	struct pt_regs usr_regs;/* R0_usr - R14_usr, PC, CPSR */
+	__u32 usr_regs[15];	/* R0_usr - R14_usr */
 	__u32 svc_regs[3];	/* SP_svc, LR_svc, SPSR_svc */
 	__u32 abt_regs[3];	/* SP_abt, LR_abt, SPSR_abt */
 	__u32 und_regs[3];	/* SP_und, LR_und, SPSR_und */
 	__u32 irq_regs[3];	/* SP_irq, LR_irq, SPSR_irq */
 	__u32 fiq_regs[8];	/* R8_fiq - R14_fiq, SPSR_fiq */
+	__u32 pc;		/* The program counter (r15) */
+	__u32 cpsr;		/* The guest CPSR */
 };
 
 /* Supported Processor Types */
diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h
index 4bf537b..6da348c 100644
--- a/arch/arm/include/asm/kvm_emulate.h
+++ b/arch/arm/include/asm/kvm_emulate.h
@@ -56,23 +56,23 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr);
 
 static inline u32 *vcpu_pc(struct kvm_vcpu *vcpu)
 {
-	return (u32 *)&vcpu->arch.regs.usr_regs.ARM_pc;
+	return &vcpu->arch.regs.pc;
 }
 
 static inline u32 *vcpu_cpsr(struct kvm_vcpu *vcpu)
 {
-	return (u32 *)&vcpu->arch.regs.usr_regs.ARM_cpsr;
+	return &vcpu->arch.regs.cpsr;
 }
 
 static inline bool mode_has_spsr(struct kvm_vcpu *vcpu)
 {
-	unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK;
+	unsigned long cpsr_mode = vcpu->arch.regs.cpsr & MODE_MASK;
 	return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE);
 }
 
 static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu)
 {
-	unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK;
+	unsigned long cpsr_mode = vcpu->arch.regs.cpsr & MODE_MASK;
 	return cpsr_mode > USR_MODE;;
 }
 
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index cc5e6af..ca1d737 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -158,8 +158,8 @@ int main(void)
   DEFINE(VCPU_UND_REGS,		offsetof(struct kvm_vcpu, arch.regs.und_regs));
   DEFINE(VCPU_IRQ_REGS,		offsetof(struct kvm_vcpu, arch.regs.irq_regs));
   DEFINE(VCPU_FIQ_REGS,		offsetof(struct kvm_vcpu, arch.regs.fiq_regs));
-  DEFINE(VCPU_PC,		offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_pc));
-  DEFINE(VCPU_CPSR,		offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_cpsr));
+  DEFINE(VCPU_PC,		offsetof(struct kvm_vcpu, arch.regs.pc));
+  DEFINE(VCPU_CPSR,		offsetof(struct kvm_vcpu, arch.regs.cpsr));
   DEFINE(VCPU_IRQ_LINES,	offsetof(struct kvm_vcpu, arch.irq_lines));
   DEFINE(VCPU_HSR,		offsetof(struct kvm_vcpu, arch.hsr));
   DEFINE(VCPU_HxFAR,		offsetof(struct kvm_vcpu, arch.hxfar));
diff --git a/arch/arm/kvm/emulate.c b/arch/arm/kvm/emulate.c
index 33d83dc..3bc8980 100644
--- a/arch/arm/kvm/emulate.c
+++ b/arch/arm/kvm/emulate.c
@@ -28,7 +28,7 @@
 #define REG_OFFSET(_reg) \
 	(offsetof(struct kvm_regs, _reg) / sizeof(u32))
 
-#define USR_REG_OFFSET(_num) REG_OFFSET(usr_regs.uregs[_num])
+#define USR_REG_OFFSET(_num) REG_OFFSET(usr_regs[_num])
 
 static const unsigned long vcpu_reg_offsets[VCPU_NR_MODES][15] = {
 	/* USR/SYS Registers */
@@ -108,6 +108,8 @@ u32 *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num)
 	u32 *reg_array = (u32 *)&vcpu->arch.regs;
 	u32 mode = *vcpu_cpsr(vcpu) & MODE_MASK;
 
+	BUG_ON(reg_num >= 15);
+
 	switch (mode) {
 	case USR_MODE...SVC_MODE:
 		mode &= ~MODE32_BIT; /* 0 ... 3 */
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c
index 65ae563..de05c557c 100644
--- a/arch/arm/kvm/guest.c
+++ b/arch/arm/kvm/guest.c
@@ -79,7 +79,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
 	if (get_user(val, uaddr) != 0)
 		return -EFAULT;
 
-	if (off == KVM_REG_ARM_CORE_REG(usr_regs.ARM_cpsr)) {
+	if (off == KVM_REG_ARM_CORE_REG(cpsr)) {
 		unsigned long mode = val & MODE_MASK;
 		switch (mode) {
 		case USR_MODE:
diff --git a/arch/arm/kvm/reset.c b/arch/arm/kvm/reset.c
index 67ca4a3..bb17def 100644
--- a/arch/arm/kvm/reset.c
+++ b/arch/arm/kvm/reset.c
@@ -34,7 +34,7 @@
 static const int a15_max_cpu_idx = 3;
 
 static struct kvm_regs a15_regs_reset = {
-	.usr_regs.ARM_cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT,
+	.cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT,
 };
 
 #ifdef CONFIG_KVM_ARM_TIMER
-- 
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