aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2016-01-03 06:26:01 -0500
committerMarc Zyngier <marc.zyngier@arm.com>2016-02-29 13:34:12 -0500
commitc2a8dab507ca6f8990c12372052efc830f51dd3f (patch)
tree572950287f254ee8b8348b0e08cd18d1ec94459a
parentfb32a52a1d4487f3ac5b7ccb659d0beb11ec504f (diff)
ARM: KVM: Move GP registers into the CPU context structure
Continuing our rework of the CPU context, we now move the GP registers into the CPU context structure. Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r--arch/arm/include/asm/kvm_emulate.h8
-rw-r--r--arch/arm/include/asm/kvm_host.h3
-rw-r--r--arch/arm/kernel/asm-offsets.c18
-rw-r--r--arch/arm/kvm/emulate.c12
-rw-r--r--arch/arm/kvm/guest.c4
-rw-r--r--arch/arm/kvm/interrupts_head.S11
-rw-r--r--arch/arm/kvm/reset.c2
7 files changed, 34 insertions, 24 deletions
diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h
index 32bb52a489d0..f710616ccadc 100644
--- a/arch/arm/include/asm/kvm_emulate.h
+++ b/arch/arm/include/asm/kvm_emulate.h
@@ -68,12 +68,12 @@ static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu)
68 68
69static inline unsigned long *vcpu_pc(struct kvm_vcpu *vcpu) 69static inline unsigned long *vcpu_pc(struct kvm_vcpu *vcpu)
70{ 70{
71 return &vcpu->arch.regs.usr_regs.ARM_pc; 71 return &vcpu->arch.ctxt.gp_regs.usr_regs.ARM_pc;
72} 72}
73 73
74static inline unsigned long *vcpu_cpsr(struct kvm_vcpu *vcpu) 74static inline unsigned long *vcpu_cpsr(struct kvm_vcpu *vcpu)
75{ 75{
76 return &vcpu->arch.regs.usr_regs.ARM_cpsr; 76 return &vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr;
77} 77}
78 78
79static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu) 79static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu)
@@ -83,13 +83,13 @@ static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu)
83 83
84static inline bool mode_has_spsr(struct kvm_vcpu *vcpu) 84static inline bool mode_has_spsr(struct kvm_vcpu *vcpu)
85{ 85{
86 unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK; 86 unsigned long cpsr_mode = vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr & MODE_MASK;
87 return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE); 87 return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE);
88} 88}
89 89
90static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu) 90static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu)
91{ 91{
92 unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK; 92 unsigned long cpsr_mode = vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr & MODE_MASK;
93 return cpsr_mode > USR_MODE;; 93 return cpsr_mode > USR_MODE;;
94} 94}
95 95
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 4203701cc7f4..02932ba8a653 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -89,6 +89,7 @@ struct kvm_vcpu_fault_info {
89}; 89};
90 90
91struct kvm_cpu_context { 91struct kvm_cpu_context {
92 struct kvm_regs gp_regs;
92 struct vfp_hard_struct vfp; 93 struct vfp_hard_struct vfp;
93 u32 cp15[NR_CP15_REGS]; 94 u32 cp15[NR_CP15_REGS];
94}; 95};
@@ -98,8 +99,6 @@ typedef struct kvm_cpu_context kvm_cpu_context_t;
98struct kvm_vcpu_arch { 99struct kvm_vcpu_arch {
99 struct kvm_cpu_context ctxt; 100 struct kvm_cpu_context ctxt;
100 101
101 struct kvm_regs regs;
102
103 int target; /* Processor target */ 102 int target; /* Processor target */
104 DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES); 103 DECLARE_BITMAP(features, KVM_VCPU_MAX_FEATURES);
105 104
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index 43f8b01072c1..2f3e0b064066 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -176,15 +176,15 @@ int main(void)
176 DEFINE(VCPU_HOST_CTXT, offsetof(struct kvm_vcpu, arch.host_cpu_context)); 176 DEFINE(VCPU_HOST_CTXT, offsetof(struct kvm_vcpu, arch.host_cpu_context));
177 DEFINE(CPU_CTXT_VFP, offsetof(struct kvm_cpu_context, vfp)); 177 DEFINE(CPU_CTXT_VFP, offsetof(struct kvm_cpu_context, vfp));
178 DEFINE(CPU_CTXT_CP15, offsetof(struct kvm_cpu_context, cp15)); 178 DEFINE(CPU_CTXT_CP15, offsetof(struct kvm_cpu_context, cp15));
179 DEFINE(VCPU_REGS, offsetof(struct kvm_vcpu, arch.regs)); 179 DEFINE(CPU_CTXT_GP_REGS, offsetof(struct kvm_cpu_context, gp_regs));
180 DEFINE(VCPU_USR_REGS, offsetof(struct kvm_vcpu, arch.regs.usr_regs)); 180 DEFINE(GP_REGS_USR, offsetof(struct kvm_regs, usr_regs));
181 DEFINE(VCPU_SVC_REGS, offsetof(struct kvm_vcpu, arch.regs.svc_regs)); 181 DEFINE(GP_REGS_SVC, offsetof(struct kvm_regs, svc_regs));
182 DEFINE(VCPU_ABT_REGS, offsetof(struct kvm_vcpu, arch.regs.abt_regs)); 182 DEFINE(GP_REGS_ABT, offsetof(struct kvm_regs, abt_regs));
183 DEFINE(VCPU_UND_REGS, offsetof(struct kvm_vcpu, arch.regs.und_regs)); 183 DEFINE(GP_REGS_UND, offsetof(struct kvm_regs, und_regs));
184 DEFINE(VCPU_IRQ_REGS, offsetof(struct kvm_vcpu, arch.regs.irq_regs)); 184 DEFINE(GP_REGS_IRQ, offsetof(struct kvm_regs, irq_regs));
185 DEFINE(VCPU_FIQ_REGS, offsetof(struct kvm_vcpu, arch.regs.fiq_regs)); 185 DEFINE(GP_REGS_FIQ, offsetof(struct kvm_regs, fiq_regs));
186 DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_pc)); 186 DEFINE(GP_REGS_PC, offsetof(struct kvm_regs, usr_regs.ARM_pc));
187 DEFINE(VCPU_CPSR, offsetof(struct kvm_vcpu, arch.regs.usr_regs.ARM_cpsr)); 187 DEFINE(GP_REGS_CPSR, offsetof(struct kvm_regs, usr_regs.ARM_cpsr));
188 DEFINE(VCPU_HCR, offsetof(struct kvm_vcpu, arch.hcr)); 188 DEFINE(VCPU_HCR, offsetof(struct kvm_vcpu, arch.hcr));
189 DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines)); 189 DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines));
190 DEFINE(VCPU_HSR, offsetof(struct kvm_vcpu, arch.fault.hsr)); 190 DEFINE(VCPU_HSR, offsetof(struct kvm_vcpu, arch.fault.hsr));
diff --git a/arch/arm/kvm/emulate.c b/arch/arm/kvm/emulate.c
index ee161b1c66da..a494def3f195 100644
--- a/arch/arm/kvm/emulate.c
+++ b/arch/arm/kvm/emulate.c
@@ -112,7 +112,7 @@ static const unsigned long vcpu_reg_offsets[VCPU_NR_MODES][15] = {
112 */ 112 */
113unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num) 113unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num)
114{ 114{
115 unsigned long *reg_array = (unsigned long *)&vcpu->arch.regs; 115 unsigned long *reg_array = (unsigned long *)&vcpu->arch.ctxt.gp_regs;
116 unsigned long mode = *vcpu_cpsr(vcpu) & MODE_MASK; 116 unsigned long mode = *vcpu_cpsr(vcpu) & MODE_MASK;
117 117
118 switch (mode) { 118 switch (mode) {
@@ -147,15 +147,15 @@ unsigned long *vcpu_spsr(struct kvm_vcpu *vcpu)
147 unsigned long mode = *vcpu_cpsr(vcpu) & MODE_MASK; 147 unsigned long mode = *vcpu_cpsr(vcpu) & MODE_MASK;
148 switch (mode) { 148 switch (mode) {
149 case SVC_MODE: 149 case SVC_MODE:
150 return &vcpu->arch.regs.KVM_ARM_SVC_spsr; 150 return &vcpu->arch.ctxt.gp_regs.KVM_ARM_SVC_spsr;
151 case ABT_MODE: 151 case ABT_MODE:
152 return &vcpu->arch.regs.KVM_ARM_ABT_spsr; 152 return &vcpu->arch.ctxt.gp_regs.KVM_ARM_ABT_spsr;
153 case UND_MODE: 153 case UND_MODE:
154 return &vcpu->arch.regs.KVM_ARM_UND_spsr; 154 return &vcpu->arch.ctxt.gp_regs.KVM_ARM_UND_spsr;
155 case IRQ_MODE: 155 case IRQ_MODE:
156 return &vcpu->arch.regs.KVM_ARM_IRQ_spsr; 156 return &vcpu->arch.ctxt.gp_regs.KVM_ARM_IRQ_spsr;
157 case FIQ_MODE: 157 case FIQ_MODE:
158 return &vcpu->arch.regs.KVM_ARM_FIQ_spsr; 158 return &vcpu->arch.ctxt.gp_regs.KVM_ARM_FIQ_spsr;
159 default: 159 default:
160 BUG(); 160 BUG();
161 } 161 }
diff --git a/arch/arm/kvm/guest.c b/arch/arm/kvm/guest.c
index 5fa69d7bae58..86e26fbd5ba3 100644
--- a/arch/arm/kvm/guest.c
+++ b/arch/arm/kvm/guest.c
@@ -55,7 +55,7 @@ static u64 core_reg_offset_from_id(u64 id)
55static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 55static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
56{ 56{
57 u32 __user *uaddr = (u32 __user *)(long)reg->addr; 57 u32 __user *uaddr = (u32 __user *)(long)reg->addr;
58 struct kvm_regs *regs = &vcpu->arch.regs; 58 struct kvm_regs *regs = &vcpu->arch.ctxt.gp_regs;
59 u64 off; 59 u64 off;
60 60
61 if (KVM_REG_SIZE(reg->id) != 4) 61 if (KVM_REG_SIZE(reg->id) != 4)
@@ -72,7 +72,7 @@ static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
72static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) 72static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
73{ 73{
74 u32 __user *uaddr = (u32 __user *)(long)reg->addr; 74 u32 __user *uaddr = (u32 __user *)(long)reg->addr;
75 struct kvm_regs *regs = &vcpu->arch.regs; 75 struct kvm_regs *regs = &vcpu->arch.ctxt.gp_regs;
76 u64 off, val; 76 u64 off, val;
77 77
78 if (KVM_REG_SIZE(reg->id) != 4) 78 if (KVM_REG_SIZE(reg->id) != 4)
diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S
index b9d953158877..e0943cb80ab3 100644
--- a/arch/arm/kvm/interrupts_head.S
+++ b/arch/arm/kvm/interrupts_head.S
@@ -1,6 +1,17 @@
1#include <linux/irqchip/arm-gic.h> 1#include <linux/irqchip/arm-gic.h>
2#include <asm/assembler.h> 2#include <asm/assembler.h>
3 3
4/* Compat macro, until we get rid of this file entierely */
5#define VCPU_GP_REGS (VCPU_GUEST_CTXT + CPU_CTXT_GP_REGS)
6#define VCPU_USR_REGS (VCPU_GP_REGS + GP_REGS_USR)
7#define VCPU_SVC_REGS (VCPU_GP_REGS + GP_REGS_SVC)
8#define VCPU_ABT_REGS (VCPU_GP_REGS + GP_REGS_ABT)
9#define VCPU_UND_REGS (VCPU_GP_REGS + GP_REGS_UND)
10#define VCPU_IRQ_REGS (VCPU_GP_REGS + GP_REGS_IRQ)
11#define VCPU_FIQ_REGS (VCPU_GP_REGS + GP_REGS_FIQ)
12#define VCPU_PC (VCPU_GP_REGS + GP_REGS_PC)
13#define VCPU_CPSR (VCPU_GP_REGS + GP_REGS_CPSR)
14
4#define VCPU_USR_REG(_reg_nr) (VCPU_USR_REGS + (_reg_nr * 4)) 15#define VCPU_USR_REG(_reg_nr) (VCPU_USR_REGS + (_reg_nr * 4))
5#define VCPU_USR_SP (VCPU_USR_REG(13)) 16#define VCPU_USR_SP (VCPU_USR_REG(13))
6#define VCPU_USR_LR (VCPU_USR_REG(14)) 17#define VCPU_USR_LR (VCPU_USR_REG(14))
diff --git a/arch/arm/kvm/reset.c b/arch/arm/kvm/reset.c
index eeb85858d6bb..0048b5a62a50 100644
--- a/arch/arm/kvm/reset.c
+++ b/arch/arm/kvm/reset.c
@@ -71,7 +71,7 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
71 } 71 }
72 72
73 /* Reset core registers */ 73 /* Reset core registers */
74 memcpy(&vcpu->arch.regs, reset_regs, sizeof(vcpu->arch.regs)); 74 memcpy(&vcpu->arch.ctxt.gp_regs, reset_regs, sizeof(vcpu->arch.ctxt.gp_regs));
75 75
76 /* Reset CP15 registers */ 76 /* Reset CP15 registers */
77 kvm_reset_coprocs(vcpu); 77 kvm_reset_coprocs(vcpu);