summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire/system-target.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/coldfire/system-target.h')
-rw-r--r--firmware/target/coldfire/system-target.h49
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 */
93static 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 */
103static 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
113static 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
125static 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
91static inline uint16_t swap16(uint16_t value) 132static inline uint16_t swap16(uint16_t value)
92 /* 133 /*
93 result[15..8] = value[ 7..0]; 134 result[15..8] = value[ 7..0];