diff mbox

[RFC,04/11] arm/arm64: Add IPI test

Message ID 1456492533-17171-5-git-send-email-alex.bennee@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Alex Bennée Feb. 26, 2016, 1:15 p.m. UTC
From: Andrew Jones <drjones@redhat.com>

Signed-off-by: Andrew Jones <drjones@redhat.com>
[ajb: slight tweak to .mak file]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 arm/ipi-test.c               | 58 ++++++++++++++++++++++++++++++++++++++++++++
 config/config-arm-common.mak |  2 ++
 2 files changed, 60 insertions(+)
 create mode 100644 arm/ipi-test.c
diff mbox

Patch

diff --git a/arm/ipi-test.c b/arm/ipi-test.c
new file mode 100644
index 0000000..705295f
--- /dev/null
+++ b/arm/ipi-test.c
@@ -0,0 +1,58 @@ 
+/*
+ * Test sending an IPI and handling IRQ exceptions.
+ *
+ * Copyright (C) 2015, Red Hat Inc, Andrew Jones <drjones@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+#include <libcflat.h>
+#include <asm/setup.h>
+#include <asm/processor.h>
+#include <asm/gic.h>
+#include <asm/smp.h>
+#include <asm/barrier.h>
+
+static volatile bool ready, acked, done;
+
+static void irq_handler(struct pt_regs *regs __unused)
+{
+	gic_irq_ack();
+	acked = true;
+}
+
+static void ipi_test(void)
+{
+	gic_enable();
+#ifdef __arm__
+	install_exception_handler(EXCPTN_IRQ, irq_handler);
+#else
+	install_irq_handler(EL1H_IRQ, irq_handler);
+#endif
+	local_irq_enable();
+	ready = true;
+	wfi();
+	report("IPI", acked);
+	done = true;
+	halt();
+}
+
+int main(void)
+{
+	if (nr_cpus < 2) {
+		printf("ipi-test requires '-smp 2'\n");
+		abort();
+	}
+
+	gic_enable();
+	smp_boot_secondary(1, ipi_test);
+
+	while (!ready)
+		cpu_relax();
+
+	gic_send_sgi(1, 1);
+
+	while (!done)
+		cpu_relax();
+
+	return report_summary();
+}
diff --git a/config/config-arm-common.mak b/config/config-arm-common.mak
index e037507..d90eccc 100644
--- a/config/config-arm-common.mak
+++ b/config/config-arm-common.mak
@@ -11,6 +11,7 @@  endif
 
 tests-common = $(TEST_DIR)/selftest.flat
 tests-common += $(TEST_DIR)/spinlock-test.flat
+tests-common += $(TEST_DIR)/ipi-test.flat
 
 all: test_cases
 
@@ -69,3 +70,4 @@  test_cases: $(generated_files) $(tests-common) $(tests)
 
 $(TEST_DIR)/selftest.elf: $(cstart.o) $(TEST_DIR)/selftest.o
 $(TEST_DIR)/spinlock-test.elf: $(cstart.o) $(TEST_DIR)/spinlock-test.o
+$(TEST_DIR)/ipi-test.elf: $(cstart.o) $(TEST_DIR)/ipi-test.o