Skip to content

Commit 9b9cce6

Browse files
author
Marc Zyngier
committed
KVM: arm64: nv: Add EL2_REG_VNCR()/EL2_REG_REDIR() sysreg helpers
Add two helpers to deal with EL2 registers are are either redirected to the VNCR page, or that are redirected to their EL1 counterpart. In either cases, no trap is expected. THe relevant register descriptors are repainted accordingly. Reviewed-by: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent 2733dd1 commit 9b9cce6

1 file changed

Lines changed: 47 additions & 18 deletions

File tree

arch/arm64/kvm/sys_regs.c

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,6 +1890,32 @@ static unsigned int el2_visibility(const struct kvm_vcpu *vcpu,
18901890
return REG_HIDDEN;
18911891
}
18921892

1893+
static bool bad_vncr_trap(struct kvm_vcpu *vcpu,
1894+
struct sys_reg_params *p,
1895+
const struct sys_reg_desc *r)
1896+
{
1897+
/*
1898+
* We really shouldn't be here, and this is likely the result
1899+
* of a misconfigured trap, as this register should target the
1900+
* VNCR page, and nothing else.
1901+
*/
1902+
return bad_trap(vcpu, p, r,
1903+
"trap of VNCR-backed register");
1904+
}
1905+
1906+
static bool bad_redir_trap(struct kvm_vcpu *vcpu,
1907+
struct sys_reg_params *p,
1908+
const struct sys_reg_desc *r)
1909+
{
1910+
/*
1911+
* We really shouldn't be here, and this is likely the result
1912+
* of a misconfigured trap, as this register should target the
1913+
* corresponding EL1, and nothing else.
1914+
*/
1915+
return bad_trap(vcpu, p, r,
1916+
"trap of EL2 register redirected to EL1");
1917+
}
1918+
18931919
#define EL2_REG(name, acc, rst, v) { \
18941920
SYS_DESC(SYS_##name), \
18951921
.access = acc, \
@@ -1899,6 +1925,9 @@ static unsigned int el2_visibility(const struct kvm_vcpu *vcpu,
18991925
.val = v, \
19001926
}
19011927

1928+
#define EL2_REG_VNCR(name, rst, v) EL2_REG(name, bad_vncr_trap, rst, v)
1929+
#define EL2_REG_REDIR(name, rst, v) EL2_REG(name, bad_redir_trap, rst, v)
1930+
19021931
/*
19031932
* EL{0,1}2 registers are the EL2 view on an EL0 or EL1 register when
19041933
* HCR_EL2.E2H==1, and only in the sysreg table for convenience of
@@ -2513,32 +2542,32 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25132542
{ PMU_SYS_REG(PMCCFILTR_EL0), .access = access_pmu_evtyper,
25142543
.reset = reset_val, .reg = PMCCFILTR_EL0, .val = 0 },
25152544

2516-
EL2_REG(VPIDR_EL2, access_rw, reset_unknown, 0),
2517-
EL2_REG(VMPIDR_EL2, access_rw, reset_unknown, 0),
2545+
EL2_REG_VNCR(VPIDR_EL2, reset_unknown, 0),
2546+
EL2_REG_VNCR(VMPIDR_EL2, reset_unknown, 0),
25182547
EL2_REG(SCTLR_EL2, access_rw, reset_val, SCTLR_EL2_RES1),
25192548
EL2_REG(ACTLR_EL2, access_rw, reset_val, 0),
2520-
EL2_REG(HCR_EL2, access_rw, reset_val, 0),
2549+
EL2_REG_VNCR(HCR_EL2, reset_val, 0),
25212550
EL2_REG(MDCR_EL2, access_rw, reset_val, 0),
25222551
EL2_REG(CPTR_EL2, access_rw, reset_val, CPTR_NVHE_EL2_RES1),
2523-
EL2_REG(HSTR_EL2, access_rw, reset_val, 0),
2524-
EL2_REG(HFGRTR_EL2, access_rw, reset_val, 0),
2525-
EL2_REG(HFGWTR_EL2, access_rw, reset_val, 0),
2526-
EL2_REG(HFGITR_EL2, access_rw, reset_val, 0),
2527-
EL2_REG(HACR_EL2, access_rw, reset_val, 0),
2552+
EL2_REG_VNCR(HSTR_EL2, reset_val, 0),
2553+
EL2_REG_VNCR(HFGRTR_EL2, reset_val, 0),
2554+
EL2_REG_VNCR(HFGWTR_EL2, reset_val, 0),
2555+
EL2_REG_VNCR(HFGITR_EL2, reset_val, 0),
2556+
EL2_REG_VNCR(HACR_EL2, reset_val, 0),
25282557

2529-
EL2_REG(HCRX_EL2, access_rw, reset_val, 0),
2558+
EL2_REG_VNCR(HCRX_EL2, reset_val, 0),
25302559

25312560
EL2_REG(TTBR0_EL2, access_rw, reset_val, 0),
25322561
EL2_REG(TTBR1_EL2, access_rw, reset_val, 0),
25332562
EL2_REG(TCR_EL2, access_rw, reset_val, TCR_EL2_RES1),
2534-
EL2_REG(VTTBR_EL2, access_rw, reset_val, 0),
2535-
EL2_REG(VTCR_EL2, access_rw, reset_val, 0),
2563+
EL2_REG_VNCR(VTTBR_EL2, reset_val, 0),
2564+
EL2_REG_VNCR(VTCR_EL2, reset_val, 0),
25362565

25372566
{ SYS_DESC(SYS_DACR32_EL2), trap_undef, reset_unknown, DACR32_EL2 },
2538-
EL2_REG(HDFGRTR_EL2, access_rw, reset_val, 0),
2539-
EL2_REG(HDFGWTR_EL2, access_rw, reset_val, 0),
2540-
EL2_REG(SPSR_EL2, access_rw, reset_val, 0),
2541-
EL2_REG(ELR_EL2, access_rw, reset_val, 0),
2567+
EL2_REG_VNCR(HDFGRTR_EL2, reset_val, 0),
2568+
EL2_REG_VNCR(HDFGWTR_EL2, reset_val, 0),
2569+
EL2_REG_REDIR(SPSR_EL2, reset_val, 0),
2570+
EL2_REG_REDIR(ELR_EL2, reset_val, 0),
25422571
{ SYS_DESC(SYS_SP_EL1), access_sp_el1},
25432572

25442573
/* AArch32 SPSR_* are RES0 if trapped from a NV guest */
@@ -2554,10 +2583,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25542583
{ SYS_DESC(SYS_IFSR32_EL2), trap_undef, reset_unknown, IFSR32_EL2 },
25552584
EL2_REG(AFSR0_EL2, access_rw, reset_val, 0),
25562585
EL2_REG(AFSR1_EL2, access_rw, reset_val, 0),
2557-
EL2_REG(ESR_EL2, access_rw, reset_val, 0),
2586+
EL2_REG_REDIR(ESR_EL2, reset_val, 0),
25582587
{ SYS_DESC(SYS_FPEXC32_EL2), trap_undef, reset_val, FPEXC32_EL2, 0x700 },
25592588

2560-
EL2_REG(FAR_EL2, access_rw, reset_val, 0),
2589+
EL2_REG_REDIR(FAR_EL2, reset_val, 0),
25612590
EL2_REG(HPFAR_EL2, access_rw, reset_val, 0),
25622591

25632592
EL2_REG(MAIR_EL2, access_rw, reset_val, 0),
@@ -2570,7 +2599,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25702599
EL2_REG(CONTEXTIDR_EL2, access_rw, reset_val, 0),
25712600
EL2_REG(TPIDR_EL2, access_rw, reset_val, 0),
25722601

2573-
EL2_REG(CNTVOFF_EL2, access_rw, reset_val, 0),
2602+
EL2_REG_VNCR(CNTVOFF_EL2, reset_val, 0),
25742603
EL2_REG(CNTHCTL_EL2, access_rw, reset_val, 0),
25752604

25762605
EL12_REG(CNTKCTL, access_rw, reset_val, 0),

0 commit comments

Comments
 (0)