static int update_lpi_config(struct kvm *kvm, struct vgic_irq *irq,
                             struct kvm_vcpu *filter_vcpu, bool needs_inv);
 
+#define vgic_its_read_entry_lock(i, g, valp, t)                                \
+       ({                                                              \
+               int __sz = vgic_its_get_abi(i)->t##_esz;                \
+               struct kvm *__k = (i)->dev->kvm;                        \
+               int __ret;                                              \
+                                                                       \
+               BUILD_BUG_ON(NR_ITS_ABIS == 1 &&                        \
+                            sizeof(*(valp)) != ABI_0_ESZ);             \
+               if (NR_ITS_ABIS > 1 &&                                  \
+                   KVM_BUG_ON(__sz != sizeof(*(valp)), __k))           \
+                       __ret = -EINVAL;                                \
+               else                                                    \
+                       __ret = kvm_read_guest_lock(__k, (g),           \
+                                                   valp, __sz);        \
+               __ret;                                                  \
+       })
+
+#define vgic_its_write_entry_lock(i, g, val, t)                                \
+       ({                                                              \
+               int __sz = vgic_its_get_abi(i)->t##_esz;                \
+               struct kvm *__k = (i)->dev->kvm;                        \
+               typeof(val) __v = (val);                                \
+               int __ret;                                              \
+                                                                       \
+               BUILD_BUG_ON(NR_ITS_ABIS == 1 &&                        \
+                            sizeof(__v) != ABI_0_ESZ);                 \
+               if (NR_ITS_ABIS > 1 &&                                  \
+                   KVM_BUG_ON(__sz != sizeof(__v), __k))               \
+                       __ret = -EINVAL;                                \
+               else                                                    \
+                       __ret = vgic_write_guest_lock(__k, (g),         \
+                                                     &__v, __sz);      \
+               __ret;                                                  \
+       })
+
 /*
  * Creates a new (reference to a) struct vgic_irq for a given LPI.
  * If this LPI is already mapped on another ITS, we increase its refcount
 
                its_free_ite(kvm, ite);
 
-               return vgic_its_write_entry_lock(its, gpa, 0, ite_esz);
+               return vgic_its_write_entry_lock(its, gpa, 0ULL, ite);
        }
 
        return E_ITS_DISCARD_UNMAPPED_INTERRUPT;
        bool valid = its_cmd_get_validbit(its_cmd);
        u8 num_eventid_bits = its_cmd_get_size(its_cmd);
        gpa_t itt_addr = its_cmd_get_ittaddr(its_cmd);
-       int dte_esz = vgic_its_get_abi(its)->dte_esz;
        struct its_device *device;
        gpa_t gpa;
 
         * is an error, so we are done in any case.
         */
        if (!valid)
-               return vgic_its_write_entry_lock(its, gpa, 0, dte_esz);
+               return vgic_its_write_entry_lock(its, gpa, 0ULL, dte);
 
        device = vgic_its_alloc_device(its, device_id, itt_addr,
                                       num_eventid_bits);
  * vgic_its_save_ite - Save an interrupt translation entry at @gpa
  */
 static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev,
-                             struct its_ite *ite, gpa_t gpa, int ite_esz)
+                             struct its_ite *ite, gpa_t gpa)
 {
        u32 next_offset;
        u64 val;
                ite->collection->collection_id;
        val = cpu_to_le64(val);
 
-       return vgic_its_write_entry_lock(its, gpa, val, ite_esz);
+       return vgic_its_write_entry_lock(its, gpa, val, ite);
 }
 
 /**
                if (ite->irq->hw && !kvm_vgic_global_state.has_gicv4_1)
                        return -EACCES;
 
-               ret = vgic_its_save_ite(its, device, ite, gpa, ite_esz);
+               ret = vgic_its_save_ite(its, device, ite, gpa);
                if (ret)
                        return ret;
        }
  * @its: ITS handle
  * @dev: ITS device
  * @ptr: GPA
- * @dte_esz: device table entry size
  */
 static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev,
-                            gpa_t ptr, int dte_esz)
+                            gpa_t ptr)
 {
        u64 val, itt_addr_field;
        u32 next_offset;
                (dev->num_eventid_bits - 1));
        val = cpu_to_le64(val);
 
-       return vgic_its_write_entry_lock(its, ptr, val, dte_esz);
+       return vgic_its_write_entry_lock(its, ptr, val, dte);
 }
 
 /**
  */
 static int vgic_its_save_device_tables(struct vgic_its *its)
 {
-       const struct vgic_its_abi *abi = vgic_its_get_abi(its);
        u64 baser = its->baser_device_table;
        struct its_device *dev;
-       int dte_esz = abi->dte_esz;
 
        if (!(baser & GITS_BASER_VALID))
                return 0;
                if (ret)
                        return ret;
 
-               ret = vgic_its_save_dte(its, dev, eaddr, dte_esz);
+               ret = vgic_its_save_dte(its, dev, eaddr);
                if (ret)
                        return ret;
        }
 
 static int vgic_its_save_cte(struct vgic_its *its,
                             struct its_collection *collection,
-                            gpa_t gpa, int esz)
+                            gpa_t gpa)
 {
        u64 val;
 
               collection->collection_id);
        val = cpu_to_le64(val);
 
-       return vgic_its_write_entry_lock(its, gpa, val, esz);
+       return vgic_its_write_entry_lock(its, gpa, val, cte);
 }
 
 /*
  * Return +1 on success, 0 if the entry was invalid (which should be
  * interpreted as end-of-table), and a negative error value for generic errors.
  */
-static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
+static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa)
 {
        struct its_collection *collection;
        struct kvm *kvm = its->dev->kvm;
        u64 val;
        int ret;
 
-       ret = vgic_its_read_entry_lock(its, gpa, &val, esz);
+       ret = vgic_its_read_entry_lock(its, gpa, &val, cte);
        if (ret)
                return ret;
        val = le64_to_cpu(val);
        max_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
 
        list_for_each_entry(collection, &its->collection_list, coll_list) {
-               ret = vgic_its_save_cte(its, collection, gpa, cte_esz);
+               ret = vgic_its_save_cte(its, collection, gpa);
                if (ret)
                        return ret;
                gpa += cte_esz;
         * table is not fully filled, add a last dummy element
         * with valid bit unset
         */
-       return vgic_its_write_entry_lock(its, gpa, 0, cte_esz);
+       return vgic_its_write_entry_lock(its, gpa, 0ULL, cte);
 }
 
 /*
        max_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
 
        while (read < max_size) {
-               ret = vgic_its_restore_cte(its, gpa, cte_esz);
+               ret = vgic_its_restore_cte(its, gpa);
                if (ret <= 0)
                        break;
                gpa += cte_esz;