diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-08-25 13:00:11 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2008-08-25 13:00:11 +0000 |
commit | b689f00e31591e2f3b5b3607b15be428dfeb7e88 (patch) | |
tree | 20ee57099be6cfcead74274f9ca49551dc26341f /ports/ARM7 | |
parent | 5d40605546682121c1220d8e676d4d9bc760b785 (diff) | |
download | ChibiOS-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')
-rw-r--r-- | ports/ARM7/chcore.h | 27 | ||||
-rw-r--r-- | ports/ARM7/chsys.s | 20 |
2 files changed, 39 insertions, 8 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
diff --git a/ports/ARM7/chsys.s b/ports/ARM7/chsys.s index d1de7d100..8af9e4b4e 100644 --- a/ports/ARM7/chsys.s +++ b/ports/ARM7/chsys.s @@ -44,19 +44,31 @@ .balign 16
.code 16
.thumb_func
-.global chSysLock
-chSysLock:
+.global _lock
+_lock:
mov r0, pc
bx r0
.code 32
+ mrs r0, CPSR
msr CPSR_c, #MODE_SYS | I_BIT
bx lr
.balign 16
.code 16
.thumb_func
-.global chSysUnlock
-chSysUnlock:
+.global _unlock
+_unlock:
+ mov r1, pc
+ bx r1
+.code 32
+ msr CPSR_c, r0
+ bx lr
+
+.balign 16
+.code 16
+.thumb_func
+.global _enable
+_enable:
mov r0, pc
bx r0
.code 32
|