diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2016-01-03 06:26:01 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-02-29 13:34:12 -0500 |
commit | c2a8dab507ca6f8990c12372052efc830f51dd3f (patch) | |
tree | 572950287f254ee8b8348b0e08cd18d1ec94459a | |
parent | fb32a52a1d4487f3ac5b7ccb659d0beb11ec504f (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.h | 8 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_host.h | 3 | ||||
-rw-r--r-- | arch/arm/kernel/asm-offsets.c | 18 | ||||
-rw-r--r-- | arch/arm/kvm/emulate.c | 12 | ||||
-rw-r--r-- | arch/arm/kvm/guest.c | 4 | ||||
-rw-r--r-- | arch/arm/kvm/interrupts_head.S | 11 | ||||
-rw-r--r-- | arch/arm/kvm/reset.c | 2 |
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 | ||
69 | static inline unsigned long *vcpu_pc(struct kvm_vcpu *vcpu) | 69 | static 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 | ||
74 | static inline unsigned long *vcpu_cpsr(struct kvm_vcpu *vcpu) | 74 | static 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 | ||
79 | static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu) | 79 | static 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 | ||
84 | static inline bool mode_has_spsr(struct kvm_vcpu *vcpu) | 84 | static 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 | ||
90 | static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu) | 90 | static 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 | ||
91 | struct kvm_cpu_context { | 91 | struct 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; | |||
98 | struct kvm_vcpu_arch { | 99 | struct 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 | */ |
113 | unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num) | 113 | unsigned 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) | |||
55 | static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) | 55 | static 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) | |||
72 | static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) | 72 | static 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); |