[Linux-ia64] Fix request_module from ia32 process

From: Andreas Schwab <schwab_at_suse.de>
Date: 2003-03-28 01:07:32
When an ia32 process triggers request_module the kernel cannot execute
modprobe because the kernel thread still has the ia32 address limits in
force.  I think a kernel thread should always have the ia64 address
limits, similar to what sys32_execve is doing.

Andreas.

--- linux-2.4.19/arch/ia64/kernel/process.c.~1~	2002-08-03 02:39:42.000000000 +0200
+++ linux-2.4.19/arch/ia64/kernel/process.c	2003-03-27 11:29:02.000000000 +0100
@@ -476,6 +476,15 @@ kernel_thread (int (*fn)(void *), void *
 
 	tid = clone(flags | CLONE_VM, 0);
 	if (parent != current) {
+#ifdef CONFIG_IA32_SUPPORT
+		if (IS_IA32_PROCESS(ia64_task_regs(current))) {
+			/* A kernel thread is always a 64-bit process. */
+			current->thread.map_base  = DEFAULT_MAP_BASE;
+			current->thread.task_size = DEFAULT_TASK_SIZE;
+			ia64_set_kr(IA64_KR_IO_BASE, current->thread.old_iob);
+			ia64_set_kr(IA64_KR_TSSD, current->thread.old_k1);
+		}
+#endif
 		result = (*fn)(arg);
 		_exit(result);
 	}

-- 
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, Deutschherrnstr. 15-19, D-90429 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Received on Thu Mar 27 06:07:44 2003

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:12 EST