[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT RFC PATCH 4/5] plat/common: Add a trap function to handle Arm64 irq trap



From: Wei Chen <wei.chen@xxxxxxx>

Change-Id: I3652599f8385fc67a29ab2d9e67861590c0f9f6c
Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
---
 plat/common/arm/traps.c   | 27 +++++++++++++++++++++++++++
 plat/kvm/arm/exceptions.S | 10 +++++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/plat/common/arm/traps.c b/plat/common/arm/traps.c
index d80be6c..ec6944f 100644
--- a/plat/common/arm/traps.c
+++ b/plat/common/arm/traps.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <uk/print.h>
 #include <uk/assert.h>
+#include <arm/gic-v2.h>

 static const char *exception_modes[]= {
        "Synchronous Abort",
@@ -69,3 +70,29 @@ void trap_el1_sync(struct __regs *regs, uint64_t far)
        dump_registers(regs, far);
        ukplat_crash();
 }
+
+void trap_el1_irq(struct __regs *regs, uint64_t far)
+{
+       uint32_t stat, irq;
+
+       do {
+               stat = gic_ack_irq();
+               irq = stat & GICC_IAR_INTID_MASK;
+
+               uk_printd(DLVL_CRIT, "Unikraft: EL1 IRQ#%d trap caught\n", irq);
+
+               /*
+                * TODO: Hanle IPI&SGI interrupts here
+                */
+               if (irq < GIC_MAX_IRQ) {
+                       gic_eoi_irq(stat);
+                       isb();
+                       _ukplat_irq_handle((unsigned long)irq);
+                       continue;
+               }
+
+               break;
+       } while (1);
+
+       ukplat_crash();
+}
diff --git a/plat/kvm/arm/exceptions.S b/plat/kvm/arm/exceptions.S
index af039d8..194cd03 100644
--- a/plat/kvm/arm/exceptions.S
+++ b/plat/kvm/arm/exceptions.S
@@ -119,6 +119,14 @@ el1_sync:
        bl trap_el1_sync
        LEAVE_TRAP 1

+.align 6
+el1_irq:
+       ENTER_TRAP 1
+       msr daifclr, #4
+       mov x0, sp
+       bl trap_el1_irq
+       LEAVE_TRAP 1
+
 /* Bad Abort numbers */
 #define BAD_SYNC  0
 #define BAD_IRQ   1
@@ -169,7 +177,7 @@ ENTRY(vector_table)

        /* Current Exception level with SP_EL1 */
        vector_entry el1_sync           /* Synchronous EL1h       */
-       vector_entry el1_irq_invalid    /* IRQ EL1h               */
+       vector_entry el1_irq            /* IRQ EL1h               */
        vector_entry el1_fiq_invalid    /* FIQ EL1h               */
        vector_entry el1_error_invalid  /* Error EL1h             */

--
2.7.4

IMPORTANT NOTICE: The contents of this email and any attachments are 
confidential and may also be privileged. If you are not the intended recipient, 
please notify the sender immediately and do not disclose the contents to any 
other person, use it for any purpose, or store or copy the information in any 
medium. Thank you.

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.