Bladeren bron

Automatic merge of master.kernel.org:/home/rmk/linux-2.6-rmk.git

Linus Torvalds 20 jaren geleden
bovenliggende
commit
4adb18173a

+ 12 - 8
arch/arm/Kconfig

@@ -85,6 +85,7 @@ choice
 config ARCH_CLPS7500
 config ARCH_CLPS7500
 	bool "Cirrus-CL-PS7500FE"
 	bool "Cirrus-CL-PS7500FE"
 	select TIMER_ACORN
 	select TIMER_ACORN
+	select ISA
 
 
 config ARCH_CLPS711X
 config ARCH_CLPS711X
 	bool "CLPS711x/EP721x-based"
 	bool "CLPS711x/EP721x-based"
@@ -96,6 +97,7 @@ config ARCH_CO285
 
 
 config ARCH_EBSA110
 config ARCH_EBSA110
 	bool "EBSA-110"
 	bool "EBSA-110"
+	select ISA
 	help
 	help
 	  This is an evaluation board for the StrongARM processor available
 	  This is an evaluation board for the StrongARM processor available
 	  from Digital. It has limited hardware on-board, including an onboard
 	  from Digital. It has limited hardware on-board, including an onboard
@@ -120,13 +122,16 @@ config ARCH_INTEGRATOR
 
 
 config ARCH_IOP3XX
 config ARCH_IOP3XX
 	bool "IOP3xx-based"
 	bool "IOP3xx-based"
+	select PCI
 
 
 config ARCH_IXP4XX
 config ARCH_IXP4XX
 	bool "IXP4xx-based"
 	bool "IXP4xx-based"
 	select DMABOUNCE
 	select DMABOUNCE
+	select PCI
 
 
 config ARCH_IXP2000
 config ARCH_IXP2000
 	bool "IXP2400/2800-based"
 	bool "IXP2400/2800-based"
+	select PCI
 
 
 config ARCH_L7200
 config ARCH_L7200
 	bool "LinkUp-L7200"
 	bool "LinkUp-L7200"
@@ -155,6 +160,8 @@ config ARCH_RPC
 
 
 config ARCH_SA1100
 config ARCH_SA1100
 	bool "SA1100-based"
 	bool "SA1100-based"
+	select ISA
+	select DISCONTIGMEM
 
 
 config ARCH_S3C2410
 config ARCH_S3C2410
 	bool "Samsung S3C2410"
 	bool "Samsung S3C2410"
@@ -165,6 +172,9 @@ config ARCH_S3C2410
 
 
 config ARCH_SHARK
 config ARCH_SHARK
 	bool "Shark"
 	bool "Shark"
+	select ISA
+	select ISA_DMA
+	select PCI
 
 
 config ARCH_LH7A40X
 config ARCH_LH7A40X
 	bool "Sharp LH7A40X"
 	bool "Sharp LH7A40X"
@@ -252,8 +262,6 @@ config ARM_AMBA
 
 
 config ISA
 config ISA
 	bool
 	bool
-	depends on FOOTBRIDGE_HOST || ARCH_SHARK || ARCH_CLPS7500 || ARCH_EBSA110 || ARCH_CDB89712 || ARCH_EDB7211 || ARCH_SA1100 || ARCH_MX1ADS
-	default y
 	help
 	help
 	  Find out whether you have ISA slots on your motherboard.  ISA is the
 	  Find out whether you have ISA slots on your motherboard.  ISA is the
 	  name of a bus system, i.e. the way the CPU talks to the other stuff
 	  name of a bus system, i.e. the way the CPU talks to the other stuff
@@ -263,8 +271,6 @@ config ISA
 
 
 config ISA_DMA
 config ISA_DMA
 	bool
 	bool
-	depends on FOOTBRIDGE_HOST || ARCH_SHARK
-	default y
 
 
 config ISA_DMA_API
 config ISA_DMA_API
 	bool
 	bool
@@ -272,7 +278,6 @@ config ISA_DMA_API
 
 
 config PCI
 config PCI
 	bool "PCI support" if ARCH_INTEGRATOR_AP
 	bool "PCI support" if ARCH_INTEGRATOR_AP
-	default y if ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_IXP2000
 	help
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  bus system, i.e. the way the CPU talks to the other stuff inside
 	  bus system, i.e. the way the CPU talks to the other stuff inside
@@ -300,7 +305,7 @@ menu "Kernel Features"
 
 
 config SMP
 config SMP
 	bool "Symmetric Multi-Processing (EXPERIMENTAL)"
 	bool "Symmetric Multi-Processing (EXPERIMENTAL)"
-	depends on EXPERIMENTAL && n
+	depends on EXPERIMENTAL #&& n
 	help
 	help
 	  This enables support for systems with more than one CPU. If you have
 	  This enables support for systems with more than one CPU. If you have
 	  a system with only one CPU, like most personal computers, say N. If
 	  a system with only one CPU, like most personal computers, say N. If
@@ -340,8 +345,7 @@ config PREEMPT
 
 
 config DISCONTIGMEM
 config DISCONTIGMEM
 	bool
 	bool
-	depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
-	default y
+	default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
 	help
 	help
 	  Say Y to support efficient handling of discontiguous physical memory,
 	  Say Y to support efficient handling of discontiguous physical memory,
 	  for architectures which are either NUMA (Non-Uniform Memory Access)
 	  for architectures which are either NUMA (Non-Uniform Memory Access)

+ 5 - 9
arch/arm/kernel/entry-armv.S

@@ -17,8 +17,8 @@
 
 
 #include <asm/glue.h>
 #include <asm/glue.h>
 #include <asm/vfpmacros.h>
 #include <asm/vfpmacros.h>
-#include <asm/hardware.h>		@ should be moved into entry-macro.S
-#include <asm/arch/irqs.h>		@ should be moved into entry-macro.S
+#include <asm/hardware.h>		/* should be moved into entry-macro.S */
+#include <asm/arch/irqs.h>		/* should be moved into entry-macro.S */
 #include <asm/arch/entry-macro.S>
 #include <asm/arch/entry-macro.S>
 
 
 #include "entry-header.S"
 #include "entry-header.S"
@@ -505,9 +505,9 @@ ENTRY(__switch_to)
 	mra	r4, r5, acc0
 	mra	r4, r5, acc0
 	stmia   ip, {r4, r5}
 	stmia   ip, {r4, r5}
 #endif
 #endif
-#ifdef CONFIG_HAS_TLS_REG
+#if defined(CONFIG_HAS_TLS_REG)
 	mcr	p15, 0, r3, c13, c0, 3		@ set TLS register
 	mcr	p15, 0, r3, c13, c0, 3		@ set TLS register
-#else
+#elif !defined(CONFIG_TLS_REG_EMUL)
 	mov	r4, #0xffff0fff
 	mov	r4, #0xffff0fff
 	str	r3, [r4, #-15]			@ TLS val at 0xffff0ff0
 	str	r3, [r4, #-15]			@ TLS val at 0xffff0ff0
 #endif
 #endif
@@ -690,11 +690,7 @@ __kuser_cmpxchg:				@ 0xffff0fc0
 
 
 __kuser_get_tls:				@ 0xffff0fe0
 __kuser_get_tls:				@ 0xffff0fe0
 
 
-#ifndef CONFIG_HAS_TLS_REG
-
-#ifdef CONFIG_SMP  /* sanity check */
-#error "CONFIG_SMP without CONFIG_HAS_TLS_REG is wrong"
-#endif
+#if !defined(CONFIG_HAS_TLS_REG) && !defined(CONFIG_TLS_REG_EMUL)
 
 
 	ldr	r0, [pc, #(16 - 8)]		@ TLS stored at 0xffff0ff0
 	ldr	r0, [pc, #(16 - 8)]		@ TLS stored at 0xffff0ff0
 	mov	pc, lr
 	mov	pc, lr

+ 2 - 1
arch/arm/kernel/head.S

@@ -19,6 +19,7 @@
 #include <asm/procinfo.h>
 #include <asm/procinfo.h>
 #include <asm/ptrace.h>
 #include <asm/ptrace.h>
 #include <asm/constants.h>
 #include <asm/constants.h>
+#include <asm/thread_info.h>
 #include <asm/system.h>
 #include <asm/system.h>
 
 
 #define PROCINFO_MMUFLAGS	8
 #define PROCINFO_MMUFLAGS	8
@@ -131,7 +132,7 @@ __switch_data:
 	.long	processor_id			@ r4
 	.long	processor_id			@ r4
 	.long	__machine_arch_type		@ r5
 	.long	__machine_arch_type		@ r5
 	.long	cr_alignment			@ r6
 	.long	cr_alignment			@ r6
-	.long	init_thread_union+8192		@ sp
+	.long	init_thread_union + THREAD_START_SP @ sp
 
 
 /*
 /*
  * The following fragment of code is executed with the MMU on, and uses
  * The following fragment of code is executed with the MMU on, and uses

+ 12 - 13
arch/arm/kernel/process.c

@@ -256,8 +256,6 @@ static unsigned long *thread_info_head;
 static unsigned int nr_thread_info;
 static unsigned int nr_thread_info;
 
 
 #define EXTRA_TASK_STRUCT	4
 #define EXTRA_TASK_STRUCT	4
-#define ll_alloc_task_struct() ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
-#define ll_free_task_struct(p) free_pages((unsigned long)(p),1)
 
 
 struct thread_info *alloc_thread_info(struct task_struct *task)
 struct thread_info *alloc_thread_info(struct task_struct *task)
 {
 {
@@ -274,17 +272,16 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
 	}
 	}
 
 
 	if (!thread)
 	if (!thread)
-		thread = ll_alloc_task_struct();
+		thread = (struct thread_info *)
+			   __get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER);
 
 
-#ifdef CONFIG_MAGIC_SYSRQ
+#ifdef CONFIG_DEBUG_STACK_USAGE
 	/*
 	/*
 	 * The stack must be cleared if you want SYSRQ-T to
 	 * The stack must be cleared if you want SYSRQ-T to
 	 * give sensible stack usage information
 	 * give sensible stack usage information
 	 */
 	 */
-	if (thread) {
-		char *p = (char *)thread;
-		memzero(p+KERNEL_STACK_SIZE, KERNEL_STACK_SIZE);
-	}
+	if (thread)
+		memzero(thread, THREAD_SIZE);
 #endif
 #endif
 	return thread;
 	return thread;
 }
 }
@@ -297,7 +294,7 @@ void free_thread_info(struct thread_info *thread)
 		thread_info_head = p;
 		thread_info_head = p;
 		nr_thread_info += 1;
 		nr_thread_info += 1;
 	} else
 	} else
-		ll_free_task_struct(thread);
+		free_pages((unsigned long)thread, THREAD_SIZE_ORDER);
 }
 }
 
 
 /*
 /*
@@ -350,7 +347,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long stack_start,
 	struct thread_info *thread = p->thread_info;
 	struct thread_info *thread = p->thread_info;
 	struct pt_regs *childregs;
 	struct pt_regs *childregs;
 
 
-	childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_SIZE - 8)) - 1;
+	childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_START_SP)) - 1;
 	*childregs = *regs;
 	*childregs = *regs;
 	childregs->ARM_r0 = 0;
 	childregs->ARM_r0 = 0;
 	childregs->ARM_sp = stack_start;
 	childregs->ARM_sp = stack_start;
@@ -447,15 +444,17 @@ EXPORT_SYMBOL(kernel_thread);
 unsigned long get_wchan(struct task_struct *p)
 unsigned long get_wchan(struct task_struct *p)
 {
 {
 	unsigned long fp, lr;
 	unsigned long fp, lr;
-	unsigned long stack_page;
+	unsigned long stack_start, stack_end;
 	int count = 0;
 	int count = 0;
 	if (!p || p == current || p->state == TASK_RUNNING)
 	if (!p || p == current || p->state == TASK_RUNNING)
 		return 0;
 		return 0;
 
 
-	stack_page = 4096 + (unsigned long)p->thread_info;
+	stack_start = (unsigned long)(p->thread_info + 1);
+	stack_end = ((unsigned long)p->thread_info) + THREAD_SIZE;
+
 	fp = thread_saved_fp(p);
 	fp = thread_saved_fp(p);
 	do {
 	do {
-		if (fp < stack_page || fp > 4092+stack_page)
+		if (fp < stack_start || fp > stack_end)
 			return 0;
 			return 0;
 		lr = pc_pointer (((unsigned long *)fp)[-1]);
 		lr = pc_pointer (((unsigned long *)fp)[-1]);
 		if (!in_sched_functions(lr))
 		if (!in_sched_functions(lr))

+ 1 - 1
arch/arm/kernel/sys_arm.c

@@ -302,7 +302,7 @@ long execve(const char *filename, char **argv, char **envp)
 		"b	ret_to_user"
 		"b	ret_to_user"
 		:
 		:
 		: "r" (current_thread_info()),
 		: "r" (current_thread_info()),
-		  "Ir" (THREAD_SIZE - 8 - sizeof(regs)),
+		  "Ir" (THREAD_START_SP - sizeof(regs)),
 		  "r" (&regs),
 		  "r" (&regs),
 		  "Ir" (sizeof(regs))
 		  "Ir" (sizeof(regs))
 		: "r0", "r1", "r2", "r3", "ip", "memory");
 		: "r0", "r1", "r2", "r3", "ip", "memory");

+ 9 - 5
arch/arm/kernel/traps.c

@@ -218,7 +218,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
 		tsk->comm, tsk->pid, tsk->thread_info + 1);
 		tsk->comm, tsk->pid, tsk->thread_info + 1);
 
 
 	if (!user_mode(regs) || in_interrupt()) {
 	if (!user_mode(regs) || in_interrupt()) {
-		dump_mem("Stack: ", regs->ARM_sp, 8192+(unsigned long)tsk->thread_info);
+		dump_mem("Stack: ", regs->ARM_sp,
+			 THREAD_SIZE + (unsigned long)tsk->thread_info);
 		dump_backtrace(regs, tsk);
 		dump_backtrace(regs, tsk);
 		dump_instr(regs);
 		dump_instr(regs);
 	}
 	}
@@ -450,9 +451,9 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 
 
 	case NR(set_tls):
 	case NR(set_tls):
 		thread->tp_value = regs->ARM_r0;
 		thread->tp_value = regs->ARM_r0;
-#ifdef CONFIG_HAS_TLS_REG
+#if defined(CONFIG_HAS_TLS_REG)
 		asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
 		asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
-#else
+#elif !defined(CONFIG_TLS_REG_EMUL)
 		/*
 		/*
 		 * User space must never try to access this directly.
 		 * User space must never try to access this directly.
 		 * Expect your app to break eventually if you do so.
 		 * Expect your app to break eventually if you do so.
@@ -497,11 +498,14 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 	return 0;
 	return 0;
 }
 }
 
 
-#if defined(CONFIG_CPU_32v6) && !defined(CONFIG_HAS_TLS_REG)
+#ifdef CONFIG_TLS_REG_EMUL
 
 
 /*
 /*
  * We might be running on an ARMv6+ processor which should have the TLS
  * We might be running on an ARMv6+ processor which should have the TLS
- * register, but for some reason we can't use it and have to emulate it.
+ * register but for some reason we can't use it, or maybe an SMP system
+ * using a pre-ARMv6 processor (there are apparently a few prototypes like
+ * that in existence) and therefore access to that register must be
+ * emulated.
  */
  */
 
 
 static int get_tp_trap(struct pt_regs *regs, unsigned int instr)
 static int get_tp_trap(struct pt_regs *regs, unsigned int instr)

+ 2 - 1
arch/arm/kernel/vmlinux.lds.S

@@ -5,6 +5,7 @@
 
 
 #include <asm-generic/vmlinux.lds.h>
 #include <asm-generic/vmlinux.lds.h>
 #include <linux/config.h>
 #include <linux/config.h>
+#include <asm/thread_info.h>
 	
 	
 OUTPUT_ARCH(arm)
 OUTPUT_ARCH(arm)
 ENTRY(stext)
 ENTRY(stext)
@@ -103,7 +104,7 @@ SECTIONS
 	__data_loc = ALIGN(4);		/* location in binary */
 	__data_loc = ALIGN(4);		/* location in binary */
 	. = DATAADDR;
 	. = DATAADDR;
 #else
 #else
-	. = ALIGN(8192);
+	. = ALIGN(THREAD_SIZE);
 	__data_loc = .;
 	__data_loc = .;
 #endif
 #endif
 
 

+ 3 - 0
arch/arm/mach-clps711x/Kconfig

@@ -10,6 +10,7 @@ config ARCH_AUTCPU12
 
 
 config ARCH_CDB89712
 config ARCH_CDB89712
 	bool "CDB89712"
 	bool "CDB89712"
+	select ISA
 	help
 	help
 	  This is an evaluation board from Cirrus for the CS89712 processor.
 	  This is an evaluation board from Cirrus for the CS89712 processor.
 	  The board includes 2 serial ports, Ethernet, IRDA, and expansion
 	  The board includes 2 serial ports, Ethernet, IRDA, and expansion
@@ -26,6 +27,8 @@ config ARCH_CLEP7312
 
 
 config ARCH_EDB7211
 config ARCH_EDB7211
 	bool "EDB7211"
 	bool "EDB7211"
+	select ISA
+	select DISCONTIGMEM
 	help
 	help
 	  Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
 	  Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
 	  evaluation board.
 	  evaluation board.

+ 12 - 0
arch/arm/mach-footbridge/Kconfig

@@ -5,6 +5,9 @@ menu "Footbridge Implementations"
 config ARCH_CATS
 config ARCH_CATS
 	bool "CATS"
 	bool "CATS"
 	select FOOTBRIDGE_HOST
 	select FOOTBRIDGE_HOST
+	select ISA
+	select ISA_DMA
+	select PCI
 	help
 	help
 	  Say Y here if you intend to run this kernel on the CATS.
 	  Say Y here if you intend to run this kernel on the CATS.
 
 
@@ -13,6 +16,9 @@ config ARCH_CATS
 config ARCH_PERSONAL_SERVER
 config ARCH_PERSONAL_SERVER
 	bool "Compaq Personal Server"
 	bool "Compaq Personal Server"
 	select FOOTBRIDGE_HOST
 	select FOOTBRIDGE_HOST
+	select ISA
+	select ISA_DMA
+	select PCI
 	---help---
 	---help---
 	  Say Y here if you intend to run this kernel on the Compaq
 	  Say Y here if you intend to run this kernel on the Compaq
 	  Personal Server.
 	  Personal Server.
@@ -42,6 +48,9 @@ config ARCH_EBSA285_HOST
 	bool "EBSA285 (host mode)"
 	bool "EBSA285 (host mode)"
 	select ARCH_EBSA285
 	select ARCH_EBSA285
 	select FOOTBRIDGE_HOST
 	select FOOTBRIDGE_HOST
+	select ISA
+	select ISA_DMA
+	select PCI
 	help
 	help
 	  Say Y here if you intend to run this kernel on the EBSA285 card
 	  Say Y here if you intend to run this kernel on the EBSA285 card
 	  in host ("central function") mode.
 	  in host ("central function") mode.
@@ -51,6 +60,9 @@ config ARCH_EBSA285_HOST
 config ARCH_NETWINDER
 config ARCH_NETWINDER
 	bool "NetWinder"
 	bool "NetWinder"
 	select FOOTBRIDGE_HOST
 	select FOOTBRIDGE_HOST
+	select ISA
+	select ISA_DMA
+	select PCI
 	help
 	help
 	  Say Y here if you intend to run this kernel on the Rebel.COM
 	  Say Y here if you intend to run this kernel on the Rebel.COM
 	  NetWinder.  Information about this machine can be found at:
 	  NetWinder.  Information about this machine can be found at:

+ 1 - 0
arch/arm/mach-imx/Kconfig

@@ -4,6 +4,7 @@ menu "IMX Implementations"
 config ARCH_MX1ADS
 config ARCH_MX1ADS
 	bool "mx1ads"
 	bool "mx1ads"
 	depends on ARCH_IMX
 	depends on ARCH_IMX
+	select ISA
 	help
 	help
 	  Say Y here if you are using the Motorola MX1ADS board
 	  Say Y here if you are using the Motorola MX1ADS board
 
 

+ 15 - 9
arch/arm/mm/Kconfig

@@ -410,17 +410,23 @@ config CPU_BPREDICT_DISABLE
 	help
 	help
 	  Say Y here to disable branch prediction.  If unsure, say N.
 	  Say Y here to disable branch prediction.  If unsure, say N.
 
 
+config TLS_REG_EMUL
+	bool
+	default y if (SMP || CPU_32v6) && (CPU_32v5 || CPU_32v4 || CPU_32v3)
+	help
+	  We might be running on an ARMv6+ processor which should have the TLS
+	  register but for some reason we can't use it, or maybe an SMP system
+	  using a pre-ARMv6 processor (there are apparently a few prototypes
+	  like that in existence) and therefore access to that register must
+	  be emulated.
+
 config HAS_TLS_REG
 config HAS_TLS_REG
 	bool
 	bool
-	depends on CPU_32v6 && !CPU_32v5 && !CPU_32v4 && !CPU_32v3
-	default y
+	depends on CPU_32v6
+	default y if !TLS_REG_EMUL
 	help
 	help
 	  This selects support for the CP15 thread register.
 	  This selects support for the CP15 thread register.
-	  It is defined to be available on ARMv6 or later.  However
-	  if the kernel is configured to support multiple CPUs including
-	  a pre-ARMv6 processors, or if a given ARMv6 processor doesn't
-	  implement the thread register for some reason, then access to
-	  this register from user space must be trapped and emulated.
-	  If user space is relying on the __kuser_get_tls code then
-	  there should not be any impact.
+	  It is defined to be available on ARMv6 or later.  If a particular
+	  ARMv6 or later CPU doesn't support it then it must omc;ide "select
+	  TLS_REG_EMUL" along with its other caracteristics.
 
 

+ 35 - 0
include/asm-arm/arch-imx/imxfb.h

@@ -0,0 +1,35 @@
+/*
+ * This structure describes the machine which we are running on.
+ */
+struct imxfb_mach_info {
+	u_long		pixclock;
+
+	u_short		xres;
+	u_short		yres;
+
+	u_char		bpp;
+	u_char		hsync_len;
+	u_char		left_margin;
+	u_char		right_margin;
+
+	u_char		vsync_len;
+	u_char		upper_margin;
+	u_char		lower_margin;
+	u_char		sync;
+
+	u_int		cmap_greyscale:1,
+			cmap_inverse:1,
+			cmap_static:1,
+			unused:29;
+
+	u_int		pcr;
+	u_int		pwmr;
+	u_int		lscr1;
+
+	u_char * fixed_screen_cpu;
+	dma_addr_t fixed_screen_dma;
+
+	void (*lcd_power)(int);
+	void (*backlight_power)(int);
+};
+void set_imx_fb_info(struct imxfb_mach_info *hard_imx_fb_info);

+ 3 - 4
include/asm-arm/processor.h

@@ -23,8 +23,6 @@
 #include <asm/procinfo.h>
 #include <asm/procinfo.h>
 #include <asm/types.h>
 #include <asm/types.h>
 
 
-#define KERNEL_STACK_SIZE	PAGE_SIZE
-
 union debug_insn {
 union debug_insn {
 	u32	arm;
 	u32	arm;
 	u16	thumb;
 	u16	thumb;
@@ -87,8 +85,9 @@ unsigned long get_wchan(struct task_struct *p);
  */
  */
 extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
 
-#define KSTK_EIP(tsk)	(((unsigned long *)(4096+(unsigned long)(tsk)->thread_info))[1019])
-#define KSTK_ESP(tsk)	(((unsigned long *)(4096+(unsigned long)(tsk)->thread_info))[1017])
+#define KSTK_REGS(tsk)	(((struct pt_regs *)(THREAD_START_SP + (unsigned long)(tsk)->thread_info)) - 1)
+#define KSTK_EIP(tsk)	KSTK_REGS(tsk)->ARM_pc
+#define KSTK_ESP(tsk)	KSTK_REGS(tsk)->ARM_sp
 
 
 /*
 /*
  * Prefetching support - only ARMv5.
  * Prefetching support - only ARMv5.

+ 4 - 2
include/asm-arm/thread_info.h

@@ -14,6 +14,10 @@
 
 
 #include <asm/fpstate.h>
 #include <asm/fpstate.h>
 
 
+#define THREAD_SIZE_ORDER	1
+#define THREAD_SIZE		8192
+#define THREAD_START_SP		(THREAD_SIZE - 8)
+
 #ifndef __ASSEMBLY__
 #ifndef __ASSEMBLY__
 
 
 struct task_struct;
 struct task_struct;
@@ -77,8 +81,6 @@ struct thread_info {
 #define init_thread_info	(init_thread_union.thread_info)
 #define init_thread_info	(init_thread_union.thread_info)
 #define init_stack		(init_thread_union.stack)
 #define init_stack		(init_thread_union.stack)
 
 
-#define THREAD_SIZE		8192
-
 /*
 /*
  * how to get the thread information struct from C
  * how to get the thread information struct from C
  */
  */