aboutsummaryrefslogtreecommitdiffstats
path: root/ports/ARM7/chcore.h
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-08-25 13:00:11 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-08-25 13:00:11 +0000
commitb689f00e31591e2f3b5b3607b15be428dfeb7e88 (patch)
tree20ee57099be6cfcead74274f9ca49551dc26341f /ports/ARM7/chcore.h
parent5d40605546682121c1220d8e676d4d9bc760b785 (diff)
downloadChibiOS-b689f00e31591e2f3b5b3607b15be428dfeb7e88.tar.gz
ChibiOS-b689f00e31591e2f3b5b3607b15be428dfeb7e88.tar.bz2
ChibiOS-b689f00e31591e2f3b5b3607b15be428dfeb7e88.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@401 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'ports/ARM7/chcore.h')
-rw-r--r--ports/ARM7/chcore.h27
1 files changed, 23 insertions, 4 deletions
diff --git a/ports/ARM7/chcore.h b/ports/ARM7/chcore.h
index 4f8e187cc..557526863 100644
--- a/ports/ARM7/chcore.h
+++ b/ports/ARM7/chcore.h
@@ -79,14 +79,33 @@ typedef struct {
#ifdef __cplusplus
extern "C" {
#endif
- void chSysLock(void);
- void chSysUnlock(void);
+ uint32_t _lock(void);
+ void _unlock(uint32_t);
+ void _enable(void);
#ifdef __cplusplus
}
#endif
+#ifdef REENTRANT_LOCKS
+#define chSysLock() uint32_t ps = _lock()
+#define chSysUnlock() _unlock(ps)
+#else
+#define chSysLock() _lock()
+#define chSysUnlock() _enable()
+#endif /* !REENTRANT_LOCKS */
+#define chSysEnable() _enable()
#else /* !THUMB */
-#define chSysLock() asm("msr CPSR_c, #0x9F")
-#define chSysUnlock() asm("msr CPSR_c, #0x1F")
+#ifdef REENTRANT_LOCKS
+#define chSysLock() \
+ uint32_t ps; \
+ asm volatile ("mrs %0, CPSR" : "=r" (ps) : ); \
+ asm volatile ("msr CPSR_c, #0x9F");
+#define chSysUnlock() asm volatile ("msr CPSR_c, %0" : : "r" (ps))
+#define chSysEnable() asm volatile ("msr CPSR_c, #0x1F")
+#else
+#define chSysLock() asm volatile ("msr CPSR_c, #0x9F");
+#define chSysUnlock() asm volatile ("msr CPSR_c, #0x1F")
+#define chSysEnable() asm volatile ("msr CPSR_c, #0x1F")
+#endif /* !REENTRANT_LOCKS */
#endif /* THUMB */
#ifdef THUMB