[PATCH] minimal alpha pt_regs fixes
Al Viro [Sat, 7 Oct 2006 13:17:31 +0000 (14:17 +0100)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Acked-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

arch/alpha/kernel/irq.c
arch/alpha/kernel/proto.h
arch/alpha/kernel/smp.c
arch/alpha/kernel/time.c
include/asm-alpha/irq_regs.h [new file with mode: 0644]

index 729c475..dba4e70 100644 (file)
@@ -129,6 +129,7 @@ unlock:
 void
 handle_irq(int irq, struct pt_regs * regs)
 {      
+       struct pt_regs *old_regs;
        /* 
         * We ack quickly, we don't want the irq controller
         * thinking we're snobs just because some other CPU has
@@ -149,6 +150,7 @@ handle_irq(int irq, struct pt_regs * regs)
                return;
        }
 
+       old_regs = set_irq_regs(regs);
        irq_enter();
        /*
         * __do_IRQ() must be called with IPL_MAX. Note that we do not
@@ -157,6 +159,7 @@ handle_irq(int irq, struct pt_regs * regs)
         * at IPL 0.
         */
        local_irq_disable();
-       __do_IRQ(irq, regs);
+       __do_IRQ(irq);
        irq_exit();
+       set_irq_regs(old_regs);
 }
index 21f7128..408bda2 100644 (file)
@@ -133,7 +133,7 @@ extern void smp_percpu_timer_interrupt(struct pt_regs *);
 /* extern void reset_for_srm(void); */
 
 /* time.c */
-extern irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs);
+extern irqreturn_t timer_interrupt(int irq, void *dev);
 extern void common_init_rtc(void);
 extern unsigned long est_cycle_freq;
 
index 4dc273e..596780e 100644 (file)
@@ -515,12 +515,15 @@ smp_cpus_done(unsigned int max_cpus)
 void
 smp_percpu_timer_interrupt(struct pt_regs *regs)
 {
+       struct pt_regs *old_regs;
        int cpu = smp_processor_id();
        unsigned long user = user_mode(regs);
        struct cpuinfo_alpha *data = &cpu_data[cpu];
 
+       old_regs = set_irq_regs(regs);
+
        /* Record kernel PC.  */
-       profile_tick(CPU_PROFILING, regs);
+       profile_tick(CPU_PROFILING);
 
        if (!--data->prof_counter) {
                /* We need to make like a normal interrupt -- otherwise
@@ -534,6 +537,7 @@ smp_percpu_timer_interrupt(struct pt_regs *regs)
 
                irq_exit();
        }
+       set_irq_regs(old_regs);
 }
 
 int __init
index 581ddcc..cf06665 100644 (file)
@@ -104,7 +104,7 @@ unsigned long long sched_clock(void)
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
  */
-irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
+irqreturn_t timer_interrupt(int irq, void *dev)
 {
        unsigned long delta;
        __u32 now;
@@ -112,7 +112,7 @@ irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
 
 #ifndef CONFIG_SMP
        /* Not SMP, do kernel PC profiling here.  */
-       profile_tick(CPU_PROFILING, regs);
+       profile_tick(CPU_PROFILING);
 #endif
 
        write_seqlock(&xtime_lock);
@@ -132,7 +132,7 @@ irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
        while (nticks > 0) {
                do_timer(1);
 #ifndef CONFIG_SMP
-               update_process_times(user_mode(regs));
+               update_process_times(user_mode(get_irq_regs()));
 #endif
                nticks--;
        }
diff --git a/include/asm-alpha/irq_regs.h b/include/asm-alpha/irq_regs.h
new file mode 100644 (file)
index 0000000..3dd9c0b
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/irq_regs.h>