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