diff options
Diffstat (limited to 'firmware/target/sh/system-target.h')
-rw-r--r-- | firmware/target/sh/system-target.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/firmware/target/sh/system-target.h b/firmware/target/sh/system-target.h index 7fb8fecb6b..d641076694 100644 --- a/firmware/target/sh/system-target.h +++ b/firmware/target/sh/system-target.h | |||
@@ -52,11 +52,29 @@ static inline int set_irq_level(int level) | |||
52 | { | 52 | { |
53 | int i; | 53 | int i; |
54 | /* Read the old level and set the new one */ | 54 | /* Read the old level and set the new one */ |
55 | asm volatile ("stc sr, %0" : "=r" (i)); | 55 | |
56 | /* Not volatile - will be optimized away if the return value isn't used */ | ||
57 | asm ("stc sr, %0" : "=r" (i)); | ||
56 | asm volatile ("ldc %0, sr" : : "r" (level)); | 58 | asm volatile ("ldc %0, sr" : : "r" (level)); |
57 | return i; | 59 | return i; |
58 | } | 60 | } |
59 | 61 | ||
62 | static inline void enable_irq(void) | ||
63 | { | ||
64 | int i; | ||
65 | asm volatile ("mov %1, %0 \n" /* Save a constant load from RAM */ | ||
66 | "ldc %0, sr \n" : "=&r"(i) : "i"(0)); | ||
67 | } | ||
68 | |||
69 | #define disable_irq() \ | ||
70 | ((void)set_irq_level(HIGHEST_IRQ_LEVEL)) | ||
71 | |||
72 | #define disable_irq_save() \ | ||
73 | set_irq_level(HIGHEST_IRQ_LEVEL) | ||
74 | |||
75 | #define restore_irq(i) \ | ||
76 | ((void)set_irq_level(i)) | ||
77 | |||
60 | static inline uint16_t swap16(uint16_t value) | 78 | static inline uint16_t swap16(uint16_t value) |
61 | /* | 79 | /* |
62 | result[15..8] = value[ 7..0]; | 80 | result[15..8] = value[ 7..0]; |