summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Korr <alkorr@rockbox.org>2002-04-25 12:23:37 +0000
committerAlan Korr <alkorr@rockbox.org>2002-04-25 12:23:37 +0000
commita6aff80b8a1da926aa753d54947b765721a9bcbb (patch)
treed1e52a5ad4d76b57d3206bf97f5e0bc45a64df71
parentcfae0749156c7987495b688d045edd0ab60f8935 (diff)
downloadrockbox-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
-rw-r--r--firmware/thread.c74
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};
47static inline void stctx(void* addr) 49static 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/*---------------------------------------------------------------------------