|
|
@ -129,8 +129,25 @@ struct xcptcontext |
|
|
|
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__ |
|
|
|
#ifndef __ASSEMBLY__ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Get/set the primask register */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline uint8_t getprimask(void) __attribute__((always_inline)); |
|
|
|
|
|
|
|
static inline uint8_t getprimask(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
uint32_t primask; |
|
|
|
|
|
|
|
__asm__ __volatile__ |
|
|
|
|
|
|
|
( |
|
|
|
|
|
|
|
"\tmrs %0, primask\n" |
|
|
|
|
|
|
|
: "=r" (primask) |
|
|
|
|
|
|
|
: |
|
|
|
|
|
|
|
: "memory"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (uint8_t)primask; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Disable IRQs */ |
|
|
|
/* Disable IRQs */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void irqdisable(void) __attribute__((always_inline)); |
|
|
|
static inline void irqdisable(void) |
|
|
|
static inline void irqdisable(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ ("\tcpsid i\n"); |
|
|
|
__asm__ __volatile__ ("\tcpsid i\n"); |
|
|
@ -138,26 +155,22 @@ static inline void irqdisable(void) |
|
|
|
|
|
|
|
|
|
|
|
/* Save the current primask state & disable IRQs */ |
|
|
|
/* Save the current primask state & disable IRQs */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline irqstate_t irqsave(void) __attribute__((always_inline)); |
|
|
|
static inline irqstate_t irqsave(void) |
|
|
|
static inline irqstate_t irqsave(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
unsigned short primask; |
|
|
|
/* Return the current value of primask register (before disabling) */ |
|
|
|
|
|
|
|
|
|
|
|
/* Return the current value of primask register and set
|
|
|
|
uint8_t primask = getprimask(); |
|
|
|
* bit 0 of the primask register to disable interrupts |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__asm__ __volatile__ |
|
|
|
/* Then set bit 0 of the primask register to disable interrupts */ |
|
|
|
( |
|
|
|
|
|
|
|
"\tmrs %0, primask\n" |
|
|
|
irqdisable(); |
|
|
|
"\tcpsid i\n" |
|
|
|
|
|
|
|
: "=r" (primask) |
|
|
|
|
|
|
|
: |
|
|
|
|
|
|
|
: "memory"); |
|
|
|
|
|
|
|
return primask; |
|
|
|
return primask; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Enable IRQs */ |
|
|
|
/* Enable IRQs */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void irqenable(void) __attribute__((always_inline)); |
|
|
|
static inline void irqenable(void) |
|
|
|
static inline void irqenable(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ ("\tcpsie i\n"); |
|
|
|
__asm__ __volatile__ ("\tcpsie i\n"); |
|
|
@ -165,61 +178,48 @@ static inline void irqenable(void) |
|
|
|
|
|
|
|
|
|
|
|
/* Restore saved primask state */ |
|
|
|
/* Restore saved primask state */ |
|
|
|
|
|
|
|
|
|
|
|
static inline void irqrestore(irqstate_t primask) |
|
|
|
static inline void setprimask(uint32_t primask) __attribute__((always_inline)); |
|
|
|
|
|
|
|
static inline void setprimask(uint32_t primask) |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* If bit 0 of the primask is 0, then we need to restore
|
|
|
|
|
|
|
|
* interupts. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__asm__ __volatile__ |
|
|
|
__asm__ __volatile__ |
|
|
|
( |
|
|
|
( |
|
|
|
"\ttst %0, #1\n" |
|
|
|
"\tmsr primask, %0\n" |
|
|
|
"\tbne 1f\n" |
|
|
|
|
|
|
|
"\tcpsie i\n" |
|
|
|
|
|
|
|
"1:\n" |
|
|
|
|
|
|
|
: |
|
|
|
: |
|
|
|
: "r" (primask) |
|
|
|
: "r" (primask) |
|
|
|
: "memory"); |
|
|
|
: "memory"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Get/set the primask register */ |
|
|
|
static inline void irqrestore(irqstate_t primask) __attribute__((always_inline)); |
|
|
|
|
|
|
|
static inline void irqrestore(irqstate_t primask) |
|
|
|
static inline uint8_t getprimask(void) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
uint32_t primask; |
|
|
|
/* If bit 0 of the primask is 0, then we need to restore
|
|
|
|
__asm__ __volatile__ |
|
|
|
* interrupts. |
|
|
|
( |
|
|
|
*/ |
|
|
|
"\tmrs %0, primask\n" |
|
|
|
|
|
|
|
: "=r" (primask) |
|
|
|
|
|
|
|
: |
|
|
|
|
|
|
|
: "memory"); |
|
|
|
|
|
|
|
return (uint8_t)primask; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void setprimask(uint32_t primask) |
|
|
|
if ((primask & 1) == 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ |
|
|
|
setprimask(primask); |
|
|
|
( |
|
|
|
} |
|
|
|
"\tmsr primask, %0\n" |
|
|
|
|
|
|
|
: |
|
|
|
|
|
|
|
: "r" (primask) |
|
|
|
|
|
|
|
: "memory"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Get/set the basepri register */ |
|
|
|
/* Get/set the basepri register */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline uint8_t getbasepri(void) __attribute__((always_inline)); |
|
|
|
static inline uint8_t getbasepri(void) |
|
|
|
static inline uint8_t getbasepri(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint32_t basepri; |
|
|
|
uint32_t basepri; |
|
|
|
|
|
|
|
|
|
|
|
__asm__ __volatile__ |
|
|
|
__asm__ __volatile__ |
|
|
|
( |
|
|
|
( |
|
|
|
"\tmrs %0, basepri\n" |
|
|
|
"\tmrs %0, basepri\n" |
|
|
|
: "=r" (basepri) |
|
|
|
: "=r" (basepri) |
|
|
|
: |
|
|
|
: |
|
|
|
: "memory"); |
|
|
|
: "memory"); |
|
|
|
|
|
|
|
|
|
|
|
return (uint8_t)basepri; |
|
|
|
return (uint8_t)basepri; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void setbasepri(uint32_t basepri) __attribute__((always_inline)); |
|
|
|
static inline void setbasepri(uint32_t basepri) |
|
|
|
static inline void setbasepri(uint32_t basepri) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ |
|
|
|
__asm__ __volatile__ |
|
|
@ -232,6 +232,7 @@ static inline void setbasepri(uint32_t basepri) |
|
|
|
|
|
|
|
|
|
|
|
/* Get/set IPSR */ |
|
|
|
/* Get/set IPSR */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline uint32_t getipsr(void) __attribute__((always_inline)); |
|
|
|
static inline uint32_t getipsr(void) |
|
|
|
static inline uint32_t getipsr(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint32_t ipsr; |
|
|
|
uint32_t ipsr; |
|
|
@ -241,9 +242,11 @@ static inline uint32_t getipsr(void) |
|
|
|
: "=r" (ipsr) |
|
|
|
: "=r" (ipsr) |
|
|
|
: |
|
|
|
: |
|
|
|
: "memory"); |
|
|
|
: "memory"); |
|
|
|
|
|
|
|
|
|
|
|
return ipsr; |
|
|
|
return ipsr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void setipsr(uint32_t ipsr) __attribute__((always_inline)); |
|
|
|
static inline void setipsr(uint32_t ipsr) |
|
|
|
static inline void setipsr(uint32_t ipsr) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ |
|
|
|
__asm__ __volatile__ |
|
|
@ -256,6 +259,7 @@ static inline void setipsr(uint32_t ipsr) |
|
|
|
|
|
|
|
|
|
|
|
/* Get/set CONTROL */ |
|
|
|
/* Get/set CONTROL */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline uint32_t getcontrol(void) __attribute__((always_inline)); |
|
|
|
static inline uint32_t getcontrol(void) |
|
|
|
static inline uint32_t getcontrol(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint32_t control; |
|
|
|
uint32_t control; |
|
|
@ -265,9 +269,11 @@ static inline uint32_t getcontrol(void) |
|
|
|
: "=r" (control) |
|
|
|
: "=r" (control) |
|
|
|
: |
|
|
|
: |
|
|
|
: "memory"); |
|
|
|
: "memory"); |
|
|
|
|
|
|
|
|
|
|
|
return control; |
|
|
|
return control; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void setcontrol(uint32_t control) __attribute__((always_inline)); |
|
|
|
static inline void setcontrol(uint32_t control) |
|
|
|
static inline void setcontrol(uint32_t control) |
|
|
|
{ |
|
|
|
{ |
|
|
|
__asm__ __volatile__ |
|
|
|
__asm__ __volatile__ |
|
|
|