diff options
Diffstat (limited to 'firmware/target/arm/system-arm.h')
-rw-r--r-- | firmware/target/arm/system-arm.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/firmware/target/arm/system-arm.h b/firmware/target/arm/system-arm.h index 7f10a30bdb..b3630a8473 100644 --- a/firmware/target/arm/system-arm.h +++ b/firmware/target/arm/system-arm.h | |||
@@ -62,6 +62,21 @@ void __div0(void); | |||
62 | #define enable_fiq() \ | 62 | #define enable_fiq() \ |
63 | enable_interrupt(FIQ_STATUS) | 63 | enable_interrupt(FIQ_STATUS) |
64 | 64 | ||
65 | #define irq_enabled() \ | ||
66 | interrupt_enabled(IRQ_STATUS) | ||
67 | #define fiq_enabled() \ | ||
68 | interrupt_enabled(FIQ_STATUS) | ||
69 | #define ints_enabled() \ | ||
70 | interrupt_enabled(IRQ_FIQ_STATUS) | ||
71 | |||
72 | #define irq_enabled_checkval(val) \ | ||
73 | (((val) & IRQ_STATUS) == 0) | ||
74 | #define fiq_enabled_checkval(val) \ | ||
75 | (((val) & FIQ_STATUS) == 0) | ||
76 | #define ints_enabled_checkval(val) \ | ||
77 | (((val) & IRQ_FIQ_STATUS) == 0) | ||
78 | |||
79 | |||
65 | /* Core-level interrupt masking */ | 80 | /* Core-level interrupt masking */ |
66 | 81 | ||
67 | static inline int set_interrupt_status(int status, int mask) | 82 | static inline int set_interrupt_status(int status, int mask) |
@@ -87,6 +102,13 @@ static inline void restore_interrupt(int cpsr) | |||
87 | asm volatile ("msr cpsr_c, %0" : : "r"(cpsr)); | 102 | asm volatile ("msr cpsr_c, %0" : : "r"(cpsr)); |
88 | } | 103 | } |
89 | 104 | ||
105 | static inline bool interrupt_enabled(int status) | ||
106 | { | ||
107 | unsigned long cpsr; | ||
108 | asm ("mrs %0, cpsr" : "=r"(cpsr)); | ||
109 | return (cpsr & status) == 0; | ||
110 | } | ||
111 | |||
90 | /* ARM_ARCH version section for architecture*/ | 112 | /* ARM_ARCH version section for architecture*/ |
91 | 113 | ||
92 | #if ARM_ARCH >= 6 | 114 | #if ARM_ARCH >= 6 |