[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 05/12] arm/sdei: add support to trigger event by GIC interrup
From: |
Heyi Guo |
Subject: |
[RFC PATCH 05/12] arm/sdei: add support to trigger event by GIC interrupt ID |
Date: |
Tue, 24 Sep 2019 23:21:44 +0800 |
Add an external interface to trigger an SDEI event bound to an
interrupt by providing GIC interrupt ID.
Signed-off-by: Heyi Guo <address@hidden>
Cc: Peter Maydell <address@hidden>
Cc: Dave Martin <address@hidden>
Cc: Marc Zyngier <address@hidden>
Cc: Mark Rutland <address@hidden>
Cc: James Morse <address@hidden>
---
target/arm/sdei.c | 38 ++++++++++++++++++++++++++++++++++++++
target/arm/sdei.h | 7 +++++++
2 files changed, 45 insertions(+)
diff --git a/target/arm/sdei.c b/target/arm/sdei.c
index f9a1208..088ed76 100644
--- a/target/arm/sdei.c
+++ b/target/arm/sdei.c
@@ -453,6 +453,29 @@ static int64_t sdei_version(QemuSDEState *s, CPUState *cs,
struct kvm_run *run)
(0ULL << SDEI_VERSION_MINOR_SHIFT);
}
+static bool inject_event(QemuSDEState *s, CPUState *cs,
+ int32_t event, int irq)
+{
+ QemuSDE *sde;
+
+ if (event < 0) {
+ return false;
+ }
+ sde = get_sde_no_check(s, event, cs);
+ if (sde->event_id == SDEI_INVALID_EVENT_ID) {
+ put_sde(sde, cs);
+ return false;
+ }
+ if (irq > 0 && sde->prop->interrupt != irq) {
+ /* Someone unbinds the interrupt! */
+ put_sde(sde, cs);
+ return false;
+ }
+ sde->pending = true;
+ dispatch_single(s, sde, cs);
+ return true;
+}
+
static int64_t unregister_single_sde(QemuSDEState *s, int32_t event,
CPUState *cs, bool force)
{
@@ -1033,6 +1056,21 @@ void sdei_handle_request(CPUState *cs, struct kvm_run
*run)
}
}
+bool trigger_sdei_by_irq(int cpu, int irq)
+{
+ QemuSDEState *s = sde_state;
+
+ if (!s || irq >= ARRAY_SIZE(s->irq_map)) {
+ return false;
+ }
+
+ if (s->irq_map[irq] == SDEI_INVALID_EVENT_ID) {
+ return false;
+ }
+
+ return inject_event(s, arm_get_cpu_by_id(cpu), s->irq_map[irq], irq);
+}
+
static void qemu_shared_sde_init(QemuSDEState *s)
{
int i;
diff --git a/target/arm/sdei.h b/target/arm/sdei.h
index a69a0e4..a61e788 100644
--- a/target/arm/sdei.h
+++ b/target/arm/sdei.h
@@ -31,4 +31,11 @@
void sdei_handle_request(CPUState *cs, struct kvm_run *run);
+/*
+ * Trigger an SDEI event bound to an interrupt.
+ * Return true if event has been triggered successfully.
+ * Return false if event has not been triggered for some reason.
+ */
+bool trigger_sdei_by_irq(int cpu, int irq);
+
#endif
--
1.8.3.1
- [RFC PATCH 01/12] linux-headers: import arm_sdei.h, (continued)
- [RFC PATCH 01/12] linux-headers: import arm_sdei.h, Heyi Guo, 2019/09/24
- [RFC PATCH 10/12] arm/sdei: check KVM cap and enable SDEI, Heyi Guo, 2019/09/24
- [RFC PATCH 04/12] arm/sdei: add system reset callback, Heyi Guo, 2019/09/24
- [RFC PATCH 06/12] core/irq: add qemu_irq_remove_intercept interface, Heyi Guo, 2019/09/24
- [RFC PATCH 02/12] arm/sdei: add virtual device framework, Heyi Guo, 2019/09/24
- [RFC PATCH 07/12] arm/sdei: override qemu_irq handler when binding interrupt, Heyi Guo, 2019/09/24
- [RFC PATCH 03/12] arm/sdei: add support to handle SDEI requests from guest, Heyi Guo, 2019/09/24
- [RFC PATCH 05/12] arm/sdei: add support to trigger event by GIC interrupt ID,
Heyi Guo <=
- [RFC PATCH 09/12] linux-headers/kvm.h: add capability to forward hypercall, Heyi Guo, 2019/09/24
- [RFC PATCH 08/12] arm/sdei: add support to register interrupt bind notifier, Heyi Guo, 2019/09/24
- [RFC PATCH 11/12] arm/kvm: handle guest exit of hypercall, Heyi Guo, 2019/09/24
- [RFC PATCH 12/12] virt/acpi: add SDEI table if SDEI is enabled, Heyi Guo, 2019/09/24
- Re: [RFC PATCH 00/12] Add SDEI support for arm64, no-reply, 2019/09/25
- Re: [RFC PATCH 00/12] Add SDEI support for arm64, no-reply, 2019/09/25
- Re: [RFC PATCH 00/12] Add SDEI support for arm64, Peter Maydell, 2019/09/30