Commit 1eb07f4b authored by Marc Zyngier's avatar Marc Zyngier

Merge branch kvm-arm64/raz-sysregs into kvmarm-master/next

* kvm-arm64/raz-sysregs:
  : .
  : Simplify the handling of RAZ register, removing pointless indirections.
  : .
  KVM: arm64: Replace get_raz_id_reg() with get_raz_reg()
  KVM: arm64: Use get_raz_reg() for userspace reads of PMSWINC_EL0
  KVM: arm64: Return early from read_id_reg() if register is RAZ
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parents a049cf7e ebf6aa8c
...@@ -1064,7 +1064,12 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu, ...@@ -1064,7 +1064,12 @@ static u64 read_id_reg(const struct kvm_vcpu *vcpu,
struct sys_reg_desc const *r, bool raz) struct sys_reg_desc const *r, bool raz)
{ {
u32 id = reg_to_encoding(r); u32 id = reg_to_encoding(r);
u64 val = raz ? 0 : read_sanitised_ftr_reg(id); u64 val;
if (raz)
return 0;
val = read_sanitised_ftr_reg(id);
switch (id) { switch (id) {
case SYS_ID_AA64PFR0_EL1: case SYS_ID_AA64PFR0_EL1:
...@@ -1268,16 +1273,19 @@ static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd, ...@@ -1268,16 +1273,19 @@ static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
return __set_id_reg(vcpu, rd, uaddr, raz); return __set_id_reg(vcpu, rd, uaddr, raz);
} }
static int get_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd, static int set_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
const struct kvm_one_reg *reg, void __user *uaddr) const struct kvm_one_reg *reg, void __user *uaddr)
{ {
return __get_id_reg(vcpu, rd, uaddr, true); return __set_id_reg(vcpu, rd, uaddr, true);
} }
static int set_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd, static int get_raz_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
const struct kvm_one_reg *reg, void __user *uaddr) const struct kvm_one_reg *reg, void __user *uaddr)
{ {
return __set_id_reg(vcpu, rd, uaddr, true); const u64 id = sys_reg_to_index(rd);
const u64 val = 0;
return reg_to_user(uaddr, &val, id);
} }
static int set_wi_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd, static int set_wi_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
...@@ -1388,7 +1396,7 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu, ...@@ -1388,7 +1396,7 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu,
#define ID_UNALLOCATED(crm, op2) { \ #define ID_UNALLOCATED(crm, op2) { \
Op0(3), Op1(0), CRn(0), CRm(crm), Op2(op2), \ Op0(3), Op1(0), CRn(0), CRm(crm), Op2(op2), \
.access = access_raz_id_reg, \ .access = access_raz_id_reg, \
.get_user = get_raz_id_reg, \ .get_user = get_raz_reg, \
.set_user = set_raz_id_reg, \ .set_user = set_raz_id_reg, \
} }
...@@ -1400,7 +1408,7 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu, ...@@ -1400,7 +1408,7 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu,
#define ID_HIDDEN(name) { \ #define ID_HIDDEN(name) { \
SYS_DESC(SYS_##name), \ SYS_DESC(SYS_##name), \
.access = access_raz_id_reg, \ .access = access_raz_id_reg, \
.get_user = get_raz_id_reg, \ .get_user = get_raz_reg, \
.set_user = set_raz_id_reg, \ .set_user = set_raz_id_reg, \
} }
...@@ -1642,7 +1650,7 @@ static const struct sys_reg_desc sys_reg_descs[] = { ...@@ -1642,7 +1650,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
* previously (and pointlessly) advertised in the past... * previously (and pointlessly) advertised in the past...
*/ */
{ PMU_SYS_REG(SYS_PMSWINC_EL0), { PMU_SYS_REG(SYS_PMSWINC_EL0),
.get_user = get_raz_id_reg, .set_user = set_wi_reg, .get_user = get_raz_reg, .set_user = set_wi_reg,
.access = access_pmswinc, .reset = NULL }, .access = access_pmswinc, .reset = NULL },
{ PMU_SYS_REG(SYS_PMSELR_EL0), { PMU_SYS_REG(SYS_PMSELR_EL0),
.access = access_pmselr, .reset = reset_pmselr, .reg = PMSELR_EL0 }, .access = access_pmselr, .reset = reset_pmselr, .reg = PMSELR_EL0 },
......
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