summaryrefslogtreecommitdiff
path: root/firmware/export/system.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/export/system.h')
-rw-r--r--firmware/export/system.h29
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
26extern void system_reboot (void);
27extern void system_init(void);
28extern 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
116static inline void sti (void)
117 {
118 asm volatile ("ldc\t%0,sr" : : "r"(0<<4));
119 }
120
121static 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 */
127static inline int cas (volatile int *pointer,int requested_value,int new_value) 121static 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
140static inline int cas2 (volatile int *pointer1,volatile int *pointer2,int requested_value1,int requested_value2,int new_value1,int new_value2) 134static 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
156extern void system_reboot (void);
157extern void system_init(void);
158
159#endif 150#endif