diff -r 23d2d8defa03 -r af75fc1fe0fc patches/linux/2.6.8/140-linux-2.6.8-m68k-kludge.patch --- a/patches/linux/2.6.8/140-linux-2.6.8-m68k-kludge.patch Fri Sep 05 16:15:34 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,285 +0,0 @@ -[ This patch not accepted into kernel for now - it touches the core too much - - but it's ok for crosstool since we just want to check whether toolchain is ok, - I think. I had to rediff the sched.h changes with -U5 to get them to - apply properly -- patch got confused with just three lines of context?! -dank ] - -Date: Sun, 5 Sep 2004 12:41:08 +0200 (CEST) -From: Geert Uytterhoeven -Sender: geert@linux-m68k.org -To: Dan Kegel -cc: Roman Zippel , - Matthias Urlichs , - Linux Kernel Mailing List , - Linux/m68k -Subject: Re: Getting kernel.org kernel to build for m68k? -In-Reply-To: -Message-ID: - -On Wed, 1 Sep 2004, Geert Uytterhoeven wrote: -> On Tue, 31 Aug 2004, Dan Kegel wrote: -> > I noticed today that Linus's m68k kernel can't be built (at least with gcc-3.4.1). -> > -> > The first problem I ran into, -> > CC arch/m68k/kernel/asm-offsets.s -> > In file included from include/linux/spinlock.h:12, -> > from include/linux/capability.h:45, -> > from include/linux/sched.h:7, -> > from arch/m68k/kernel/asm-offsets.c:12: -> > include/linux/thread_info.h:30: error: parse error before '{' token -> > is solved already in the m68k tree. -> > (In particular, -> > the #ifndef __HAVE_THREAD_FUNCTIONS ... #endif in -> > http://linux-m68k-cvs.apia.dhs.org/c/cvsweb/linux/include/linux/thread_info.h?rev=1.5;content-type=text%2Fplain -> > probably solves it.) -> > There are other problems after that. -> -> Roman Zippel changed the threading stuff on m68k. Since it would affect other -> architectures, I never submitted it on my own. -> -> In short, we never really compile this code, since the m68k tree doesn't use it -> anymore. And yes, it even fails with older compiler versions, like 2.95.2. - -The second part doesn't seem to be true: the code is used. And it does compile -after applying the fixes below, even with gcc 3.4.1. - -> > Any chance you could spend a bit of time sending Linus enough -> > patches for his kernel to build for m68k, if not run? -> -> I'll make sure a plain kernel.org kernel can build an m68k kernel. - -The patch below makes the plain kernel.org 2.6.8.1 compile for m68k, -using gcc 2.95.2 or 3.3.3 (3.4.1 needs a few more changes in random -places). The resulting kernel (I booted the gcc 2.95.2 case) works fine on my -Amiga. - -It's more or less the patch created by Matthias Urlichs last year, so -the credits are his: - -| This change implements a reasonable compromise between the task_info->flags -| variable in other ports, which is too much work in the syscall path on m68k, -| and moving the whole structure to thread_struct, which is way too intrusive -| on other ports. - -The patch does affect generic code a bit, but the collateral damage is -kept to a minimum. - -We can still keep Roman's thread info abstractions[*] in Linux/m68k CVS, but -I'd really like the plain kernel.org kernel to be in a working state as well. -That way more people may do cross-compile tests for m68k. - -Hence if no one objects, I'll submit the patch to Andrew and Linus. - -All comments are welcome! - ---- linux-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-04-28 15:48:59.000000000 +0200 -+++ linux-m68k-2.6.8.1/arch/m68k/kernel/asm-offsets.c 2004-09-05 12:04:00.000000000 +0200 -@@ -31,6 +31,7 @@ int main(void) - DEFINE(TASK_SIGPENDING, offsetof(struct task_struct, thread.work.sigpending)); - DEFINE(TASK_NOTIFY_RESUME, offsetof(struct task_struct, thread.work.notify_resume)); - DEFINE(TASK_THREAD, offsetof(struct task_struct, thread)); -+ DEFINE(TASK_TINFO, offsetof(struct task_struct, thread_info)); - DEFINE(TASK_MM, offsetof(struct task_struct, mm)); - DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm)); - -@@ -45,6 +46,9 @@ int main(void) - DEFINE(THREAD_FPCNTL, offsetof(struct thread_struct, fpcntl)); - DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fpstate)); - -+ /* offsets into the thread_info struct */ -+ DEFINE(TINFO_PREEMPT, offsetof(struct thread_info, preempt_count)); -+ - /* offsets into the pt_regs */ - DEFINE(PT_D0, offsetof(struct pt_regs, d0)); - DEFINE(PT_ORIG_D0, offsetof(struct pt_regs, orig_d0)); ---- linux-2.6.8.1/arch/m68k/kernel/entry.S 2004-05-24 11:13:22.000000000 +0200 -+++ linux-m68k-2.6.8.1/arch/m68k/kernel/entry.S 2004-09-02 20:13:12.000000000 +0200 -@@ -134,13 +134,13 @@ ENTRY(system_call) - - syscall_exit_work: - btst #5,%sp@(PT_SR) | check if returning to kernel -- bnes 1b | if so, skip resched, signals -+ bnes 1b | if so, skip everything - tstw %d0 -- jeq do_signal_return -+ jeq do_signal_return | jump if only sig_pending or notify_resume - tstb %d0 -- jne do_delayed_trace -+ jne do_delayed_trace | jump if delayed_trace - -- pea resume_userspace -+ pea resume_userspace | need_resched is set - jmp schedule - - ret_from_exception: -@@ -223,10 +223,14 @@ ENTRY(nmi_handler) - */ - inthandler: - SAVE_ALL_INT -- GET_CURRENT(%d0) -- addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) -- | put exception # in d0 -- bfextu %sp@(PT_VECTOR){#4,#10},%d0 -+ /* GET_CURRENT(%d0) */ -+ movel %sp,%d0 -+ andw #-THREAD_SIZE,%d0 -+ movel %d0,%a1 -+ addqb #1,%a1@(TINFO_PREEMPT+2) -+ movel %a1@,%curptr -+ -+ bfextu %sp@(PT_VECTOR){#4,#10},%d0 | put exception # in d0 - - movel %sp,%sp@- - movel %d0,%sp@- | put vector # on stack -@@ -243,7 +247,8 @@ inthandler: - 3: addql #8,%sp | pop parameters off stack - - ret_from_interrupt: -- subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+2) -+ movel %curptr@(TASK_TINFO),%a1 -+ subqb #1,%a1@(TINFO_PREEMPT+2) - jeq 1f - 2: - RESTORE_ALL ---- linux-2.6.8.1/include/asm-m68k/processor.h 2004-04-28 15:49:03.000000000 +0200 -+++ linux-m68k-2.6.8.1/include/asm-m68k/processor.h 2004-09-02 20:29:32.000000000 +0200 -@@ -84,7 +84,6 @@ struct thread_struct { - ksp: sizeof(init_stack) + (unsigned long) init_stack, \ - sr: PS_S, \ - fs: __KERNEL_DS, \ -- info: INIT_THREAD_INFO(init_task) \ - } - - /* ---- linux-2.6.8.1/include/asm-m68k/thread_info.h 2004-05-24 11:13:53.000000000 +0200 -+++ linux-m68k-2.6.8.1/include/asm-m68k/thread_info.h 2004-09-05 12:19:47.000000000 +0200 -@@ -6,7 +6,7 @@ - #include - - struct thread_info { -- struct task_struct *task; /* main task structure */ -+ struct task_struct *task; /* main task structure, must be first! */ - struct exec_domain *exec_domain; /* execution domain */ - __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ - __u32 cpu; /* should always be 0 on m68k */ -@@ -21,7 +21,8 @@ struct thread_info { - { \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ -- .restart_block = { \ -+ .preempt_count = 1, \ -+ .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ - } -@@ -35,10 +36,11 @@ struct thread_info { - #define free_thread_info(ti) free_pages((unsigned long)(ti),1) - #endif /* PAGE_SHIFT == 13 */ - --//#define init_thread_info (init_task.thread.info) -+#define init_thread_info (init_thread_union.thread_info) - #define init_stack (init_thread_union.stack) - --#define current_thread_info() (current->thread_info) -+register __u32 current_thread_info_reg asm("sp"); -+#define current_thread_info() ((struct thread_info *)(current_thread_info_reg & ~0x1fff)) - - - #define __HAVE_THREAD_FUNCTIONS -@@ -91,8 +93,12 @@ extern int thread_flag_fixme(void); - }) - - #define __get_set_tsk_thread_flag(tsk, flag, val) ({ \ -- int __res = __get_tsk_thread_flag(tsk, flag); \ -+ int __res; \ -+ unsigned long __flags; \ -+ local_irq_save(__flags); \ -+ __res = __get_tsk_thread_flag(tsk, flag); \ - __set_tsk_thread_flag(tsk, flag, val); \ -+ local_irq_restore(__flags); \ - __res; \ - }) - -@@ -105,7 +111,4 @@ extern int thread_flag_fixme(void); - #define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag) - #define test_thread_flag(flag) test_tsk_thread_flag(current, flag) - --#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) --#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) -- - #endif /* _ASM_M68K_THREAD_INFO_H */ ---- linux-2.6.8/include/linux/sched.h.old 2004-09-13 21:48:58.000000000 -0700 -+++ linux-2.6.8/include/linux/sched.h 2004-09-13 21:50:26.000000000 -0700 -@@ -975,10 +975,11 @@ - task_unlock(task); - - return mm; - } - -+#ifndef __HAVE_THREAD_FUNCTIONS - - /* set thread flags in other task's structures - * - see asm/thread_info.h for TIF_xxxx flags available - */ - static inline void set_tsk_thread_flag(struct task_struct *tsk, int flag) -@@ -1004,10 +1005,12 @@ - static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag) - { - return test_ti_thread_flag(tsk->thread_info,flag); - } - -+#endif /* __HAVE_THREAD_FUNCTIONS */ -+ - static inline void set_tsk_need_resched(struct task_struct *tsk) - { - set_tsk_thread_flag(tsk,TIF_NEED_RESCHED); - } - ---- linux-2.6.8.1/include/linux/thread_info.h 2004-04-27 20:42:22.000000000 +0200 -+++ linux-m68k-2.6.8.1/include/linux/thread_info.h 2004-09-04 21:24:36.000000000 +0200 -@@ -21,6 +21,7 @@ extern long do_no_restart_syscall(struct - #include - - #ifdef __KERNEL__ -+#ifndef __HAVE_THREAD_FUNCTIONS - - /* - * flag set/clear/test wrappers -@@ -77,16 +78,11 @@ static inline int test_ti_thread_flag(st - return test_bit(flag,&ti->flags); - } - --static inline void set_need_resched(void) --{ -- set_thread_flag(TIF_NEED_RESCHED); --} -+#endif /* __HAVE_THREAD_FUNCTIONS */ - --static inline void clear_need_resched(void) --{ -- clear_thread_flag(TIF_NEED_RESCHED); --} -+#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) -+#define clear_need_resched(void) clear_thread_flag(TIF_NEED_RESCHED) - --#endif -+#endif /* __KERNEL__ */ - - #endif /* _LINUX_THREAD_INFO_H */ - -Gr{oetje,eeting}s, - - Geert - -[*] For reference: - - http://linux-m68k-cvs.ubb.ca/~geert/linux-m68k-2.6.x-merging/POSTPONED/156-thread_info.diff - --- -Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org - -In personal conversations with technical people, I call myself a hacker. But -when I'm talking to journalists I just say "programmer" or something like that. - -- Linus Torvalds - - -