Commit 1505bc70 authored by Oliver Upton's avatar Oliver Upton Committed by Marc Zyngier
Browse files

KVM: selftests: Standardise layout of GIC frames



It would appear that all of the selftests are using the same exact
layout for the GIC frames. Fold this back into the library
implementation to avoid defining magic values all over the selftests.

This is an extension of Colton's change, ripping out parameterization of
from the library internals in addition to the public interfaces.

Co-developed-by: default avatarColton Lewis <coltonlewis@google.com>
Signed-off-by: default avatarColton Lewis <coltonlewis@google.com>
Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240422200158.2606761-15-oliver.upton@linux.dev


Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent d82689bd
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -14,9 +14,6 @@
#include "timer_test.h"
#include "vgic.h"

#define GICD_BASE_GPA			0x8000000ULL
#define GICR_BASE_GPA			0x80A0000ULL

enum guest_stage {
	GUEST_STAGE_VTIMER_CVAL = 1,
	GUEST_STAGE_VTIMER_TVAL,
@@ -149,8 +146,7 @@ static void guest_code(void)

	local_irq_disable();

	gic_init(GIC_V3, test_args.nr_vcpus,
		(void *)GICD_BASE_GPA, (void *)GICR_BASE_GPA);
	gic_init(GIC_V3, test_args.nr_vcpus);

	timer_set_ctl(VIRTUAL, CTL_IMASK);
	timer_set_ctl(PHYSICAL, CTL_IMASK);
@@ -209,7 +205,7 @@ struct kvm_vm *test_vm_create(void)
		vcpu_init_descriptor_tables(vcpus[i]);

	test_init_timer_irq(vm);
	gic_fd = vgic_v3_setup(vm, nr_vcpus, 64, GICD_BASE_GPA, GICR_BASE_GPA);
	gic_fd = vgic_v3_setup(vm, nr_vcpus, 64);
	__TEST_REQUIRE(gic_fd >= 0, "Failed to create vgic-v3");

	/* Make all the test's cmdline args visible to the guest */
+2 −9
Original line number Diff line number Diff line
@@ -19,9 +19,6 @@
#include "gic_v3.h"
#include "vgic.h"

#define GICD_BASE_GPA		0x08000000ULL
#define GICR_BASE_GPA		0x080A0000ULL

/*
 * Stores the user specified args; it's passed to the guest and to every test
 * function.
@@ -49,9 +46,6 @@ struct test_args {
#define IRQ_DEFAULT_PRIO	(LOWEST_PRIO - 1)
#define IRQ_DEFAULT_PRIO_REG	(IRQ_DEFAULT_PRIO << KVM_PRIO_SHIFT) /* 0xf0 */

static void *dist = (void *)GICD_BASE_GPA;
static void *redist = (void *)GICR_BASE_GPA;

/*
 * The kvm_inject_* utilities are used by the guest to ask the host to inject
 * interrupts (e.g., using the KVM_IRQ_LINE ioctl).
@@ -478,7 +472,7 @@ static void guest_code(struct test_args *args)
	bool level_sensitive = args->level_sensitive;
	struct kvm_inject_desc *f, *inject_fns;

	gic_init(GIC_V3, 1, dist, redist);
	gic_init(GIC_V3, 1);

	for (i = 0; i < nr_irqs; i++)
		gic_irq_enable(i);
@@ -764,8 +758,7 @@ static void test_vgic(uint32_t nr_irqs, bool level_sensitive, bool eoi_split)
	memcpy(addr_gva2hva(vm, args_gva), &args, sizeof(args));
	vcpu_args_set(vcpu, 1, args_gva);

	gic_fd = vgic_v3_setup(vm, 1, nr_irqs,
			GICD_BASE_GPA, GICR_BASE_GPA);
	gic_fd = vgic_v3_setup(vm, 1, nr_irqs);
	__TEST_REQUIRE(gic_fd >= 0, "Failed to create vgic-v3, skipping");

	vm_install_exception_handler(vm, VECTOR_IRQ_CURRENT,
+1 −5
Original line number Diff line number Diff line
@@ -404,9 +404,6 @@ static void guest_code(uint64_t expected_pmcr_n)
	GUEST_DONE();
}

#define GICD_BASE_GPA	0x8000000ULL
#define GICR_BASE_GPA	0x80A0000ULL

/* Create a VM that has one vCPU with PMUv3 configured. */
static void create_vpmu_vm(void *guest_code)
{
@@ -438,8 +435,7 @@ static void create_vpmu_vm(void *guest_code)
	init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3);
	vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code);
	vcpu_init_descriptor_tables(vpmu_vm.vcpu);
	vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64,
					GICD_BASE_GPA, GICR_BASE_GPA);
	vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64);
	__TEST_REQUIRE(vpmu_vm.gic_fd >= 0,
		       "Failed to create vgic-v3, skipping");

+1 −4
Original line number Diff line number Diff line
@@ -22,9 +22,6 @@
#ifdef __aarch64__
#include "aarch64/vgic.h"

#define GICD_BASE_GPA			0x8000000ULL
#define GICR_BASE_GPA			0x80A0000ULL

static int gic_fd;

static void arch_setup_vm(struct kvm_vm *vm, unsigned int nr_vcpus)
@@ -33,7 +30,7 @@ static void arch_setup_vm(struct kvm_vm *vm, unsigned int nr_vcpus)
	 * The test can still run even if hardware does not support GICv3, as it
	 * is only an optimization to reduce guest exits.
	 */
	gic_fd = vgic_v3_setup(vm, nr_vcpus, 64, GICD_BASE_GPA, GICR_BASE_GPA);
	gic_fd = vgic_v3_setup(vm, nr_vcpus, 64);
}

static void arch_cleanup_vm(struct kvm_vm *vm)
+10 −2
Original line number Diff line number Diff line
@@ -6,11 +6,20 @@
#ifndef SELFTEST_KVM_GIC_H
#define SELFTEST_KVM_GIC_H

#include <asm/kvm.h>

enum gic_type {
	GIC_V3,
	GIC_TYPE_MAX,
};

#define GICD_BASE_GPA		0x8000000ULL
#define GICR_BASE_GPA		(GICD_BASE_GPA + KVM_VGIC_V3_DIST_SIZE)

/* The GIC is identity-mapped into the guest at the time of setup. */
#define GICD_BASE_GVA		((volatile void *)GICD_BASE_GPA)
#define GICR_BASE_GVA		((volatile void *)GICR_BASE_GPA)

#define MIN_SGI			0
#define MIN_PPI			16
#define MIN_SPI			32
@@ -21,8 +30,7 @@ enum gic_type {
#define INTID_IS_PPI(intid)	(MIN_PPI <= (intid) && (intid) < MIN_SPI)
#define INTID_IS_SPI(intid)	(MIN_SPI <= (intid) && (intid) <= MAX_SPI)

void gic_init(enum gic_type type, unsigned int nr_cpus,
		void *dist_base, void *redist_base);
void gic_init(enum gic_type type, unsigned int nr_cpus);
void gic_irq_enable(unsigned int intid);
void gic_irq_disable(unsigned int intid);
unsigned int gic_get_and_ack_irq(void);
Loading