10 #include <linux/kvm.h>
11 #include <linux/kvm_host.h>
12 #include <linux/interrupt.h>
13 #include <linux/list.h>
14 #include <linux/uaccess.h>
15 #include <linux/list_sort.h>
17 #include <linux/irqchip/arm-gic-v3.h>
19 #include <asm/kvm_emulate.h>
20 #include <asm/kvm_arm.h>
21 #include <asm/kvm_mmu.h>
30 struct kvm_vcpu *filter_vcpu,
bool needs_inv);
40 struct kvm_vcpu *
vcpu)
51 irq = kzalloc(
sizeof(
struct vgic_irq), GFP_KERNEL_ACCOUNT);
53 return ERR_PTR(-ENOMEM);
72 if (oldirq->intid !=
intid)
128 #define COLLECTION_NOT_MAPPED ((u32)~0)
137 #define its_is_collection_mapped(coll) ((coll) && \
138 ((coll)->target_addr != COLLECTION_NOT_MAPPED))
149 struct list_head
entry;
177 #define ESZ_MAX ABI_0_ESZ
190 #define NR_ITS_ABIS ARRAY_SIZE(its_table_abi_versions)
244 #define for_each_lpi_its(dev, ite, its) \
245 list_for_each_entry(dev, &(its)->device_list, dev_list) \
246 list_for_each_entry(ite, &(dev)->itt_head, ite_list)
248 #define GIC_LPI_OFFSET 8192
250 #define VITS_TYPER_IDBITS 16
251 #define VITS_TYPER_DEVBITS 16
252 #define VITS_DTE_MAX_DEVID_OFFSET (BIT(14) - 1)
253 #define VITS_ITE_MAX_EVENTID_OFFSET (BIT(16) - 1)
271 #define LPI_PROP_ENABLE_BIT(p) ((p) & LPI_PROP_ENABLED)
272 #define LPI_PROP_PRIORITY(p) ((p) & 0xfc)
281 struct kvm_vcpu *filter_vcpu,
bool needs_inv)
283 u64 propbase = GICR_PROPBASER_ADDRESS(kvm->arch.vgic.propbaser);
294 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
296 if (!filter_vcpu || filter_vcpu == irq->
target_vcpu) {
306 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
309 return its_prop_update_vlpi(irq->
host_irq, prop, needs_inv);
321 struct vgic_dist *dist = &kvm->arch.vgic;
325 int irq_count, i = 0;
335 intids = kmalloc_array(irq_count,
sizeof(intids[0]), GFP_KERNEL_ACCOUNT);
346 intids[i++] = irq->
intid;
359 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
361 raw_spin_unlock_irqrestore(&irq->
irq_lock, flags);
364 struct its_vlpi_map map;
366 ret = its_get_vlpi(irq->
host_irq, &map);
371 atomic_dec(&map.vpe->vlpi_count);
372 map.vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
373 atomic_inc(&map.vpe->vlpi_count);
375 ret = its_map_vlpi(irq->
host_irq, &map);
395 struct kvm_vcpu *vcpu;
424 int nr_idbits = (propbaser & 0x1f) + 1;
436 gpa_t pendbase = GICR_PENDBASER_ADDRESS(vcpu->arch.vgic_cpu.pendbaser);
438 int last_byte_offset = -1;
449 for (i = 0; i < nr_irqs; i++) {
450 int byte_offset, bit_nr;
452 byte_offset = intids[i] / BITS_PER_BYTE;
453 bit_nr = intids[i] % BITS_PER_BYTE;
459 if (byte_offset != last_byte_offset) {
460 ret = kvm_read_guest_lock(
vcpu->kvm,
461 pendbase + byte_offset,
467 last_byte_offset = byte_offset;
474 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
487 gpa_t addr,
unsigned int len)
490 u64 reg = GITS_TYPER_PLPIS;
502 reg |= GIC_ENCODE_SZ(abi->
ite_esz, 4) << GITS_TYPER_ITT_ENTRY_SIZE_SHIFT;
509 gpa_t addr,
unsigned int len)
513 val = (its->
abi_rev << GITS_IIDR_REV_SHIFT) & GITS_IIDR_REV_MASK;
520 gpa_t addr,
unsigned int len,
523 u32 rev = GITS_IIDR_REV(val);
532 gpa_t addr,
unsigned int len)
534 switch (addr & 0xffff) {
540 return GIC_PIDR2_ARCH_GICv3 | 0x0b;
559 u32 devid, u32 eventid)
589 u32 devid, u32 eventid)
591 struct vgic_dist *dist = &kvm->arch.vgic;
607 u32 devid, u32 eventid,
610 struct vgic_dist *dist = &kvm->arch.vgic;
635 typeof(*cte),
entry);
661 struct vgic_dist *dist = &kvm->arch.vgic;
685 struct kvm_vcpu *vcpu;
691 ite =
find_ite(its, devid, eventid);
693 return E_ITS_INT_UNMAPPED_INTERRUPT;
697 return E_ITS_INT_UNMAPPED_INTERRUPT;
715 return ERR_PTR(-ENODEV);
717 if (!(msi->flags & KVM_MSI_VALID_DEVID))
718 return ERR_PTR(-EINVAL);
720 address = (u64)msi->address_hi << 32 | msi->address_lo;
724 return ERR_PTR(-EINVAL);
727 return ERR_PTR(-EINVAL);
731 return ERR_PTR(-EINVAL);
744 u32 devid, u32 eventid)
755 return irq_set_irqchip_state(irq->
host_irq,
756 IRQCHIP_STATE_PENDING,
true);
758 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
771 db = (u64)msi->address_hi << 32 | msi->address_lo;
776 raw_spin_lock_irqsave(&irq->
irq_lock, flags);
838 return (le64_to_cpu(its_cmd[word]) >> shift) & (BIT_ULL(
size) - 1);
841 #define its_cmd_get_command(cmd) its_cmd_mask_field(cmd, 0, 0, 8)
842 #define its_cmd_get_deviceid(cmd) its_cmd_mask_field(cmd, 0, 32, 32)
843 #define its_cmd_get_size(cmd) (its_cmd_mask_field(cmd, 1, 0, 5) + 1)
844 #define its_cmd_get_id(cmd) its_cmd_mask_field(cmd, 1, 0, 32)
845 #define its_cmd_get_physical_id(cmd) its_cmd_mask_field(cmd, 1, 32, 32)
846 #define its_cmd_get_collection(cmd) its_cmd_mask_field(cmd, 2, 0, 16)
847 #define its_cmd_get_ittaddr(cmd) (its_cmd_mask_field(cmd, 2, 8, 44) << 8)
848 #define its_cmd_get_target_addr(cmd) its_cmd_mask_field(cmd, 2, 16, 32)
849 #define its_cmd_get_validbit(cmd) its_cmd_mask_field(cmd, 2, 63, 1)
875 return E_ITS_DISCARD_UNMAPPED_INTERRUPT;
888 struct kvm_vcpu *vcpu;
892 ite =
find_ite(its, device_id, event_id);
894 return E_ITS_MOVI_UNMAPPED_INTERRUPT;
897 return E_ITS_MOVI_UNMAPPED_COLLECTION;
901 return E_ITS_MOVI_UNMAPPED_COLLECTION;
913 gfn_t gfn = gpa >> PAGE_SHIFT;
917 idx = srcu_read_lock(&its->
dev->kvm->srcu);
919 srcu_read_unlock(&its->
dev->kvm->srcu, idx);
933 int l1_tbl_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
934 u64 indirect_ptr, type = GITS_BASER_TYPE(baser);
935 phys_addr_t
base = GITS_BASER_ADDR_48_to_52(baser);
936 int esz = GITS_BASER_ENTRY_SIZE(baser);
940 case GITS_BASER_TYPE_DEVICE:
944 case GITS_BASER_TYPE_COLLECTION:
946 if (
id >= BIT_ULL(16))
953 if (!(baser & GITS_BASER_INDIRECT)) {
956 if (
id >= (l1_tbl_size / esz))
959 addr =
base +
id * esz;
968 index =
id / (SZ_64K / esz);
969 if (index >= (l1_tbl_size /
sizeof(u64)))
973 if (kvm_read_guest_lock(its->
dev->kvm,
974 base + index *
sizeof(indirect_ptr),
975 &indirect_ptr,
sizeof(indirect_ptr)))
978 indirect_ptr = le64_to_cpu(indirect_ptr);
981 if (!(indirect_ptr & BIT_ULL(63)))
985 indirect_ptr &= GENMASK_ULL(51, 16);
988 index =
id % (SZ_64K / esz);
989 indirect_ptr += index * esz;
992 *eaddr = indirect_ptr;
1026 collection = kzalloc(
sizeof(*collection), GFP_KERNEL_ACCOUNT);
1070 ite = kzalloc(
sizeof(*ite), GFP_KERNEL_ACCOUNT);
1072 return ERR_PTR(-ENOMEM);
1092 struct kvm_vcpu *vcpu = NULL;
1100 return E_ITS_MAPTI_UNMAPPED_DEVICE;
1103 return E_ITS_MAPTI_ID_OOR;
1111 return E_ITS_MAPTI_PHYSICALID_OOR;
1114 if (
find_ite(its, device_id, event_id))
1122 return E_ITS_MAPC_COLLECTION_OOR;
1127 new_coll = collection;
1134 return PTR_ERR(ite);
1145 return PTR_ERR(irq);
1196 device = kzalloc(
sizeof(*device), GFP_KERNEL_ACCOUNT);
1198 return ERR_PTR(-ENOMEM);
1223 return E_ITS_MAPD_DEVICE_OOR;
1226 return E_ITS_MAPD_ITTSIZE_OOR;
1248 return PTR_ERR_OR_ZERO(device);
1269 struct kvm_vcpu *vcpu;
1273 return E_ITS_MAPC_PROCNUM_OOR;
1282 return E_ITS_MAPC_COLLECTION_OOR;
1312 return E_ITS_CLEAR_UNMAPPED_INTERRUPT;
1318 IRQCHIP_STATE_PENDING,
false);
1342 return E_ITS_INV_UNMAPPED_INTERRUPT;
1357 struct kvm *kvm = vcpu->kvm;
1358 int irq_count, i = 0;
1365 for (i = 0; i < irq_count; i++) {
1375 if (
vcpu->arch.vgic_cpu.vgic_v3.its_vpe.its_vm)
1376 its_invall_vpe(&
vcpu->arch.vgic_cpu.vgic_v3.its_vpe);
1394 struct kvm_vcpu *vcpu;
1398 return E_ITS_INVALL_UNMAPPED_COLLECTION;
1417 struct kvm_vcpu *vcpu1, *vcpu2;
1426 if (!vcpu1 || !vcpu2)
1427 return E_ITS_MOVALL_PROCNUM_OOR;
1436 for (i = 0; i < irq_count; i++) {
1485 case GITS_CMD_MAPTI:
1491 case GITS_CMD_DISCARD:
1494 case GITS_CMD_CLEAR:
1497 case GITS_CMD_MOVALL:
1506 case GITS_CMD_INVALL:
1522 GITS_BASER_SHAREABILITY_SHIFT,
1525 GITS_BASER_INNER_CACHEABILITY_SHIFT,
1528 GITS_BASER_OUTER_CACHEABILITY_SHIFT,
1532 reg = (reg & ~GITS_BASER_PAGE_SIZE_MASK) | GITS_BASER_PAGE_SIZE_64K;
1540 GITS_CBASER_SHAREABILITY_SHIFT,
1543 GITS_CBASER_INNER_CACHEABILITY_SHIFT,
1546 GITS_CBASER_OUTER_CACHEABILITY_SHIFT,
1550 reg &= ~GENMASK_ULL(15, 12);
1557 gpa_t addr,
unsigned int len)
1563 gpa_t addr,
unsigned int len,
1582 #define ITS_CMD_BUFFER_SIZE(baser) ((((baser) & 0xff) + 1) << 12)
1583 #define ITS_CMD_SIZE 32
1584 #define ITS_CMD_OFFSET(reg) ((reg) & GENMASK(19, 5))
1596 cbaser = GITS_CBASER_ADDRESS(its->
cbaser);
1599 int ret = kvm_read_guest_lock(kvm, cbaser + its->
creadr,
1624 gpa_t addr,
unsigned int len,
1649 gpa_t addr,
unsigned int len)
1656 gpa_t addr,
unsigned int len)
1663 gpa_t addr,
unsigned int len,
1682 its->
creadr = cmd_offset;
1688 #define BASER_INDEX(addr) (((addr) / sizeof(u64)) & 0x7)
1691 gpa_t addr,
unsigned int len)
1710 #define GITS_BASER_RO_MASK (GENMASK_ULL(52, 48) | GENMASK_ULL(58, 56))
1713 gpa_t addr,
unsigned int len,
1717 u64 entry_size, table_type;
1718 u64 reg, *regptr, clearbits = 0;
1728 table_type = GITS_BASER_TYPE_DEVICE;
1733 table_type = GITS_BASER_TYPE_COLLECTION;
1734 clearbits = GITS_BASER_INDIRECT;
1744 reg |= (entry_size - 1) << GITS_BASER_ENTRY_SIZE_SHIFT;
1745 reg |= table_type << GITS_BASER_TYPE_SHIFT;
1750 if (!(reg & GITS_BASER_VALID)) {
1753 switch (table_type) {
1754 case GITS_BASER_TYPE_DEVICE:
1757 case GITS_BASER_TYPE_COLLECTION:
1767 gpa_t addr,
unsigned int len)
1773 reg |= GITS_CTLR_QUIESCENT;
1775 reg |= GITS_CTLR_ENABLE;
1782 gpa_t addr,
unsigned int len,
1791 if (!its->
enabled && (val & GITS_CTLR_ENABLE) &&
1794 !(its->
cbaser & GITS_CBASER_VALID)))
1797 its->
enabled = !!(val & GITS_CTLR_ENABLE);
1811 #define REGISTER_ITS_DESC(off, rd, wr, length, acc) \
1813 .reg_offset = off, \
1815 .access_flags = acc, \
1820 #define REGISTER_ITS_DESC_UACCESS(off, rd, wr, uwr, length, acc)\
1822 .reg_offset = off, \
1824 .access_flags = acc, \
1827 .uaccess_its_write = uwr, \
1831 gpa_t addr,
unsigned int len,
unsigned long val)
1868 if (!(vcpu->arch.vgic_cpu.pendbaser & GICR_PENDBASER_PTZ))
1878 mutex_lock(&kvm->slots_lock);
1893 KVM_VGIC_V3_ITS_SIZE, &iodev->
dev);
1895 mutex_unlock(&kvm->slots_lock);
1901 #define LPI_DEFAULT_PCPU_CACHE_SIZE 16
1905 struct vgic_dist *dist = &kvm->arch.vgic;
1914 for (i = 0; i < sz; i++) {
1918 cte = kzalloc(
sizeof(*cte), GFP_KERNEL_ACCOUNT);
1922 INIT_LIST_HEAD(&cte->
entry);
1929 struct vgic_dist *dist = &kvm->arch.vgic;
1934 list_for_each_entry_safe(cte, tmp,
1936 list_del(&cte->
entry);
1941 #define INITIAL_BASER_VALUE \
1942 (GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWb) | \
1943 GIC_BASER_CACHEABILITY(GITS_BASER, OUTER, SameAsInner) | \
1944 GIC_BASER_SHAREABILITY(GITS_BASER, InnerShareable) | \
1945 GITS_BASER_PAGE_SIZE_64K)
1947 #define INITIAL_PROPBASER_VALUE \
1948 (GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWb) | \
1949 GIC_BASER_CACHEABILITY(GICR_PROPBASER, OUTER, SameAsInner) | \
1950 GIC_BASER_SHAREABILITY(GICR_PROPBASER, InnerShareable))
1957 if (type != KVM_DEV_TYPE_ARM_VGIC_ITS)
1960 its = kzalloc(
sizeof(
struct vgic_its), GFP_KERNEL_ACCOUNT);
1964 mutex_lock(&
dev->kvm->arch.config_lock);
1969 mutex_unlock(&
dev->kvm->arch.config_lock);
1981 #ifdef CONFIG_LOCKDEP
1993 dev->kvm->arch.vgic.msis_require_devid =
true;
1994 dev->kvm->arch.vgic.has_its =
true;
1999 ((u64)GITS_BASER_TYPE_DEVICE << GITS_BASER_TYPE_SHIFT);
2001 ((u64)GITS_BASER_TYPE_COLLECTION << GITS_BASER_TYPE_SHIFT);
2008 mutex_unlock(&
dev->kvm->arch.config_lock);
2015 struct kvm *kvm =
kvm_dev->kvm;
2029 struct kvm_device_attr *attr)
2032 gpa_t offset = attr->attr;
2035 align = (offset < GITS_TYPER) || (offset >= GITS_PIDR4) ? 0x3 : 0x7;
2050 struct kvm_device_attr *attr,
2051 u64 *reg,
bool is_write)
2060 offset = attr->attr;
2069 if ((offset < GITS_TYPER) || (offset >= GITS_PIDR4))
2077 mutex_lock(&
dev->kvm->lock);
2080 mutex_unlock(&
dev->kvm->lock);
2084 mutex_lock(&
dev->kvm->arch.config_lock);
2110 *reg = region->
its_read(
dev->kvm, its, addr, len);
2113 mutex_unlock(&
dev->kvm->arch.config_lock);
2115 mutex_unlock(&
dev->kvm->lock);
2125 if (list_is_last(&dev->
dev_list, h))
2127 next = list_next_entry(dev,
dev_list);
2138 if (list_is_last(&ite->
ite_list, h))
2140 next = list_next_entry(ite,
ite_list);
2177 struct kvm *kvm = its->
dev->kvm;
2178 unsigned long len =
size;
2184 memset(entry, 0, esz);
2190 ret = kvm_read_guest_lock(kvm, gpa, entry, esz);
2194 next_offset = fn(its,
id, entry, opaque);
2195 if (next_offset <= 0)
2198 byte_offset = next_offset * esz;
2199 if (byte_offset >= len)
2213 struct its_ite *ite, gpa_t gpa,
int ite_esz)
2215 struct kvm *kvm = its->
dev->kvm;
2223 val = cpu_to_le64(val);
2234 void *ptr,
void *opaque)
2238 struct kvm *kvm = its->
dev->kvm;
2239 struct kvm_vcpu *vcpu = NULL;
2241 u64 *p = (u64 *)ptr;
2243 u32 coll_id, lpi_id;
2249 val = le64_to_cpu(val);
2273 return PTR_ERR(ite);
2281 return PTR_ERR(
irq);
2289 const struct list_head *b)
2365 struct kvm *kvm = its->
dev->kvm;
2366 u64 val, itt_addr_field;
2369 itt_addr_field = dev->
itt_addr >> 8;
2375 val = cpu_to_le64(val);
2391 void *ptr,
void *opaque)
2397 u64 entry = *(u64 *)ptr;
2402 entry = le64_to_cpu(entry);
2420 return PTR_ERR(dev);
2432 const struct list_head *b)
2457 if (!(baser & GITS_BASER_VALID))
2497 int l2_start_id =
id * (SZ_64K / abi->
dte_esz);
2498 u64 entry = *(u64 *)addr;
2503 entry = le64_to_cpu(entry);
2525 int l1_tbl_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
2528 if (!(baser & GITS_BASER_VALID))
2531 l1_gpa = GITS_BASER_ADDR_48_to_52(baser);
2533 if (baser & GITS_BASER_INDIRECT) {
2534 l1_esz = GITS_LVL1_ENTRY_SIZE;
2562 val = cpu_to_le64(val);
2574 struct kvm *kvm = its->
dev->kvm;
2575 u32 target_addr, coll_id;
2579 BUG_ON(esz >
sizeof(val));
2580 ret = kvm_read_guest_lock(kvm, gpa, &val, esz);
2583 val = le64_to_cpu(val);
2591 !kvm_get_vcpu_by_id(kvm, target_addr))
2616 gpa_t gpa = GITS_BASER_ADDR_48_to_52(baser);
2619 size_t max_size, filled = 0;
2620 int ret, cte_esz = abi->
cte_esz;
2622 if (!(baser & GITS_BASER_VALID))
2625 max_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
2635 if (filled == max_size)
2643 BUG_ON(cte_esz >
sizeof(val));
2658 size_t max_size, read = 0;
2662 if (!(baser & GITS_BASER_VALID))
2665 gpa = GITS_BASER_ADDR_48_to_52(baser);
2667 max_size = GITS_BASER_NR_PAGES(baser) * SZ_64K;
2669 while (read < max_size) {
2729 << GITS_BASER_ENTRY_SIZE_SHIFT);
2732 << GITS_BASER_ENTRY_SIZE_SHIFT);
2750 struct kvm_device_attr *attr)
2752 switch (attr->group) {
2753 case KVM_DEV_ARM_VGIC_GRP_ADDR:
2754 switch (attr->attr) {
2755 case KVM_VGIC_ITS_ADDR_TYPE:
2759 case KVM_DEV_ARM_VGIC_GRP_CTRL:
2760 switch (attr->attr) {
2761 case KVM_DEV_ARM_VGIC_CTRL_INIT:
2763 case KVM_DEV_ARM_ITS_CTRL_RESET:
2765 case KVM_DEV_ARM_ITS_SAVE_TABLES:
2767 case KVM_DEV_ARM_ITS_RESTORE_TABLES:
2771 case KVM_DEV_ARM_VGIC_GRP_ITS_REGS:
2782 if (attr == KVM_DEV_ARM_VGIC_CTRL_INIT)
2785 mutex_lock(&kvm->lock);
2788 mutex_unlock(&kvm->lock);
2792 mutex_lock(&kvm->arch.config_lock);
2796 case KVM_DEV_ARM_ITS_CTRL_RESET:
2799 case KVM_DEV_ARM_ITS_SAVE_TABLES:
2802 case KVM_DEV_ARM_ITS_RESTORE_TABLES:
2808 mutex_unlock(&kvm->arch.config_lock);
2810 mutex_unlock(&kvm->lock);
2826 struct vgic_dist *dist = &kvm->arch.vgic;
2832 struct kvm_device_attr *attr)
2837 switch (attr->group) {
2838 case KVM_DEV_ARM_VGIC_GRP_ADDR: {
2839 u64 __user *uaddr = (u64 __user *)(
long)attr->addr;
2840 unsigned long type = (
unsigned long)attr->attr;
2843 if (type != KVM_VGIC_ITS_ADDR_TYPE)
2846 if (copy_from_user(&addr, uaddr,
sizeof(addr)))
2850 addr, SZ_64K, KVM_VGIC_V3_ITS_SIZE);
2856 case KVM_DEV_ARM_VGIC_GRP_CTRL:
2858 case KVM_DEV_ARM_VGIC_GRP_ITS_REGS: {
2859 u64 __user *uaddr = (u64 __user *)(
long)attr->addr;
2862 if (get_user(reg, uaddr))
2872 struct kvm_device_attr *attr)
2874 switch (attr->group) {
2875 case KVM_DEV_ARM_VGIC_GRP_ADDR: {
2878 u64 __user *uaddr = (u64 __user *)(
long)attr->addr;
2879 unsigned long type = (
unsigned long)attr->attr;
2881 if (type != KVM_VGIC_ITS_ADDR_TYPE)
2884 if (copy_to_user(uaddr, &addr,
sizeof(addr)))
2888 case KVM_DEV_ARM_VGIC_GRP_ITS_REGS: {
2889 u64 __user *uaddr = (u64 __user *)(
long)attr->addr;
2896 return put_user(reg, uaddr);
2906 .name =
"kvm-arm-vgic-its",
2917 KVM_DEV_TYPE_ARM_VGIC_ITS);
bool lock_all_vcpus(struct kvm *kvm)
void unlock_all_vcpus(struct kvm *kvm)
struct vgic_global kvm_vgic_global_state
#define vgic_initialized(k)
static unsigned long base
static void kvm_iodevice_init(struct kvm_io_device *dev, const struct kvm_io_device_ops *ops)
int kvm_register_device_ops(const struct kvm_device_ops *ops, u32 type)
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, struct kvm_io_device *dev)
static struct miscdevice kvm_dev
struct kvm_io_device * kvm_io_bus_get_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr)
bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
struct list_head coll_list
struct list_head itt_head
struct list_head dev_list
struct list_head ite_list
struct its_collection * collection
const struct kvm_io_device_ops * ops
struct list_head lpi_translation_cache
struct list_head lpi_list_head
bool table_write_in_progress
raw_spinlock_t lpi_list_lock
const struct vgic_register_region * regions
enum iodev_type iodev_type
struct list_head lpi_list
struct kvm_vcpu * target_vcpu
enum vgic_irq_config config
int(* commit)(struct vgic_its *its)
int(* save_tables)(struct vgic_its *its)
int(* restore_tables)(struct vgic_its *its)
struct vgic_io_device iodev
struct list_head collection_list
struct list_head device_list
unsigned int access_flags
unsigned long(* its_read)(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
void(* its_write)(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
int(* uaccess_its_write)(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static unsigned long vgic_mmio_read_its_creadr(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
static int vgic_its_has_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
#define its_cmd_get_validbit(cmd)
static int update_affinity(struct vgic_irq *irq, struct kvm_vcpu *vcpu)
#define LPI_PROP_ENABLE_BIT(p)
const struct vgic_its_abi * vgic_its_get_abi(struct vgic_its *its)
static int vgic_its_set_abi(struct vgic_its *its, u32 rev)
static void vgic_mmio_write_its_cbaser(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static struct its_device * vgic_its_alloc_device(struct vgic_its *its, u32 device_id, gpa_t itt_addr, u8 num_eventid_bits)
static struct kvm_vcpu * collection_to_vcpu(struct kvm *kvm, struct its_collection *col)
static int vgic_its_ite_cmp(void *priv, const struct list_head *a, const struct list_head *b)
#define BASER_INDEX(addr)
static unsigned long vgic_mmio_read_its_typer(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
static void vgic_its_free_collection_list(struct kvm *kvm, struct vgic_its *its)
static int vgic_its_cmd_handle_inv(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
static int vgic_its_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
static int vgic_its_cmd_handle_clear(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
#define for_each_lpi_its(dev, ite, its)
static u32 compute_next_eventid_offset(struct list_head *h, struct its_ite *ite)
static unsigned long vgic_mmio_read_its_iidr(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
static int vgic_its_save_cte(struct vgic_its *its, struct its_collection *collection, gpa_t gpa, int esz)
static bool vgic_its_check_id(struct vgic_its *its, u64 baser, u32 id, gpa_t *eaddr)
static void vgic_its_free_collection(struct vgic_its *its, u32 coll_id)
int vgic_its_inject_cached_translation(struct kvm *kvm, struct kvm_msi *msi)
static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
#define its_cmd_get_size(cmd)
static unsigned long vgic_mmio_read_its_ctlr(struct kvm *vcpu, struct vgic_its *its, gpa_t addr, unsigned int len)
int vgic_its_resolve_lpi(struct kvm *kvm, struct vgic_its *its, u32 devid, u32 eventid, struct vgic_irq **irq)
int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr)
static int update_lpi_config(struct kvm *kvm, struct vgic_irq *irq, struct kvm_vcpu *filter_vcpu, bool needs_inv)
static struct vgic_register_region its_registers[]
static int vgic_its_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
static void its_mmio_write_wi(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static int vgic_its_restore_dte(struct vgic_its *its, u32 id, void *ptr, void *opaque)
static bool __is_visible_gfn_locked(struct vgic_its *its, gpa_t gpa)
static int vgic_its_attr_regs_access(struct kvm_device *dev, struct kvm_device_attr *attr, u64 *reg, bool is_write)
static void vgic_mmio_write_its_baser(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
static u32 compute_next_devid_offset(struct list_head *h, struct its_device *dev)
int kvm_vgic_register_its_device(void)
int vgic_its_inject_msi(struct kvm *kvm, struct kvm_msi *msi)
static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
void vgic_lpi_translation_cache_destroy(struct kvm *kvm)
static int vgic_its_cmd_handle_mapc(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
static void vgic_mmio_write_its_ctlr(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static int vgic_its_restore_ite(struct vgic_its *its, u32 event_id, void *ptr, void *opaque)
static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
#define VITS_ITE_MAX_EVENTID_OFFSET
#define LPI_PROP_PRIORITY(p)
#define ITS_CMD_OFFSET(reg)
static unsigned long vgic_mmio_read_its_cbaser(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev)
#define its_cmd_get_deviceid(cmd)
static int vgic_its_device_cmp(void *priv, const struct list_head *a, const struct list_head *b)
#define LPI_DEFAULT_PCPU_CACHE_SIZE
#define its_cmd_get_collection(cmd)
static struct vgic_irq * vgic_add_lpi(struct kvm *kvm, u32 intid, struct kvm_vcpu *vcpu)
#define its_cmd_get_id(cmd)
void vgic_enable_lpis(struct kvm_vcpu *vcpu)
static int vgic_its_create(struct kvm_device *dev, u32 type)
static u32 max_lpis_propbaser(u64 propbaser)
static u64 vgic_sanitise_its_baser(u64 reg)
static struct kvm_device_ops kvm_arm_vgic_its_ops
static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev, struct its_ite *ite, gpa_t gpa, int ite_esz)
static int handle_l1_dte(struct vgic_its *its, u32 id, void *addr, void *opaque)
static void update_affinity_ite(struct kvm *kvm, struct its_ite *ite)
static void vgic_its_process_commands(struct kvm *kvm, struct vgic_its *its)
static int vgic_its_restore_collection_table(struct vgic_its *its)
static int vgic_its_save_collection_table(struct vgic_its *its)
#define its_cmd_get_command(cmd)
static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz, int start_id, entry_fn_t fn, void *opaque)
#define VITS_TYPER_IDBITS
static const struct vgic_its_abi its_table_abi_versions[]
static struct its_collection * find_collection(struct vgic_its *its, int coll_id)
void vgic_its_invalidate_cache(struct kvm *kvm)
struct vgic_its * vgic_msi_to_its(struct kvm *kvm, struct kvm_msi *msi)
static struct its_ite * vgic_its_alloc_ite(struct its_device *device, struct its_collection *collection, u32 event_id)
static void vgic_mmio_write_its_cwriter(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static int vgic_its_save_device_tables(struct vgic_its *its)
static void vgic_its_free_device(struct kvm *kvm, struct its_device *device)
static int vgic_its_cmd_handle_movi(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
static void its_free_ite(struct kvm *kvm, struct its_ite *ite)
int(* entry_fn_t)(struct vgic_its *its, u32 id, void *entry, void *opaque)
#define REGISTER_ITS_DESC_UACCESS(off, rd, wr, uwr, length, acc)
static int vgic_its_handle_command(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
#define INITIAL_PROPBASER_VALUE
static struct vgic_irq * __vgic_its_check_cache(struct vgic_dist *dist, phys_addr_t db, u32 devid, u32 eventid)
static int vgic_its_cmd_handle_int(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
#define its_cmd_get_ittaddr(cmd)
static int vgic_its_has_attr_regs(struct kvm_device *dev, struct kvm_device_attr *attr)
static int vgic_its_commit_v0(struct vgic_its *its)
#define COLLECTION_NOT_MAPPED
static bool vgic_its_check_event_id(struct vgic_its *its, struct its_device *device, u32 event_id)
static void vgic_its_reset(struct kvm *kvm, struct vgic_its *its)
static int vgic_its_save_tables_v0(struct vgic_its *its)
static struct vgic_irq * vgic_its_check_cache(struct kvm *kvm, phys_addr_t db, u32 devid, u32 eventid)
bool kvm_arch_allow_write_without_running_vcpu(struct kvm *kvm)
static u64 its_cmd_mask_field(u64 *its_cmd, int word, int shift, int size)
static void vgic_its_free_device_list(struct kvm *kvm, struct vgic_its *its)
#define INITIAL_BASER_VALUE
static void update_affinity_collection(struct kvm *kvm, struct vgic_its *its, struct its_collection *coll)
#define GITS_BASER_RO_MASK
static int vgic_its_restore_tables_v0(struct vgic_its *its)
static int vgic_its_trigger_msi(struct kvm *kvm, struct vgic_its *its, u32 devid, u32 eventid)
static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev, gpa_t ptr, int dte_esz)
static unsigned long vgic_mmio_read_its_cwriter(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
#define its_cmd_get_target_addr(cmd)
static void vgic_its_cache_translation(struct kvm *kvm, struct vgic_its *its, u32 devid, u32 eventid, struct vgic_irq *irq)
static int vgic_register_its_iodev(struct kvm *kvm, struct vgic_its *its, u64 addr)
static int vgic_its_save_itt(struct vgic_its *its, struct its_device *device)
#define its_cmd_get_physical_id(cmd)
static struct its_ite * find_ite(struct vgic_its *its, u32 device_id, u32 event_id)
static int vgic_its_alloc_collection(struct vgic_its *its, struct its_collection **colp, u32 coll_id)
static int vgic_mmio_uaccess_write_its_creadr(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static int vgic_its_ctrl(struct kvm *kvm, struct vgic_its *its, u64 attr)
#define its_is_collection_mapped(coll)
static unsigned long vgic_mmio_read_its_baser(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
static struct its_device * find_its_device(struct vgic_its *its, u32 device_id)
int vgic_its_invall(struct kvm_vcpu *vcpu)
static int vgic_its_cmd_handle_mapi(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
static void vgic_its_destroy(struct kvm_device *kvm_dev)
static int its_sync_lpi_pending_table(struct kvm_vcpu *vcpu)
static int vgic_its_cmd_handle_invall(struct kvm *kvm, struct vgic_its *its, u64 *its_cmd)
#define ITS_CMD_BUFFER_SIZE(baser)
static int vgic_mmio_uaccess_write_its_iidr(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len, unsigned long val)
static u64 vgic_sanitise_its_cbaser(u64 reg)
#define VITS_DTE_MAX_DEVID_OFFSET
static int vgic_its_restore_device_tables(struct vgic_its *its)
static unsigned long vgic_mmio_read_its_idregs(struct kvm *kvm, struct vgic_its *its, gpa_t addr, unsigned int len)
#define VITS_TYPER_DEVBITS
#define REGISTER_ITS_DESC(off, rd, wr, length, acc)
void vgic_lpi_translation_cache_init(struct kvm *kvm)
int vgic_its_inv_lpi(struct kvm *kvm, struct vgic_irq *irq)
int vgic_check_iorange(struct kvm *kvm, phys_addr_t ioaddr, phys_addr_t addr, phys_addr_t alignment, phys_addr_t size)
u64 update_64bit_reg(u64 reg, unsigned int offset, unsigned int len, unsigned long val)
bool vgic_has_its(struct kvm *kvm)
u64 vgic_sanitise_shareability(u64 field)
u64 vgic_sanitise_inner_cacheability(u64 field)
unsigned long extract_bytes(u64 data, unsigned int offset, unsigned int num)
u64 vgic_sanitise_outer_cacheability(u64 field)
bool vgic_lpis_enabled(struct kvm_vcpu *vcpu)
u64 vgic_sanitise_field(u64 reg, u64 field_mask, int field_shift, u64(*sanitise_fn)(u64))
const struct vgic_register_region * vgic_find_mmio_region(const struct vgic_register_region *regions, int nr_regions, unsigned int offset)
const struct kvm_io_device_ops kvm_io_gic_ops
#define VGIC_ACCESS_64bit
#define VGIC_ACCESS_32bit
int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)
int vgic_v4_init(struct kvm *kvm)
bool vgic_queue_irq_unlock(struct kvm *kvm, struct vgic_irq *irq, unsigned long flags)
struct vgic_irq * vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 intid)
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
void __vgic_put_lpi_locked(struct kvm *kvm, struct vgic_irq *irq)
#define KVM_ITS_DTE_NEXT_SHIFT
#define KVM_ITS_CTE_VALID_MASK
static void vgic_get_irq_kref(struct vgic_irq *irq)
#define KVM_ITS_ITE_ICID_MASK
#define KVM_ITS_DTE_SIZE_MASK
#define KVM_ITS_ITE_NEXT_SHIFT
#define KVM_ITS_CTE_VALID_SHIFT
#define KVM_ITS_DTE_ITTADDR_SHIFT
#define KVM_ITS_DTE_ITTADDR_MASK
#define INTERRUPT_ID_BITS_ITS
static int vgic_write_guest_lock(struct kvm *kvm, gpa_t gpa, const void *data, unsigned long len)
#define KVM_ITS_L1E_VALID_MASK
#define KVM_ITS_CTE_RDBASE_SHIFT
#define KVM_ITS_CTE_ICID_MASK
#define KVM_ITS_L1E_ADDR_MASK
#define KVM_ITS_ITE_PINTID_MASK
#define IS_VGIC_ADDR_UNDEF(_x)
#define KVM_ITS_DTE_NEXT_MASK
#define KVM_ITS_ITE_PINTID_SHIFT
#define KVM_ITS_DTE_VALID_SHIFT