diff options
author | Alan Korr <alkorr@rockbox.org> | 2002-04-25 12:23:37 +0000 |
---|---|---|
committer | Alan Korr <alkorr@rockbox.org> | 2002-04-25 12:23:37 +0000 |
commit | a6aff80b8a1da926aa753d54947b765721a9bcbb (patch) | |
tree | d1e52a5ad4d76b57d3206bf97f5e0bc45a64df71 /firmware/thread.c | |
parent | cfae0749156c7987495b688d045edd0ab60f8935 (diff) | |
download | rockbox-a6aff80b8a1da926aa753d54947b765721a9bcbb.tar.gz rockbox-a6aff80b8a1da926aa753d54947b765721a9bcbb.zip |
well there was a big bug (read more carefully the instruction descriptions) ;)
you can find why commented in the source
i'll fix it, but not test it
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@226 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/thread.c')
-rw-r--r-- | firmware/thread.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/firmware/thread.c b/firmware/thread.c index e3116fbeb5..402f2123fe 100644 --- a/firmware/thread.c +++ b/firmware/thread.c | |||
@@ -25,7 +25,9 @@ typedef union | |||
25 | unsigned int r[7]; /* Registers r8 thru r14 */ | 25 | unsigned int r[7]; /* Registers r8 thru r14 */ |
26 | void *sp; /* Stack pointer (r15) */ | 26 | void *sp; /* Stack pointer (r15) */ |
27 | unsigned int sr; /* Status register */ | 27 | unsigned int sr; /* Status register */ |
28 | #if 0 | ||
28 | void* gbr; /* Global base register */ | 29 | void* gbr; /* Global base register */ |
30 | #endif | ||
29 | void* pr; /* Procedure register */ | 31 | void* pr; /* Procedure register */ |
30 | } regs; | 32 | } regs; |
31 | unsigned int mem[32]; | 33 | unsigned int mem[32]; |
@@ -47,7 +49,33 @@ static thread_t threads = {1, 0}; | |||
47 | static inline void stctx(void* addr) | 49 | static inline void stctx(void* addr) |
48 | { | 50 | { |
49 | unsigned int tmp; | 51 | unsigned int tmp; |
50 | 52 | ||
53 | /* | ||
54 | [Alkorr] sorry, this code is totally wrong. | ||
55 | |||
56 | Why ? | ||
57 | |||
58 | "mov.l %0,@(imm,%1)" | ||
59 | |||
60 | must be interpreted as : | ||
61 | |||
62 | "%0 = ((long *)%1)[imm]" | ||
63 | |||
64 | not as : | ||
65 | |||
66 | "%0 = *((long *)(((char *)%1) + imm))" | ||
67 | |||
68 | real offset = "imm" x 1 if byte access (.b) | ||
69 | = "imm" x 2 if 16-bit word access (.w) | ||
70 | = "imm" x 4 if 32-bit word access (.l) | ||
71 | |||
72 | Don't forget, SH doesn't like misaligned address, so | ||
73 | remember it doesn't make any sense to have an odd | ||
74 | offset ;). | ||
75 | |||
76 | */ | ||
77 | |||
78 | #if 0 | ||
51 | asm volatile ("mov.l r8, @(0, %1)\n\t" | 79 | asm volatile ("mov.l r8, @(0, %1)\n\t" |
52 | "mov.l r9, @(4, %1)\n\t" | 80 | "mov.l r9, @(4, %1)\n\t" |
53 | "mov.l r10, @(8, %1)\n\t" | 81 | "mov.l r10, @(8, %1)\n\t" |
@@ -64,6 +92,34 @@ static inline void stctx(void* addr) | |||
64 | "mov.l %0, @(4, %1)\n\t" | 92 | "mov.l %0, @(4, %1)\n\t" |
65 | "sts pr, %0\n\t" | 93 | "sts pr, %0\n\t" |
66 | "mov.l %0, @(8, %1)" : "=r&" (tmp) : "r" (addr)); | 94 | "mov.l %0, @(8, %1)" : "=r&" (tmp) : "r" (addr)); |
95 | #endif | ||
96 | #if 0 | ||
97 | /* here the right code */ | ||
98 | asm volatile ("mov.l r8, @(0,%1)\n\t" | ||
99 | "mov.l r9, @(1,%1)\n\t" | ||
100 | "mov.l r10, @(2,%1)\n\t" | ||
101 | "mov.l r11, @(3,%1)\n\t" | ||
102 | "mov.l r12, @(4,%1)\n\t" | ||
103 | "mov.l r13, @(5,%1)\n\t" | ||
104 | "mov.l r14, @(6,%1)\n\t" | ||
105 | "mov.l r15, @(7,%1)\n\t" | ||
106 | "stc.l sr, %0\n\t" | ||
107 | "mov.l %0, @(8,%1)\n\t" | ||
108 | "sts pr, %0\n\t" | ||
109 | "mov.l %0, @(9,%1)" : "=r&" (tmp) : "r" (addr)); | ||
110 | #endif | ||
111 | /* here a far better code */ | ||
112 | asm volatile ("sts.l pr, @-%0\n\t" | ||
113 | "stc.l sr, @-%0\n\t" | ||
114 | "mov.l r15, @-%0\n\t" | ||
115 | "mov.l r14, @-%0\n\t" | ||
116 | "mov.l r13, @-%0\n\t" | ||
117 | "mov.l r12, @-%0\n\t" | ||
118 | "mov.l r11, @-%0\n\t" | ||
119 | "mov.l r10, @-%0\n\t" | ||
120 | "mov.l r9, @-%0\n\t" | ||
121 | "mov.l r8, @-%0" : : "r" (addr+4*10)); | ||
122 | |||
67 | } | 123 | } |
68 | 124 | ||
69 | /*--------------------------------------------------------------------------- | 125 | /*--------------------------------------------------------------------------- |
@@ -74,6 +130,9 @@ static inline void ldctx(void* addr) | |||
74 | { | 130 | { |
75 | unsigned int tmp; | 131 | unsigned int tmp; |
76 | 132 | ||
133 | /* same remarks than above */ | ||
134 | |||
135 | #if 0 | ||
77 | asm volatile ("mov.l @(0, %1), r8\n\t" | 136 | asm volatile ("mov.l @(0, %1), r8\n\t" |
78 | "mov.l @(4, %1), r9\n\t" | 137 | "mov.l @(4, %1), r9\n\t" |
79 | "mov.l @(8, %1), r10\n\t" | 138 | "mov.l @(8, %1), r10\n\t" |
@@ -91,6 +150,19 @@ static inline void ldctx(void* addr) | |||
91 | "mov.l @(8, %1), %0\n\t" | 150 | "mov.l @(8, %1), %0\n\t" |
92 | "lds %0, pr\n\t" | 151 | "lds %0, pr\n\t" |
93 | "mov.l %0, @(0, r15)" : "=r&" (tmp) : "r" (addr)); | 152 | "mov.l %0, @(0, r15)" : "=r&" (tmp) : "r" (addr)); |
153 | #endif | ||
154 | asm volatile ("mov.l @%0+,r8\n\t" | ||
155 | "mov.l @%0+,r9\n\t" | ||
156 | "mov.l @%0+,r10\n\t" | ||
157 | "mov.l @%0+,r11\n\t" | ||
158 | "mov.l @%0+,r12\n\t" | ||
159 | "mov.l @%0+,r13\n\t" | ||
160 | "mov.l @%0+,r14\n\t" | ||
161 | "mov.l @%0+,r15\n\t" | ||
162 | "lds.l @%0+,pr\n\t" | ||
163 | "ldc.l @%0+,sr" | ||
164 | : : "r" (addr)); | ||
165 | |||
94 | } | 166 | } |
95 | 167 | ||
96 | /*--------------------------------------------------------------------------- | 168 | /*--------------------------------------------------------------------------- |