--- zzzz-none-000/linux-2.6.19.2/arch/arm/kernel/smp.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/arch/arm/kernel/smp.c 2007-01-11 07:38:19.000000000 +0000 @@ -7,7 +7,6 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ -#include #include #include #include @@ -20,7 +19,6 @@ #include #include #include -#include #include #include @@ -451,7 +449,6 @@ return smp_call_function_on_cpu(func, info, retry, wait, cpu_online_map); } -EXPORT_SYMBOL_GPL(smp_call_function); void show_ipi_list(struct seq_file *p) { @@ -477,26 +474,25 @@ seq_putc(p, '\n'); } -static void ipi_timer(void) +static void ipi_timer(struct pt_regs *regs) { + int user = user_mode(regs); + irq_enter(); - profile_tick(CPU_PROFILING); - update_process_times(user_mode(get_irq_regs())); + profile_tick(CPU_PROFILING, regs); + update_process_times(user); irq_exit(); } #ifdef CONFIG_LOCAL_TIMERS asmlinkage void do_local_timer(struct pt_regs *regs) { - struct pt_regs *old_regs = set_irq_regs(regs); int cpu = smp_processor_id(); if (local_timer_ack()) { irq_stat[cpu].local_timer_irqs++; - ipi_timer(); + ipi_timer(regs); } - - set_irq_regs(old_regs); } #endif @@ -555,7 +551,6 @@ { unsigned int cpu = smp_processor_id(); struct ipi_data *ipi = &per_cpu(ipi_data, cpu); - struct pt_regs *old_regs = set_irq_regs(regs); ipi->ipi_count++; @@ -579,7 +574,7 @@ switch (nextmsg) { case IPI_TIMER: - ipi_timer(); + ipi_timer(regs); break; case IPI_RESCHEDULE: @@ -604,8 +599,6 @@ } } while (msgs); } - - set_irq_regs(old_regs); } void smp_send_reschedule(int cpu)