On Wed, Sep 8, 2021 at 10:18 PM Oliver Upton <oupton@xxxxxxxxxx> wrote: > > On Thu, Sep 09, 2021 at 01:38:11AM +0000, Raghavendra Rao Ananta wrote: > > Add basic support for ARM Generic Interrupt Controller v3. > > The support provides guests to setup interrupts. > > > > The work is inspired from kvm-unit-tests and the kernel's > > GIC driver (drivers/irqchip/irq-gic-v3.c). > > > > Signed-off-by: Raghavendra Rao Ananta <rananta@xxxxxxxxxx> > > Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx> > > --- > > tools/testing/selftests/kvm/Makefile | 2 +- > > .../selftests/kvm/include/aarch64/gic.h | 21 ++ > > tools/testing/selftests/kvm/lib/aarch64/gic.c | 93 +++++++ > > .../selftests/kvm/lib/aarch64/gic_private.h | 21 ++ > > .../selftests/kvm/lib/aarch64/gic_v3.c | 240 ++++++++++++++++++ > > .../selftests/kvm/lib/aarch64/gic_v3.h | 70 +++++ > > 6 files changed, 446 insertions(+), 1 deletion(-) > > create mode 100644 tools/testing/selftests/kvm/include/aarch64/gic.h > > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic.c > > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_private.h > > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_v3.c > > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_v3.h > > > > [...] > > > +static void > > +gic_dist_init(enum gic_type type, unsigned int nr_cpus, void *dist_base) > > +{ > > + const struct gic_common_ops *gic_ops; > > does this need to be initialized? I haven't tried compiling, but it > seems it should trigger a compiler warning as it is only initialized if > type == GIC_V3. > Huh, I thought I had a default case covering this (must have gone lost during code reorg). Nice catch though! Surprisingly, the compiler never warned. I'm not sure if its smart enough to figure out that the caller of this function had GUEST_ASSERT(type < GIC_TYPE_MAX); Anyway, I'll clean it up. Regards, Raghavendra > > + spin_lock(&gic_lock); > > + > > + /* Distributor initialization is needed only once per VM */ > > + if (gic_common_ops) { > > + spin_unlock(&gic_lock); > > + return; > > + } > > + > > + if (type == GIC_V3) > > + gic_ops = &gicv3_ops; > > + > > + gic_ops->gic_init(nr_cpus, dist_base); > > + gic_common_ops = gic_ops; > > + > > + /* Make sure that the initialized data is visible to all the vCPUs */ > > + dsb(sy); > > + > > + spin_unlock(&gic_lock); > > +} >