diff options
Diffstat (limited to 'firmware/export/system.h')
-rw-r--r-- | firmware/export/system.h | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h index 01d2f130d3..5886145d7b 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h | |||
@@ -23,6 +23,10 @@ | |||
23 | #include "sh7034.h" | 23 | #include "sh7034.h" |
24 | #include "config.h" | 24 | #include "config.h" |
25 | 25 | ||
26 | extern void system_reboot (void); | ||
27 | extern void system_init(void); | ||
28 | extern int set_irq_level(int level); | ||
29 | |||
26 | #define FREQ CPU_FREQ | 30 | #define FREQ CPU_FREQ |
27 | #define BAUDRATE 9600 | 31 | #define BAUDRATE 9600 |
28 | 32 | ||
@@ -113,47 +117,34 @@ static inline int tas (volatile int *pointer) | |||
113 | return result; | 117 | return result; |
114 | } | 118 | } |
115 | 119 | ||
116 | static inline void sti (void) | ||
117 | { | ||
118 | asm volatile ("ldc\t%0,sr" : : "r"(0<<4)); | ||
119 | } | ||
120 | |||
121 | static inline void cli (void) | ||
122 | { | ||
123 | asm volatile ("ldc\t%0,sr" : : "r"(15<<4)); | ||
124 | } | ||
125 | |||
126 | /* Compare And Swap */ | 120 | /* Compare And Swap */ |
127 | static inline int cas (volatile int *pointer,int requested_value,int new_value) | 121 | static inline int cas (volatile int *pointer,int requested_value,int new_value) |
128 | { | 122 | { |
129 | cli(); | 123 | unsigned int oldlevel = set_irq_level(15); |
130 | if (*pointer == requested_value) | 124 | if (*pointer == requested_value) |
131 | { | 125 | { |
132 | *pointer = new_value; | 126 | *pointer = new_value; |
133 | sti (); | 127 | set_irq_level(oldlevel); |
134 | return 1; | 128 | return 1; |
135 | } | 129 | } |
136 | sti (); | 130 | set_irq_level(oldlevel); |
137 | return 0; | 131 | return 0; |
138 | } | 132 | } |
139 | 133 | ||
140 | static inline int cas2 (volatile int *pointer1,volatile int *pointer2,int requested_value1,int requested_value2,int new_value1,int new_value2) | 134 | static inline int cas2 (volatile int *pointer1,volatile int *pointer2,int requested_value1,int requested_value2,int new_value1,int new_value2) |
141 | { | 135 | { |
142 | cli(); | 136 | unsigned int oldlevel = set_irq_level(15); |
143 | if (*pointer1 == requested_value1 && *pointer2 == requested_value2) | 137 | if (*pointer1 == requested_value1 && *pointer2 == requested_value2) |
144 | { | 138 | { |
145 | *pointer1 = new_value1; | 139 | *pointer1 = new_value1; |
146 | *pointer2 = new_value2; | 140 | *pointer2 = new_value2; |
147 | sti (); | 141 | set_irq_level(oldlevel); |
148 | return 1; | 142 | return 1; |
149 | } | 143 | } |
150 | sti (); | 144 | set_irq_level(oldlevel); |
151 | return 0; | 145 | return 0; |
152 | } | 146 | } |
153 | 147 | ||
154 | #endif | 148 | #endif |
155 | 149 | ||
156 | extern void system_reboot (void); | ||
157 | extern void system_init(void); | ||
158 | |||
159 | #endif | 150 | #endif |