diff options
-rw-r--r-- | firmware/export/system.h | 52 |
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) |
87 | static inline int set_irq_level(int level) | 90 | static 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 */ | ||
133 | static 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 */ | ||
141 | static 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 | |||
154 | static 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. */ |
169 | int system_memory_guard(int newmode); | 136 | int 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) | ||
148 | static 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 |