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

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



Hi,

> -----Original Message-----
> From: Julien Grall <julien.grall@xxxxxxx>
> Sent: Saturday, November 10, 2018 1:56 AM
> To: Jianyong Wu (Arm Technology China) <Jianyong.Wu@xxxxxxx>; minios-
> devel@xxxxxxxxxxxxxxxxxxxx; simon.kuenzer@xxxxxxxxx
> Cc: Kaly Xin (Arm Technology China) <Kaly.Xin@xxxxxxx>; nd
> <nd@xxxxxxx>; Wei Chen (Arm Technology China) <Wei.Chen@xxxxxxx>
> Subject: Re: [Minios-devel] [UNIKRAFT RFC PATCH 2/2] plat/common: Add a
> trap function to handle Arm64 irq trap
> 
> Hi,
> 
> On 09/11/2018 09:02, Jianyong Wu wrote:
> > 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
> > 43235be..257106b 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",
> > @@ -68,3 +69,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;
> > +           }
> 
> Looking again at this code, could you explain why you EOI the interrupt
> before handling it?

I just copy this from freebsd, but I don't know why. Do you know why bsd does 
that?
 
Bests
Jianyong wu
> 
> > +
> > +           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             */
> >
> >
> 
> Cheers,
> 
> --
> Julien Grall
_______________________________________________
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®.