yann@1
|
1 |
[ This patch not accepted into kernel for now - it touches the core too much -
|
yann@1
|
2 |
but it's ok for crosstool since we just want to check whether toolchain is ok,
|
yann@1
|
3 |
I think. I had to rediff the sched.h changes with -U5 to get them to
|
yann@1
|
4 |
apply properly -- patch got confused with just three lines of context?! -dank ]
|
yann@1
|
5 |
|
yann@1
|
6 |
Date: Sun, 5 Sep 2004 12:41:08 +0200 (CEST)
|
yann@1
|
7 |
From: Geert Uytterhoeven <geert@linux-m68k.org>
|
yann@1
|
8 |
Sender: geert@linux-m68k.org
|
yann@1
|
9 |
To: Dan Kegel <dank@kegel.com>
|
yann@1
|
10 |
cc: Roman Zippel <zippel@linux-m68k.org>,
|
yann@1
|
11 |
Matthias Urlichs <smurf@smurf.noris.de>,
|
yann@1
|
12 |
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
|
yann@1
|
13 |
Linux/m68k <linux-m68k@lists.linux-m68k.org>
|
yann@1
|
14 |
Subject: Re: Getting kernel.org kernel to build for m68k?
|
yann@1
|
15 |
In-Reply-To: <Pine.GSO.4.58.0409011029390.15681@waterleaf.sonytel.be>
|
yann@1
|
16 |
Message-ID: <Pine.LNX.4.58.0409051224020.30282@anakin>
|
yann@1
|
17 |
|
yann@1
|
18 |
On Wed, 1 Sep 2004, Geert Uytterhoeven wrote:
|
yann@1
|
19 |
> On Tue, 31 Aug 2004, Dan Kegel wrote:
|
yann@1
|
20 |
> > I noticed today that Linus's m68k kernel can't be built (at least with gcc-3.4.1).
|
yann@1
|
21 |
> >
|
yann@1
|
22 |
> > The first problem I ran into,
|
yann@1
|
23 |
> > CC arch/m68k/kernel/asm-offsets.s
|
yann@1
|
24 |
> > In file included from include/linux/spinlock.h:12,
|
yann@1
|
25 |
> > from include/linux/capability.h:45,
|
yann@1
|
26 |
> > from include/linux/sched.h:7,
|
yann@1
|
27 |
> > from arch/m68k/kernel/asm-offsets.c:12:
|
yann@1
|
28 |
> > include/linux/thread_info.h:30: error: parse error before '{' token
|
yann@1
|
29 |
> > is solved already in the m68k tree.
|
yann@1
|
30 |
> > (In particular,
|
yann@1
|
31 |
> > the #ifndef __HAVE_THREAD_FUNCTIONS ... #endif in
|
yann@1
|
32 |
> > http://linux-m68k-cvs.apia.dhs.org/c/cvsweb/linux/include/linux/thread_info.h?rev=1.5;content-type=text%2Fplain
|
yann@1
|
33 |
> > probably solves it.)
|
yann@1
|
34 |
> > There are other problems after that.
|
yann@1
|
35 |
>
|
yann@1
|
36 |
> Roman Zippel changed the threading stuff on m68k. Since it would affect other
|
yann@1
|
37 |
> architectures, I never submitted it on my own.
|
yann@1
|
38 |
>
|
yann@1
|
39 |
> In short, we never really compile this code, since the m68k tree doesn't use it
|
yann@1
|
40 |
> anymore. And yes, it even fails with older compiler versions, like 2.95.2.
|
yann@1
|
41 |
|
yann@1
|
42 |
The second part doesn't seem to be true: the code is used. And it does compile
|
yann@1
|
43 |
after applying the fixes below, even with gcc 3.4.1.
|
yann@1
|
44 |
|
yann@1
|
45 |
> > Any chance you could spend a bit of time sending Linus enough
|
yann@1
|
46 |
> > patches for his kernel to build for m68k, if not run?
|
yann@1
|
47 |
>
|
yann@1
|
48 |
> I'll make sure a plain kernel.org kernel can build an m68k kernel.
|
yann@1
|
49 |
|
yann@1
|
50 |
The patch below makes the plain kernel.org 2.6.8.1 compile for m68k,
|
yann@1
|
51 |
using gcc 2.95.2 or 3.3.3 (3.4.1 needs a few more changes in random
|
yann@1
|
52 |
places). The resulting kernel (I booted the gcc 2.95.2 case) works fine on my
|
yann@1
|
53 |
Amiga.
|
yann@1
|
54 |
|
yann@1
|
55 |
It's more or less the patch created by Matthias Urlichs last year, so
|
yann@1
|
56 |
the credits are his:
|
yann@1
|
57 |
|
yann@1
|
58 |
| This change implements a reasonable compromise between the task_info->flags
|
yann@1
|
59 |
| variable in other ports, which is too much work in the syscall path on m68k,
|
yann@1
|
60 |
| and moving the whole structure to thread_struct, which is way too intrusive
|
yann@1
|
61 |
| on other ports.
|
yann@1
|
62 |
|
yann@1
|
63 |
The patch does affect generic code a bit, but the collateral damage is
|
yann@1
|
64 |
kept to a minimum.
|
yann@1
|
65 |
|
yann@1
|
66 |
We can still keep Roman's thread info abstractions[*] in Linux/m68k CVS, but
|
yann@1
|
67 |
I'd really like the plain kernel.org kernel to be in a working state as well.
|
yann@1
|
68 |
That way more people may do cross-compile tests for m68k.
|
yann@1
|
69 |
|
yann@1
|
70 |
Hence if no one objects, I'll submit the patch to Andrew and Linus.
|
yann@1
|
71 |
|
yann@1
|
72 |
All comments are welcome!
|
yann@1
|
73 |
|
yann@1
|
74 |
--- linux-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-04-28 15:48:59.000000000 +0200
|
yann@1
|
75 |
+++ linux-m68k-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-09-05 12:04:00.000000000 +0200
|
yann@1
|
76 |
@@ -31,6 +31,7 @@ int main(void)
|
yann@1
|
77 |
DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending));
|
yann@1
|
78 |
DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume));
|
yann@1
|
79 |
DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
|
yann@1
|
80 |
+ DEFINE(TASK_TINFO, offsetof(struct task_struct, thread_info));
|
yann@1
|
81 |
DEFINE(TASK_MM, offsetof(struct task_struct, mm));
|
yann@1
|
82 |
DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
|
yann@1
|
83 |
|
yann@1
|
84 |
@@ -45,6 +46,9 @@ int main(void)
|
yann@1
|
85 |
DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl));
|
yann@1
|
86 |
DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate));
|
yann@1
|
87 |
|
yann@1
|
88 |
+ /* offsets into the thread_info struct */
|
yann@1
|
89 |
+ DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count));
|
yann@1
|
90 |
+
|
yann@1
|
91 |
/* offsets into the pt_regs */
|
yann@1
|
92 |
DEFINE(PT_D0, offsetof(struct pt_regs, d0));
|
yann@1
|
93 |
DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0));
|
yann@1
|
94 |
--- linux-2.6.8.1/arch/m68k/kernel/entry.S 2004-05-24 11:13:22.000000000 +0200
|
yann@1
|
95 |
+++ linux-m68k-2.6.8.1/arch/m68k/kernel/entry.S 2004-09-02 20:13:12.000000000 +0200
|
yann@1
|
96 |
@@ -134,13 +134,13 @@ ENTRY(system_call)
|
yann@1
|
97 |
|
yann@1
|
98 |
syscall_exit_work:
|
yann@1
|
99 |
btst #5,%sp@(PT_SR) | check if returning to kernel
|
yann@1
|
100 |
- bnes 1b | if so, skip resched, signals
|
yann@1
|
101 |
+ bnes 1b | if so, skip everything
|
yann@1
|
102 |
tstw %d0
|
yann@1
|
103 |
- jeq do_signal_return
|
yann@1
|
104 |
+ jeq do_signal_return | jump if only sig_pending or notify_resume
|
yann@1
|
105 |
tstb %d0
|
yann@1
|
106 |
- jne do_delayed_trace
|
yann@1
|
107 |
+ jne do_delayed_trace | jump if delayed_trace
|
yann@1
|
108 |
|
yann@1
|
109 |
- pea resume_userspace
|
yann@1
|
110 |
+ pea resume_userspace | need_resched is set
|
yann@1
|
111 |
jmp schedule
|
yann@1
|
112 |
|
yann@1
|
113 |
ret_from_exception:
|
yann@1
|
114 |
@@ -223,10 +223,14 @@ ENTRY(nmi_handler)
|
yann@1
|
115 |
*/
|
yann@1
|
116 |
inthandler:
|
yann@1
|
117 |
SAVE_ALL_INT
|
yann@1
|
118 |
- GET_CURRENT(%d0)
|
yann@1
|
119 |
- addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2)
|
yann@1
|
120 |
- | put exception # in d0
|
yann@1
|
121 |
- bfextu %sp@(PT_VECTOR){#4,#10},%d0
|
yann@1
|
122 |
+ /* GET_CURRENT(%d0) */
|
yann@1
|
123 |
+ movel %sp,%d0
|
yann@1
|
124 |
+ andw #-THREAD_SIZE,%d0
|
yann@1
|
125 |
+ movel %d0,%a1
|
yann@1
|
126 |
+ addqb #1,%a1@(TINFO_PREEMPT+2)
|
yann@1
|
127 |
+ movel %a1@,%curptr
|
yann@1
|
128 |
+
|
yann@1
|
129 |
+ bfextu %sp@(PT_VECTOR){#4,#10},%d0 | put exception # in d0
|
yann@1
|
130 |
|
yann@1
|
131 |
movel %sp,%sp@-
|
yann@1
|
132 |
movel %d0,%sp@- | put vector # on stack
|
yann@1
|
133 |
@@ -243,7 +247,8 @@ inthandler:
|
yann@1
|
134 |
3: addql #8,%sp | pop parameters off stack
|
yann@1
|
135 |
|
yann@1
|
136 |
ret_from_interrupt:
|
yann@1
|
137 |
- subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2)
|
yann@1
|
138 |
+ movel %curptr@(TASK_TINFO),%a1
|
yann@1
|
139 |
+ subqb #1,%a1@(TINFO_PREEMPT+2)
|
yann@1
|
140 |
jeq 1f
|
yann@1
|
141 |
2:
|
yann@1
|
142 |
RESTORE_ALL
|
yann@1
|
143 |
--- linux-2.6.8.1/include/asm-m68k/processor.h 2004-04-28 15:49:03.000000000 +0200
|
yann@1
|
144 |
+++ linux-m68k-2.6.8.1/include/asm-m68k/processor.h 2004-09-02 20:29:32.000000000 +0200
|
yann@1
|
145 |
@@ -84,7 +84,6 @@ struct thread_struct {
|
yann@1
|
146 |
ksp: sizeof(init_stack) + (unsigned long) init_stack, \
|
yann@1
|
147 |
sr: PS_S, \
|
yann@1
|
148 |
fs: __KERNEL_DS, \
|
yann@1
|
149 |
- info: INIT_THREAD_INFO(init_task) \
|
yann@1
|
150 |
}
|
yann@1
|
151 |
|
yann@1
|
152 |
/*
|
yann@1
|
153 |
--- linux-2.6.8.1/include/asm-m68k/thread_info.h 2004-05-24 11:13:53.000000000 +0200
|
yann@1
|
154 |
+++ linux-m68k-2.6.8.1/include/asm-m68k/thread_info.h 2004-09-05 12:19:47.000000000 +0200
|
yann@1
|
155 |
@@ -6,7 +6,7 @@
|
yann@1
|
156 |
#include <asm/page.h>
|
yann@1
|
157 |
|
yann@1
|
158 |
struct thread_info {
|
yann@1
|
159 |
- struct task_struct *task; /* main task structure */
|
yann@1
|
160 |
+ struct task_struct *task; /* main task structure, must be first! */
|
yann@1
|
161 |
struct exec_domain *exec_domain; /* execution domain */
|
yann@1
|
162 |
__s32 preempt_count; /* 0 => preemptable, <0 => BUG */
|
yann@1
|
163 |
__u32 cpu; /* should always be 0 on m68k */
|
yann@1
|
164 |
@@ -21,7 +21,8 @@ struct thread_info {
|
yann@1
|
165 |
{ \
|
yann@1
|
166 |
.task = &tsk, \
|
yann@1
|
167 |
.exec_domain = &default_exec_domain, \
|
yann@1
|
168 |
- .restart_block = { \
|
yann@1
|
169 |
+ .preempt_count = 1, \
|
yann@1
|
170 |
+ .restart_block = { \
|
yann@1
|
171 |
.fn = do_no_restart_syscall, \
|
yann@1
|
172 |
}, \
|
yann@1
|
173 |
}
|
yann@1
|
174 |
@@ -35,10 +36,11 @@ struct thread_info {
|
yann@1
|
175 |
#define free_thread_info(ti) free_pages((unsigned long)(ti),1)
|
yann@1
|
176 |
#endif /* PAGE_SHIFT == 13 */
|
yann@1
|
177 |
|
yann@1
|
178 |
-//#define init_thread_info (init_task.thread.info)
|
yann@1
|
179 |
+#define init_thread_info (init_thread_union.thread_info)
|
yann@1
|
180 |
#define init_stack (init_thread_union.stack)
|
yann@1
|
181 |
|
yann@1
|
182 |
-#define current_thread_info() (current->thread_info)
|
yann@1
|
183 |
+register __u32 current_thread_info_reg asm("sp");
|
yann@1
|
184 |
+#define current_thread_info() ((struct thread_info *)(current_thread_info_reg & ~0x1fff))
|
yann@1
|
185 |
|
yann@1
|
186 |
|
yann@1
|
187 |
#define __HAVE_THREAD_FUNCTIONS
|
yann@1
|
188 |
@@ -91,8 +93,12 @@ extern int thread_flag_fixme(void);
|
yann@1
|
189 |
})
|
yann@1
|
190 |
|
yann@1
|
191 |
#define __get_set_tsk_thread_flag(tsk, flag, val) ({ \
|
yann@1
|
192 |
- int __res = __get_tsk_thread_flag(tsk, flag); \
|
yann@1
|
193 |
+ int __res; \
|
yann@1
|
194 |
+ unsigned long __flags; \
|
yann@1
|
195 |
+ local_irq_save(__flags); \
|
yann@1
|
196 |
+ __res = __get_tsk_thread_flag(tsk, flag); \
|
yann@1
|
197 |
__set_tsk_thread_flag(tsk, flag, val); \
|
yann@1
|
198 |
+ local_irq_restore(__flags); \
|
yann@1
|
199 |
__res; \
|
yann@1
|
200 |
})
|
yann@1
|
201 |
|
yann@1
|
202 |
@@ -105,7 +111,4 @@ extern int thread_flag_fixme(void);
|
yann@1
|
203 |
#define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag)
|
yann@1
|
204 |
#define test_thread_flag(flag) test_tsk_thread_flag(current, flag)
|
yann@1
|
205 |
|
yann@1
|
206 |
-#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
|
yann@1
|
207 |
-#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED)
|
yann@1
|
208 |
-
|
yann@1
|
209 |
#endif /* _ASM_M68K_THREAD_INFO_H */
|
yann@1
|
210 |
--- linux-2.6.8/include/linux/sched.h.old 2004-09-13 21:48:58.000000000 -0700
|
yann@1
|
211 |
+++ linux-2.6.8/include/linux/sched.h 2004-09-13 21:50:26.000000000 -0700
|
yann@1
|
212 |
@@ -975,10 +975,11 @@
|
yann@1
|
213 |
task_unlock(task);
|
yann@1
|
214 |
|
yann@1
|
215 |
return mm;
|
yann@1
|
216 |
}
|
yann@1
|
217 |
|
yann@1
|
218 |
+#ifndef __HAVE_THREAD_FUNCTIONS
|
yann@1
|
219 |
|
yann@1
|
220 |
/* set thread flags in other task's structures
|
yann@1
|
221 |
* - see asm/thread_info.h for TIF_xxxx flags available
|
yann@1
|
222 |
*/
|
yann@1
|
223 |
static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag)
|
yann@1
|
224 |
@@ -1004,10 +1005,12 @@
|
yann@1
|
225 |
static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag)
|
yann@1
|
226 |
{
|
yann@1
|
227 |
return test_ti_thread_flag(tsk->thread_info,flag);
|
yann@1
|
228 |
}
|
yann@1
|
229 |
|
yann@1
|
230 |
+#endif /* __HAVE_THREAD_FUNCTIONS */
|
yann@1
|
231 |
+
|
yann@1
|
232 |
static inline void set_tsk_need_resched(struct task_struct *tsk)
|
yann@1
|
233 |
{
|
yann@1
|
234 |
set_tsk_thread_flag(tsk,TIF_NEED_RESCHED);
|
yann@1
|
235 |
}
|
yann@1
|
236 |
|
yann@1
|
237 |
--- linux-2.6.8.1/include/linux/thread_info.h 2004-04-27 20:42:22.000000000 +0200
|
yann@1
|
238 |
+++ linux-m68k-2.6.8.1/include/linux/thread_info.h 2004-09-04 21:24:36.000000000 +0200
|
yann@1
|
239 |
@@ -21,6 +21,7 @@ extern long do_no_restart_syscall(struct
|
yann@1
|
240 |
#include <asm/thread_info.h>
|
yann@1
|
241 |
|
yann@1
|
242 |
#ifdef __KERNEL__
|
yann@1
|
243 |
+#ifndef __HAVE_THREAD_FUNCTIONS
|
yann@1
|
244 |
|
yann@1
|
245 |
/*
|
yann@1
|
246 |
* flag set/clear/test wrappers
|
yann@1
|
247 |
@@ -77,16 +78,11 @@ static inline int test_ti_thread_flag(st
|
yann@1
|
248 |
return test_bit(flag,&ti->flags);
|
yann@1
|
249 |
}
|
yann@1
|
250 |
|
yann@1
|
251 |
-static inline void set_need_resched(void)
|
yann@1
|
252 |
-{
|
yann@1
|
253 |
- set_thread_flag(TIF_NEED_RESCHED);
|
yann@1
|
254 |
-}
|
yann@1
|
255 |
+#endif /* __HAVE_THREAD_FUNCTIONS */
|
yann@1
|
256 |
|
yann@1
|
257 |
-static inline void clear_need_resched(void)
|
yann@1
|
258 |
-{
|
yann@1
|
259 |
- clear_thread_flag(TIF_NEED_RESCHED);
|
yann@1
|
260 |
-}
|
yann@1
|
261 |
+#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED)
|
yann@1
|
262 |
+#define clear_need_resched(void) clear_thread_flag(TIF_NEED_RESCHED)
|
yann@1
|
263 |
|
yann@1
|
264 |
-#endif
|
yann@1
|
265 |
+#endif /* __KERNEL__ */
|
yann@1
|
266 |
|
yann@1
|
267 |
#endif /* _LINUX_THREAD_INFO_H */
|
yann@1
|
268 |
|
yann@1
|
269 |
Gr{oetje,eeting}s,
|
yann@1
|
270 |
|
yann@1
|
271 |
Geert
|
yann@1
|
272 |
|
yann@1
|
273 |
[*] For reference:
|
yann@1
|
274 |
|
yann@1
|
275 |
http://linux-m68k-cvs.ubb.ca/~geert/linux-m68k-2.6.x-merging/POSTPONED/156-thread_info.diff
|
yann@1
|
276 |
|
yann@1
|
277 |
--
|
yann@1
|
278 |
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
|
yann@1
|
279 |
|
yann@1
|
280 |
In personal conversations with technical people, I call myself a hacker. But
|
yann@1
|
281 |
when I'm talking to journalists I just say "programmer" or something like that.
|
yann@1
|
282 |
-- Linus Torvalds
|
yann@1
|
283 |
|
yann@1
|
284 |
|
yann@1
|
285 |
|