summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-04-24 11:06:41 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-04-24 11:06:41 +0000
commitcb9d09c80a3f9ae1c0f2094613d8b26add18bf0a (patch)
treec4f6e79dcd822702a5022d4f8982f5ae45a563a1
parentc602d3f39a3833a9b26e8f1f874c0c180d2f544a (diff)
downloadrockbox-cb9d09c80a3f9ae1c0f2094613d8b26add18bf0a.tar.gz
rockbox-cb9d09c80a3f9ae1c0f2094613d8b26add18bf0a.zip
Protected the temporary register in the context switches
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@210 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/thread.c62
1 files changed, 33 insertions, 29 deletions
diff --git a/firmware/thread.c b/firmware/thread.c
index 97e2d2173e..9d3f43afc2 100644
--- a/firmware/thread.c
+++ b/firmware/thread.c
@@ -46,20 +46,22 @@ static thread_t threads = {1, 0};
46 */ 46 */
47static inline void stctx(void* addr) 47static inline void stctx(void* addr)
48{ 48{
49 asm volatile ("mov.l r8, @(0, %0)\n\t" 49 unsigned int tmp;
50 "mov.l r9, @(4, %0)\n\t" 50
51 "mov.l r10, @(8, %0)\n\t" 51 asm volatile ("mov.l r8, @(0, %1)\n\t"
52 "mov.l r11, @(12, %0)\n\t" 52 "mov.l r9, @(4, %1)\n\t"
53 "mov.l r12, @(16, %0)\n\t" 53 "mov.l r10, @(8, %1)\n\t"
54 "mov.l r13, @(20, %0)\n\t" 54 "mov.l r11, @(12, %1)\n\t"
55 "mov.l r14, @(24, %0)\n\t" 55 "mov.l r12, @(16, %1)\n\t"
56 "mov.l r15, @(28, %0)\n\t" 56 "mov.l r13, @(20, %1)\n\t"
57 "stc sr, r0\n\t" 57 "mov.l r14, @(24, %1)\n\t"
58 "mov.l r0, @(32, %0)\n\t" 58 "mov.l r15, @(28, %1)\n\t"
59 "stc gbr, r0\n\t" 59 "stc sr, %0\n\t"
60 "mov.l r0, @(36, %0)\n\t" 60 "mov.l %0, @(32, %1)\n\t"
61 "sts pr, r0\n\t" 61 "stc gbr, %0\n\t"
62 "mov.l r0, @(40, %0)" :: "r" (addr)); 62 "mov.l %0, @(36, %1)\n\t"
63 "sts pr, %0\n\t"
64 "mov.l %0, @(40, %1)" : "=r&" (tmp) : "r" (addr));
63} 65}
64 66
65/*--------------------------------------------------------------------------- 67/*---------------------------------------------------------------------------
@@ -68,21 +70,23 @@ static inline void stctx(void* addr)
68 */ 70 */
69static inline void ldctx(void* addr) 71static inline void ldctx(void* addr)
70{ 72{
71 asm volatile ("mov.l @(0, %0), r8\n\t" 73 unsigned int tmp;
72 "mov.l @(4, %0), r9\n\t" 74
73 "mov.l @(8, %0), r10\n\t" 75 asm volatile ("mov.l @(0, %1), r8\n\t"
74 "mov.l @(12, %0), r11\n\t" 76 "mov.l @(4, %1), r9\n\t"
75 "mov.l @(16, %0), r12\n\t" 77 "mov.l @(8, %1), r10\n\t"
76 "mov.l @(20, %0), r13\n\t" 78 "mov.l @(12, %1), r11\n\t"
77 "mov.l @(24, %0), r14\n\t" 79 "mov.l @(16, %1), r12\n\t"
78 "mov.l @(28, %0), r15\n\t" 80 "mov.l @(20, %1), r13\n\t"
79 "mov.l @(32, %0), r0\n\t" 81 "mov.l @(24, %1), r14\n\t"
80 "ldc r0, sr\n\t" 82 "mov.l @(28, %1), r15\n\t"
81 "mov.l @(36, %0), r0\n\t" 83 "mov.l @(32, %1), r0\n\t"
82 "ldc r0, gbr\n\t" 84 "ldc %0, sr\n\t"
83 "mov.l @(40, %0), r0\n\t" 85 "mov.l @(36, %1), %0\n\t"
84 "lds r0, pr\n\t" 86 "ldc %0, gbr\n\t"
85 "mov.l r0, @(0, r15)" :: "r" (addr)); 87 "mov.l @(40, %1), %0\n\t"
88 "lds %0, pr\n\t"
89 "mov.l %0, @(0, r15)" : "=r&" (tmp) : "r" (addr));
86} 90}
87 91
88/*--------------------------------------------------------------------------- 92/*---------------------------------------------------------------------------