From: Jeff Dike <jdike@addtoit.com>

The patch below brings UML up to date with interface changes and the like 
	irq.c includes profile.h to bring in a missing definition
	use the cpu_{set,clear} interface
	use the new get_signal_to_deliver interface
	define instruction_pointer


Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/um/kernel/irq.c            |    1 +
 25-akpm/arch/um/kernel/process_kern.c   |    7 ++++---
 25-akpm/arch/um/kernel/signal_kern.c    |   10 +++++-----
 25-akpm/include/asm-um/ptrace-generic.h |    2 ++
 4 files changed, 12 insertions(+), 8 deletions(-)

diff -puN arch/um/kernel/irq.c~uml-updates arch/um/kernel/irq.c
--- 25/arch/um/kernel/irq.c~uml-updates	2004-08-15 15:08:26.292565088 -0700
+++ 25-akpm/arch/um/kernel/irq.c	2004-08-15 15:08:26.300563872 -0700
@@ -18,6 +18,7 @@
 #include "linux/proc_fs.h"
 #include "linux/init.h"
 #include "linux/seq_file.h"
+#include "linux/profile.h"
 #include "asm/irq.h"
 #include "asm/hw_irq.h"
 #include "asm/hardirq.h"
diff -puN arch/um/kernel/process_kern.c~uml-updates arch/um/kernel/process_kern.c
--- 25/arch/um/kernel/process_kern.c~uml-updates	2004-08-15 15:08:26.293564936 -0700
+++ 25-akpm/arch/um/kernel/process_kern.c	2004-08-15 15:08:26.301563720 -0700
@@ -114,10 +114,11 @@ int kernel_thread(int (*fn)(void *), voi
 void switch_mm(struct mm_struct *prev, struct mm_struct *next, 
 	       struct task_struct *tsk)
 {
-	unsigned cpu = smp_processor_id();
+	int cpu = smp_processor_id();
+
 	if (prev != next) 
-		clear_bit(cpu, &prev->cpu_vm_mask);
-	set_bit(cpu, &next->cpu_vm_mask);
+		cpu_clear(cpu, prev->cpu_vm_mask);
+	cpu_set(cpu, next->cpu_vm_mask);
 }
 
 void set_current(void *t)
diff -puN arch/um/kernel/signal_kern.c~uml-updates arch/um/kernel/signal_kern.c
--- 25/arch/um/kernel/signal_kern.c~uml-updates	2004-08-15 15:08:26.294564784 -0700
+++ 25-akpm/arch/um/kernel/signal_kern.c	2004-08-15 15:08:26.301563720 -0700
@@ -130,21 +130,21 @@ static int handle_signal(struct pt_regs 
 
 static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset, int error)
 {
+	struct k_sigaction ka_copy;
 	siginfo_t info;
-	struct k_sigaction *ka;
 	int err, sig;
 
 	if (!oldset)
 		oldset = &current->blocked;
 
-	sig = get_signal_to_deliver(&info, regs, NULL);
+	sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL);
 	if(sig == 0)
 		return(0);
 
 	/* Whee!  Actually deliver the signal.  */
-	ka = &current->sighand->action[sig -1 ];
-	err = handle_signal(regs, sig, ka, &info, oldset, error);
-	if(!err) return(1);
+	err = handle_signal(regs, sig, &ka_copy, &info, oldset, error);
+	if(!err)
+		return(1);
 
 	/* Did we come from a system call? */
 	if(PT_REGS_SYSCALL_NR(regs) >= 0){
diff -puN include/asm-um/ptrace-generic.h~uml-updates include/asm-um/ptrace-generic.h
--- 25/include/asm-um/ptrace-generic.h~uml-updates	2004-08-15 15:08:26.296564480 -0700
+++ 25-akpm/include/asm-um/ptrace-generic.h	2004-08-15 15:08:26.302563568 -0700
@@ -45,6 +45,8 @@ struct pt_regs {
 
 #define PT_REGS_SC(r) UPT_SC(&(r)->regs)
 
+#define instruction_pointer(regs) PT_REGS_IP(regs)
+
 struct task_struct;
 
 extern unsigned long getreg(struct task_struct *child, int regno);
_