Skip to content

Commit 81fbef1

Browse files
committed
KVM: arm64: Wire up SCTLR2_ELx sysreg descriptors
Set up the sysreg descriptors for SCTLR2_ELx, along with the associated storage and VNCR mapping. Reviewed-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 0ead48a commit 81fbef1

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ enum vcpu_sysreg {
523523
/* Anything from this can be RES0/RES1 sanitised */
524524
MARKER(__SANITISED_REG_START__),
525525
TCR2_EL2, /* Extended Translation Control Register (EL2) */
526+
SCTLR2_EL2, /* System Control Register 2 (EL2) */
526527
MDCR_EL2, /* Monitor Debug Configuration Register (EL2) */
527528
CNTHCTL_EL2, /* Counter-timer Hypervisor Control register */
528529

@@ -537,6 +538,7 @@ enum vcpu_sysreg {
537538
VNCR(TTBR1_EL1),/* Translation Table Base Register 1 */
538539
VNCR(TCR_EL1), /* Translation Control Register */
539540
VNCR(TCR2_EL1), /* Extended Translation Control Register */
541+
VNCR(SCTLR2_EL1), /* System Control Register 2 */
540542
VNCR(ESR_EL1), /* Exception Syndrome Register */
541543
VNCR(AFSR0_EL1),/* Auxiliary Fault Status Register 0 */
542544
VNCR(AFSR1_EL1),/* Auxiliary Fault Status Register 1 */
@@ -1204,6 +1206,7 @@ static inline bool __vcpu_read_sys_reg_from_cpu(int reg, u64 *val)
12041206
case IFSR32_EL2: *val = read_sysreg_s(SYS_IFSR32_EL2); break;
12051207
case DBGVCR32_EL2: *val = read_sysreg_s(SYS_DBGVCR32_EL2); break;
12061208
case ZCR_EL1: *val = read_sysreg_s(SYS_ZCR_EL12); break;
1209+
case SCTLR2_EL1: *val = read_sysreg_s(SYS_SCTLR2_EL12); break;
12071210
default: return false;
12081211
}
12091212

@@ -1254,6 +1257,7 @@ static inline bool __vcpu_write_sys_reg_to_cpu(u64 val, int reg)
12541257
case IFSR32_EL2: write_sysreg_s(val, SYS_IFSR32_EL2); break;
12551258
case DBGVCR32_EL2: write_sysreg_s(val, SYS_DBGVCR32_EL2); break;
12561259
case ZCR_EL1: write_sysreg_s(val, SYS_ZCR_EL12); break;
1260+
case SCTLR2_EL1: write_sysreg_s(val, SYS_SCTLR2_EL12); break;
12571261
default: return false;
12581262
}
12591263

@@ -1685,6 +1689,9 @@ void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val);
16851689
#define kvm_has_ras(k) \
16861690
(kvm_has_feat((k), ID_AA64PFR0_EL1, RAS, IMP))
16871691

1692+
#define kvm_has_sctlr2(k) \
1693+
(kvm_has_feat((k), ID_AA64MMFR3_EL1, SCTLRX, IMP))
1694+
16881695
static inline bool kvm_arch_has_irq_bypass(void)
16891696
{
16901697
return true;

arch/arm64/include/asm/vncr_mapping.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#define VNCR_SP_EL1 0x240
5252
#define VNCR_VBAR_EL1 0x250
5353
#define VNCR_TCR2_EL1 0x270
54+
#define VNCR_SCTLR2_EL1 0x278
5455
#define VNCR_PIRE0_EL1 0x290
5556
#define VNCR_PIR_EL1 0x2A0
5657
#define VNCR_POR_EL1 0x2A8

arch/arm64/kvm/sys_regs.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ static bool get_el2_to_el1_mapping(unsigned int reg,
144144
MAPPED_EL2_SYSREG(SPSR_EL2, SPSR_EL1, NULL );
145145
MAPPED_EL2_SYSREG(ZCR_EL2, ZCR_EL1, NULL );
146146
MAPPED_EL2_SYSREG(CONTEXTIDR_EL2, CONTEXTIDR_EL1, NULL );
147+
MAPPED_EL2_SYSREG(SCTLR2_EL2, SCTLR2_EL1, NULL );
147148
default:
148149
return false;
149150
}
@@ -2483,6 +2484,21 @@ static unsigned int vncr_el2_visibility(const struct kvm_vcpu *vcpu,
24832484
return REG_HIDDEN;
24842485
}
24852486

2487+
static unsigned int sctlr2_visibility(const struct kvm_vcpu *vcpu,
2488+
const struct sys_reg_desc *rd)
2489+
{
2490+
if (kvm_has_sctlr2(vcpu->kvm))
2491+
return 0;
2492+
2493+
return REG_HIDDEN;
2494+
}
2495+
2496+
static unsigned int sctlr2_el2_visibility(const struct kvm_vcpu *vcpu,
2497+
const struct sys_reg_desc *rd)
2498+
{
2499+
return __el2_visibility(vcpu, rd, sctlr2_visibility);
2500+
}
2501+
24862502
static bool access_zcr_el2(struct kvm_vcpu *vcpu,
24872503
struct sys_reg_params *p,
24882504
const struct sys_reg_desc *r)
@@ -2955,6 +2971,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
29552971
{ SYS_DESC(SYS_SCTLR_EL1), access_vm_reg, reset_val, SCTLR_EL1, 0x00C50078 },
29562972
{ SYS_DESC(SYS_ACTLR_EL1), access_actlr, reset_actlr, ACTLR_EL1 },
29572973
{ SYS_DESC(SYS_CPACR_EL1), NULL, reset_val, CPACR_EL1, 0 },
2974+
{ SYS_DESC(SYS_SCTLR2_EL1), access_vm_reg, reset_val, SCTLR2_EL1, 0,
2975+
.visibility = sctlr2_visibility },
29582976

29592977
MTE_REG(RGSR_EL1),
29602978
MTE_REG(GCR_EL1),
@@ -3302,6 +3320,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
33023320
EL2_REG_VNCR(VMPIDR_EL2, reset_unknown, 0),
33033321
EL2_REG(SCTLR_EL2, access_rw, reset_val, SCTLR_EL2_RES1),
33043322
EL2_REG(ACTLR_EL2, access_rw, reset_val, 0),
3323+
EL2_REG_FILTERED(SCTLR2_EL2, access_vm_reg, reset_val, 0,
3324+
sctlr2_el2_visibility),
33053325
EL2_REG_VNCR(HCR_EL2, reset_hcr, 0),
33063326
EL2_REG(MDCR_EL2, access_mdcr, reset_mdcr, 0),
33073327
EL2_REG(CPTR_EL2, access_rw, reset_val, CPTR_NVHE_EL2_RES1),

0 commit comments

Comments
 (0)