Skip to content

Commit 5970e99

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: Add basic support for POR_EL2
S1POE support implies support for POR_EL2, which we provide by - adding it to the vcpu_sysreg enum - advertising it as mapped to its EL1 counterpart in get_el2_to_el1_mapping - wiring it in the sys_reg_desc table with the correct visibility - handling POR_EL1 in __vcpu_{read,write}_sys_reg_from_cpu() Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 26e89dc commit 5970e99

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ enum vcpu_sysreg {
480480
TCR_EL2, /* Translation Control Register (EL2) */
481481
PIRE0_EL2, /* Permission Indirection Register 0 (EL2) */
482482
PIR_EL2, /* Permission Indirection Register 1 (EL2) */
483+
POR_EL2, /* Permission Overlay Register 2 (EL2) */
483484
SPSR_EL2, /* EL2 saved program status register */
484485
ELR_EL2, /* EL2 exception link register */
485486
AFSR0_EL2, /* Auxiliary Fault Status Register 0 (EL2) */
@@ -1050,6 +1051,7 @@ static inline bool __vcpu_read_sys_reg_from_cpu(int reg, u64 *val)
10501051
case TCR2_EL1: *val = read_sysreg_s(SYS_TCR2_EL12); break;
10511052
case PIR_EL1: *val = read_sysreg_s(SYS_PIR_EL12); break;
10521053
case PIRE0_EL1: *val = read_sysreg_s(SYS_PIRE0_EL12); break;
1054+
case POR_EL1: *val = read_sysreg_s(SYS_POR_EL12); break;
10531055
case ESR_EL1: *val = read_sysreg_s(SYS_ESR_EL12); break;
10541056
case AFSR0_EL1: *val = read_sysreg_s(SYS_AFSR0_EL12); break;
10551057
case AFSR1_EL1: *val = read_sysreg_s(SYS_AFSR1_EL12); break;
@@ -1099,6 +1101,7 @@ static inline bool __vcpu_write_sys_reg_to_cpu(u64 val, int reg)
10991101
case TCR2_EL1: write_sysreg_s(val, SYS_TCR2_EL12); break;
11001102
case PIR_EL1: write_sysreg_s(val, SYS_PIR_EL12); break;
11011103
case PIRE0_EL1: write_sysreg_s(val, SYS_PIRE0_EL12); break;
1104+
case POR_EL1: write_sysreg_s(val, SYS_POR_EL12); break;
11021105
case ESR_EL1: write_sysreg_s(val, SYS_ESR_EL12); break;
11031106
case AFSR0_EL1: write_sysreg_s(val, SYS_AFSR0_EL12); break;
11041107
case AFSR1_EL1: write_sysreg_s(val, SYS_AFSR1_EL12); break;

arch/arm64/kvm/sys_regs.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ static bool get_el2_to_el1_mapping(unsigned int reg,
137137
MAPPED_EL2_SYSREG(TCR2_EL2, TCR2_EL1, NULL );
138138
MAPPED_EL2_SYSREG(PIR_EL2, PIR_EL1, NULL );
139139
MAPPED_EL2_SYSREG(PIRE0_EL2, PIRE0_EL1, NULL );
140+
MAPPED_EL2_SYSREG(POR_EL2, POR_EL1, NULL );
140141
MAPPED_EL2_SYSREG(AMAIR_EL2, AMAIR_EL1, NULL );
141142
MAPPED_EL2_SYSREG(ELR_EL2, ELR_EL1, NULL );
142143
MAPPED_EL2_SYSREG(SPSR_EL2, SPSR_EL1, NULL );
@@ -2329,6 +2330,12 @@ static unsigned int s1poe_visibility(const struct kvm_vcpu *vcpu,
23292330
return REG_HIDDEN;
23302331
}
23312332

2333+
static unsigned int s1poe_el2_visibility(const struct kvm_vcpu *vcpu,
2334+
const struct sys_reg_desc *rd)
2335+
{
2336+
return __el2_visibility(vcpu, rd, s1poe_visibility);
2337+
}
2338+
23322339
static unsigned int tcr2_visibility(const struct kvm_vcpu *vcpu,
23332340
const struct sys_reg_desc *rd)
23342341
{
@@ -2942,6 +2949,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
29422949
s1pie_el2_visibility),
29432950
EL2_REG_FILTERED(PIR_EL2, access_rw, reset_val, 0,
29442951
s1pie_el2_visibility),
2952+
EL2_REG_FILTERED(POR_EL2, access_rw, reset_val, 0,
2953+
s1poe_el2_visibility),
29452954
EL2_REG(AMAIR_EL2, access_rw, reset_val, 0),
29462955

29472956
EL2_REG(VBAR_EL2, access_rw, reset_val, 0),

0 commit comments

Comments
 (0)