diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/thread.c | 62 |
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 | */ |
47 | static inline void stctx(void* addr) | 47 | static 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 | */ |
69 | static inline void ldctx(void* addr) | 71 | static 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 | /*--------------------------------------------------------------------------- |