6 #include <linux/irqchip/arm-gic-v3.h>
8 #include <linux/kvm_host.h>
9 #include <asm/kvm_emulate.h>
16 u32 host_pri_bits, host_id_bits, host_seis, host_a3v, seis, a3v;
17 struct vgic_cpu *vgic_v3_cpu = &vcpu->arch.vgic_cpu;
26 host_pri_bits = FIELD_GET(ICC_CTLR_EL1_PRI_BITS_MASK, val) + 1;
32 host_id_bits = FIELD_GET(ICC_CTLR_EL1_ID_BITS_MASK, val);
39 seis = FIELD_GET(ICC_CTLR_EL1_SEIS_MASK, val);
40 if (host_seis != seis)
44 a3v = FIELD_GET(ICC_CTLR_EL1_A3V_MASK, val);
52 vmcr.
cbpr = FIELD_GET(ICC_CTLR_EL1_CBPR_MASK, val);
53 vmcr.
eoim = FIELD_GET(ICC_CTLR_EL1_EOImode_MASK, val);
62 struct vgic_cpu *vgic_v3_cpu = &vcpu->arch.vgic_cpu;
68 val |= FIELD_PREP(ICC_CTLR_EL1_PRI_BITS_MASK, vgic_v3_cpu->
num_pri_bits - 1);
69 val |= FIELD_PREP(ICC_CTLR_EL1_ID_BITS_MASK, vgic_v3_cpu->
num_id_bits);
70 val |= FIELD_PREP(ICC_CTLR_EL1_SEIS_MASK,
71 FIELD_GET(ICH_VTR_SEIS_MASK,
73 val |= FIELD_PREP(ICC_CTLR_EL1_A3V_MASK,
79 val |= FIELD_PREP(ICC_CTLR_EL1_CBPR_MASK, vmcr.
cbpr);
80 val |= FIELD_PREP(ICC_CTLR_EL1_EOImode_MASK, vmcr.
eoim);
93 vmcr.
pmr = FIELD_GET(ICC_PMR_EL1_MASK, val);
105 *val = FIELD_PREP(ICC_PMR_EL1_MASK, vmcr.
pmr);
116 vmcr.
bpr = FIELD_GET(ICC_BPR0_EL1_MASK, val);
128 *val = FIELD_PREP(ICC_BPR0_EL1_MASK, vmcr.
bpr);
140 vmcr.
abpr = FIELD_GET(ICC_BPR1_EL1_MASK, val);
154 *val = FIELD_PREP(ICC_BPR1_EL1_MASK, vmcr.
abpr);
156 *val = min((vmcr.
bpr + 1), 7U);
168 vmcr.
grpen0 = FIELD_GET(ICC_IGRPEN0_EL1_MASK, val);
180 *val = FIELD_PREP(ICC_IGRPEN0_EL1_MASK, vmcr.
grpen0);
191 vmcr.
grpen1 = FIELD_GET(ICC_IGRPEN1_EL1_MASK, val);
203 *val = FIELD_GET(ICC_IGRPEN1_EL1_MASK, vmcr.
grpen1);
208 static void set_apr_reg(
struct kvm_vcpu *vcpu, u64 val, u8 apr, u8 idx)
284 if (!(val & ICC_SRE_EL1_SRE))
352 struct kvm_device_attr *attr,
355 struct kvm_one_reg reg = {
struct vgic_global kvm_vgic_global_state
int kvm_sys_reg_get_user(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg, const struct sys_reg_desc table[], unsigned int num)
int kvm_sys_reg_set_user(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg, const struct sys_reg_desc table[], unsigned int num)
const struct sys_reg_desc * get_reg_by_id(u64 id, const struct sys_reg_desc table[], unsigned int num)
void vgic_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
void vgic_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
static int get_gic_ctlr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *valp)
static u64 attr_to_id(u64 attr)
static int get_gic_grpen1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static void set_apr_reg(struct kvm_vcpu *vcpu, u64 val, u8 apr, u8 idx)
static int get_gic_ap0r(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static int set_gic_grpen0(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static const struct sys_reg_desc gic_v3_icc_reg_descs[]
static int set_gic_ctlr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int get_gic_bpr0(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static int get_gic_ap1r(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static int get_gic_sre(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static int set_gic_bpr1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int set_gic_bpr0(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int set_gic_sre(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int set_gic_grpen1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int set_gic_pmr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static u64 get_apr_reg(struct kvm_vcpu *vcpu, u8 apr, u8 idx)
static int get_gic_grpen0(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
static int set_gic_ap1r(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int get_gic_bpr1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
int vgic_v3_cpu_sysregs_uaccess(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr, bool is_write)
static int get_gic_pmr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 *val)
int vgic_v3_has_cpu_sysregs_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr)
static int set_gic_ap0r(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 val)
static int vgic_v3_max_apr_idx(struct kvm_vcpu *vcpu)
#define KVM_REG_ARM_VGIC_SYSREG_CRM_MASK
#define KVM_REG_ARM_VGIC_SYSREG_OP1_MASK
#define KVM_REG_ARM_VGIC_SYSREG_OP2_MASK
#define KVM_REG_ARM_VGIC_SYSREG_OP0_MASK
#define KVM_REG_ARM_VGIC_SYSREG_CRN_MASK