48,11 → 48,18 |
#define EXC_IRQ_VEC 0x18 |
#define EXC_FIQ_VEC 0x1c |
|
/* Exception numbers */ |
#define EXC_RESET 0 |
#define EXC_UNDEF_INSTR 1 |
#define EXC_SWI 2 |
#define EXC_PREFETCH_ABORT 3 |
#define EXC_DATA_ABORT 4 |
#define EXC_IRQ 5 |
#define EXC_FIQ 6 |
|
|
|
typedef struct { |
|
uint32_t cpsr; |
uint32_t retaddr; |
|
uint32_t r0; |
uint32_t r1; |
uint32_t r2; |
68,24 → 75,26 |
uint32_t sp; |
uint32_t lr; |
|
uint32_t spsr; |
} istate_t; |
|
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->retaddr = retaddr; |
istate->lr = retaddr; |
} |
|
/** Return true if exception happened while in userspace */ |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return !(istate->retaddr & 0x80000000); |
return !(istate->lr & 0x80000000); |
return 0; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->retaddr; |
return istate->lr; |
} |
|
|
extern void setup_exception_stacks(void); |
extern void install_exception_handlers(void); |
extern void exception_init(void); |
|