Skip to content

Commit

Permalink
Improve ATOMIC_BLOCK on ARM with -Os and gcc 11
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulStoffregen committed Sep 18, 2022
1 parent 87e374f commit 90a2414
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions RHutil/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,34 +19,40 @@
#ifndef _CORTEX_M3_ATOMIC_H_
#define _CORTEX_M3_ATOMIC_H_

static __inline__ uint32_t __get_primask(void) __attribute__((always_inline));
static __inline__ uint32_t __get_primask(void) \
{ uint32_t primask = 0; \
__asm__ volatile ("MRS %[result], PRIMASK\n\t":[result]"=r"(primask)::); \
return primask; } // returns 0 if interrupts enabled, 1 if disabled

static __inline__ void __set_primask(uint32_t setval) __attribute__((always_inline));
static __inline__ void __set_primask(uint32_t setval) \
{ __asm__ volatile ("MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]"r"(setval):);
__asm__ volatile ("" ::: "memory");}

static __inline__ uint32_t __iSeiRetVal(void) __attribute__((always_inline));
static __inline__ uint32_t __iSeiRetVal(void) \
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); return 1; }

static __inline__ uint32_t __iCliRetVal(void) __attribute__((always_inline));
static __inline__ uint32_t __iCliRetVal(void) \
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); return 1; }

static __inline__ void __iSeiParam(const uint32_t *__s) __attribute__((always_inline));
static __inline__ void __iSeiParam(const uint32_t *__s) \
{ __asm__ volatile ("CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); (void)__s; }

static __inline__ void __iCliParam(const uint32_t *__s) __attribute__((always_inline));
static __inline__ void __iCliParam(const uint32_t *__s) \
{ __asm__ volatile ("CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); (void)__s; }

static __inline__ void __iRestore(const uint32_t *__s) __attribute__((always_inline));
static __inline__ void __iRestore(const uint32_t *__s) \
{ __set_primask(*__s); __asm__ volatile ("dmb\n\t""dsb\n\t""isb\n\t"); \
__asm__ volatile ("" ::: "memory"); }
{ __set_primask(*__s); __asm__ volatile ("" ::: "memory"); }


#define ATOMIC_BLOCK(type) \
Expand Down

0 comments on commit 90a2414

Please sign in to comment.