|
@@ -434,7 +434,23 @@ static unsigned long vgic_mmio_read_its_iidr(struct kvm *kvm,
|
|
|
struct vgic_its *its,
|
|
|
gpa_t addr, unsigned int len)
|
|
|
{
|
|
|
- return (PRODUCT_ID_KVM << 24) | (IMPLEMENTER_ARM << 0);
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ val = (its->abi_rev << GITS_IIDR_REV_SHIFT) & GITS_IIDR_REV_MASK;
|
|
|
+ val |= (PRODUCT_ID_KVM << GITS_IIDR_PRODUCTID_SHIFT) | IMPLEMENTER_ARM;
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+static int vgic_mmio_uaccess_write_its_iidr(struct kvm *kvm,
|
|
|
+ struct vgic_its *its,
|
|
|
+ gpa_t addr, unsigned int len,
|
|
|
+ unsigned long val)
|
|
|
+{
|
|
|
+ u32 rev = GITS_IIDR_REV(val);
|
|
|
+
|
|
|
+ if (rev >= NR_ITS_ABIS)
|
|
|
+ return -EINVAL;
|
|
|
+ return vgic_its_set_abi(its, rev);
|
|
|
}
|
|
|
|
|
|
static unsigned long vgic_mmio_read_its_idregs(struct kvm *kvm,
|
|
@@ -1415,8 +1431,9 @@ static struct vgic_register_region its_registers[] = {
|
|
|
REGISTER_ITS_DESC(GITS_CTLR,
|
|
|
vgic_mmio_read_its_ctlr, vgic_mmio_write_its_ctlr, 4,
|
|
|
VGIC_ACCESS_32bit),
|
|
|
- REGISTER_ITS_DESC(GITS_IIDR,
|
|
|
- vgic_mmio_read_its_iidr, its_mmio_write_wi, 4,
|
|
|
+ REGISTER_ITS_DESC_UACCESS(GITS_IIDR,
|
|
|
+ vgic_mmio_read_its_iidr, its_mmio_write_wi,
|
|
|
+ vgic_mmio_uaccess_write_its_iidr, 4,
|
|
|
VGIC_ACCESS_32bit),
|
|
|
REGISTER_ITS_DESC(GITS_TYPER,
|
|
|
vgic_mmio_read_its_typer, its_mmio_write_wi, 8,
|