Commit 56d77aa8 authored by Oliver Upton's avatar Oliver Upton

KVM: arm64: Allow userspace to change ID_AA64ISAR{0-2}_EL1

Almost all of the features described by the ISA registers have no KVM
involvement. Allow userspace to change the value of these registers with
a couple exceptions:

 - MOPS is not writable as KVM does not currently virtualize FEAT_MOPS.

 - The PAuth fields are not writable as KVM requires both address and
   generic authentication be enabled.
Co-developed-by: default avatarJing Zhang <jingzhangos@google.com>
Signed-off-by: default avatarJing Zhang <jingzhangos@google.com>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20231003230408.3405722-7-oliver.upton@linux.devSigned-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 9f9917bc
...@@ -1851,11 +1851,14 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu, ...@@ -1851,11 +1851,14 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu,
* from userspace. * from userspace.
*/ */
/* sys_reg_desc initialiser for known cpufeature ID registers */ #define ID_DESC(name) \
#define ID_SANITISED(name) { \
SYS_DESC(SYS_##name), \ SYS_DESC(SYS_##name), \
.access = access_id_reg, \ .access = access_id_reg, \
.get_user = get_id_reg, \ .get_user = get_id_reg \
/* sys_reg_desc initialiser for known cpufeature ID registers */
#define ID_SANITISED(name) { \
ID_DESC(name), \
.set_user = set_id_reg, \ .set_user = set_id_reg, \
.visibility = id_visibility, \ .visibility = id_visibility, \
.reset = kvm_read_sanitised_id_reg, \ .reset = kvm_read_sanitised_id_reg, \
...@@ -1864,15 +1867,22 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu, ...@@ -1864,15 +1867,22 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu,
/* sys_reg_desc initialiser for known cpufeature ID registers */ /* sys_reg_desc initialiser for known cpufeature ID registers */
#define AA32_ID_SANITISED(name) { \ #define AA32_ID_SANITISED(name) { \
SYS_DESC(SYS_##name), \ ID_DESC(name), \
.access = access_id_reg, \
.get_user = get_id_reg, \
.set_user = set_id_reg, \ .set_user = set_id_reg, \
.visibility = aa32_id_visibility, \ .visibility = aa32_id_visibility, \
.reset = kvm_read_sanitised_id_reg, \ .reset = kvm_read_sanitised_id_reg, \
.val = 0, \ .val = 0, \
} }
/* sys_reg_desc initialiser for writable ID registers */
#define ID_WRITABLE(name, mask) { \
ID_DESC(name), \
.set_user = set_id_reg, \
.visibility = id_visibility, \
.reset = kvm_read_sanitised_id_reg, \
.val = mask, \
}
/* /*
* sys_reg_desc initialiser for architecturally unallocated cpufeature ID * sys_reg_desc initialiser for architecturally unallocated cpufeature ID
* register with encoding Op0=3, Op1=0, CRn=0, CRm=crm, Op2=op2 * register with encoding Op0=3, Op1=0, CRn=0, CRm=crm, Op2=op2
...@@ -1894,9 +1904,7 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu, ...@@ -1894,9 +1904,7 @@ static unsigned int elx2_visibility(const struct kvm_vcpu *vcpu,
* RAZ for the guest. * RAZ for the guest.
*/ */
#define ID_HIDDEN(name) { \ #define ID_HIDDEN(name) { \
SYS_DESC(SYS_##name), \ ID_DESC(name), \
.access = access_id_reg, \
.get_user = get_id_reg, \
.set_user = set_id_reg, \ .set_user = set_id_reg, \
.visibility = raz_visibility, \ .visibility = raz_visibility, \
.reset = kvm_read_sanitised_id_reg, \ .reset = kvm_read_sanitised_id_reg, \
...@@ -2075,9 +2083,15 @@ static const struct sys_reg_desc sys_reg_descs[] = { ...@@ -2075,9 +2083,15 @@ static const struct sys_reg_desc sys_reg_descs[] = {
ID_UNALLOCATED(5,7), ID_UNALLOCATED(5,7),
/* CRm=6 */ /* CRm=6 */
ID_SANITISED(ID_AA64ISAR0_EL1), ID_WRITABLE(ID_AA64ISAR0_EL1, ~ID_AA64ISAR0_EL1_RES0),
ID_SANITISED(ID_AA64ISAR1_EL1), ID_WRITABLE(ID_AA64ISAR1_EL1, ~(ID_AA64ISAR1_EL1_GPI |
ID_SANITISED(ID_AA64ISAR2_EL1), ID_AA64ISAR1_EL1_GPA |
ID_AA64ISAR1_EL1_API |
ID_AA64ISAR1_EL1_APA)),
ID_WRITABLE(ID_AA64ISAR2_EL1, ~(ID_AA64ISAR2_EL1_RES0 |
ID_AA64ISAR2_EL1_MOPS |
ID_AA64ISAR2_EL1_APA3 |
ID_AA64ISAR2_EL1_GPA3)),
ID_UNALLOCATED(6,3), ID_UNALLOCATED(6,3),
ID_UNALLOCATED(6,4), ID_UNALLOCATED(6,4),
ID_UNALLOCATED(6,5), ID_UNALLOCATED(6,5),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment