summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/export/system.h52
1 files changed, 16 insertions, 36 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h
index fc0b7506bc..7ac5c1d1d5 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -56,6 +56,7 @@ extern void system_init(void);
56#define I_CONSTRAINT "I" 56#define I_CONSTRAINT "I"
57#endif 57#endif
58 58
59#if CONFIG_CPU == SH7034
59#define or_b(mask, address) \ 60#define or_b(mask, address) \
60 asm \ 61 asm \
61 ("or.b\t%0,@(r0,gbr)" \ 62 ("or.b\t%0,@(r0,gbr)" \
@@ -76,6 +77,7 @@ extern void system_init(void);
76 : \ 77 : \
77 : /* %0 */ I_CONSTRAINT((char)(mask)), \ 78 : /* %0 */ I_CONSTRAINT((char)(mask)), \
78 /* %1 */ "z"(address-GBR)) 79 /* %1 */ "z"(address-GBR))
80#endif
79 81
80#ifndef SIMULATOR 82#ifndef SIMULATOR
81 83
@@ -83,6 +85,7 @@ extern void system_init(void);
83 * Interrupt level setting 85 * Interrupt level setting
84 * The level is left shifted 4 bits 86 * The level is left shifted 4 bits
85 ****************************************************************************/ 87 ****************************************************************************/
88#if CONFIG_CPU == SH7034
86#define HIGHEST_IRQ_LEVEL (15<<4) 89#define HIGHEST_IRQ_LEVEL (15<<4)
87static inline int set_irq_level(int level) 90static inline int set_irq_level(int level)
88{ 91{
@@ -129,42 +132,6 @@ static inline unsigned long SWAB32(unsigned long value)
129 return value; 132 return value;
130} 133}
131 134
132/* Test And Set - UNTESTED */
133static inline int tas (volatile int *pointer)
134 {
135 int result;
136 asm volatile ("tas.b\t@%1;movt\t%0" : "=t"(result) : "r"((char *)pointer) : "memory");
137 return result;
138 }
139
140/* Compare And Swap */
141static inline int cas (volatile int *pointer,int requested_value,int new_value)
142 {
143 unsigned int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
144 if (*pointer == requested_value)
145 {
146 *pointer = new_value;
147 set_irq_level(oldlevel);
148 return 1;
149 }
150 set_irq_level(oldlevel);
151 return 0;
152 }
153
154static inline int cas2 (volatile int *pointer1,volatile int *pointer2,int requested_value1,int requested_value2,int new_value1,int new_value2)
155 {
156 unsigned int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
157 if (*pointer1 == requested_value1 && *pointer2 == requested_value2)
158 {
159 *pointer1 = new_value1;
160 *pointer2 = new_value2;
161 set_irq_level(oldlevel);
162 return 1;
163 }
164 set_irq_level(oldlevel);
165 return 0;
166 }
167
168/* Utilize the user break controller to catch invalid memory accesses. */ 135/* Utilize the user break controller to catch invalid memory accesses. */
169int system_memory_guard(int newmode); 136int system_memory_guard(int newmode);
170 137
@@ -176,6 +143,19 @@ enum {
176 MAXMEMGUARD 143 MAXMEMGUARD
177}; 144};
178 145
146#elif CONFIG_CPU == MCF5249
147#define HIGHEST_IRQ_LEVEL (7<<8)
148static inline int set_irq_level(int level)
149{
150 int i;
151 /* Read the old level and set the new one */
152 asm volatile ("move.w %%sr,%0\n"
153 "or.l #0x2000,%1\n"
154 "move.w %1,%%sr\n" : "=r" (i) : "r" (level));
155 return i;
156}
157
158#endif
179#endif 159#endif
180 160
181#endif 161#endif