diff options
Diffstat (limited to 'firmware/target/coldfire/system-target.h')
-rw-r--r-- | firmware/target/coldfire/system-target.h | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/firmware/target/coldfire/system-target.h b/firmware/target/coldfire/system-target.h index 8e3a2a3d5a..14b3207c0c 100644 --- a/firmware/target/coldfire/system-target.h +++ b/firmware/target/coldfire/system-target.h | |||
@@ -81,13 +81,54 @@ static inline int set_irq_level(int level) | |||
81 | { | 81 | { |
82 | int oldlevel; | 82 | int oldlevel; |
83 | /* Read the old level and set the new one */ | 83 | /* Read the old level and set the new one */ |
84 | asm volatile ("move.w %%sr, %0 \n" | 84 | |
85 | "bset.l #13, %1 \n" /* Keep supervisor state set */ | 85 | /* Not volatile - can be removed if oldlevel isn't used */ |
86 | "move.w %1, %%sr \n" | 86 | asm ("move.w %%sr, %0" : "=d"(oldlevel)); |
87 | : "=d"(oldlevel), "+d"(level)); | 87 | /* Keep supervisor state set */ |
88 | asm volatile ("move.w %0, %%sr \n" : : "d"(level | 0x2000)); | ||
89 | return oldlevel; | ||
90 | } | ||
91 | |||
92 | /* Enable all interrupts */ | ||
93 | static inline void enable_irq(void) | ||
94 | { | ||
95 | int tmp; | ||
96 | /* Using move.w over the compiler's move.l saves 2 bytes per instance */ | ||
97 | asm volatile ("move.w %1, %0 \n" | ||
98 | "move.w %0, %%sr \n" | ||
99 | : "=&d"(tmp) : "i"(0x2000)); | ||
100 | } | ||
101 | |||
102 | /* Disable interrupts up to HIGHEST_IRQ_LEVEL */ | ||
103 | static inline void disable_irq(void) | ||
104 | { | ||
105 | int tmp; | ||
106 | /* Using move.w over the compiler's move.l saves 2 bytes per instance */ | ||
107 | asm volatile ("move.w %1, %0 \n" | ||
108 | "move.w %0, %%sr \n" | ||
109 | : "=&d"(tmp) | ||
110 | : "i"(0x2000 | HIGHEST_IRQ_LEVEL)); | ||
111 | } | ||
112 | |||
113 | static inline int disable_irq_save(void) | ||
114 | { | ||
115 | int oldlevel, tmp; | ||
116 | /* Using move.w over the compiler's move.l saves 2 bytes per instance */ | ||
117 | asm volatile ("move.w %%sr, %1 \n" | ||
118 | "move.w %2, %0 \n" | ||
119 | "move.w %0, %%sr \n" | ||
120 | : "=&d"(tmp), "=d"(oldlevel) | ||
121 | : "i"(0x2000 | HIGHEST_IRQ_LEVEL)); | ||
88 | return oldlevel; | 122 | return oldlevel; |
89 | } | 123 | } |
90 | 124 | ||
125 | static inline void restore_irq(int oldlevel) | ||
126 | { | ||
127 | /* Restore the sr value returned by disable_irq_save or | ||
128 | * set_irq_level */ | ||
129 | asm volatile ("move.w %0, %%sr" : : "d"(oldlevel)); | ||
130 | } | ||
131 | |||
91 | static inline uint16_t swap16(uint16_t value) | 132 | static inline uint16_t swap16(uint16_t value) |
92 | /* | 133 | /* |
93 | result[15..8] = value[ 7..0]; | 134 | result[15..8] = value[ 7..0]; |