patches/linux/2.6.8/linux-2.6.8-m68k-kludge.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
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