aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sparc64/kernel/irq.c7
-rw-r--r--arch/sparc64/kernel/time.c7
2 files changed, 9 insertions, 5 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
index ce05deb1bc92..d64b1ea848de 100644
--- a/arch/sparc64/kernel/irq.c
+++ b/arch/sparc64/kernel/irq.c
@@ -522,12 +522,13 @@ void ack_bad_irq(unsigned int virt_irq)
522} 522}
523 523
524#ifndef CONFIG_SMP 524#ifndef CONFIG_SMP
525extern irqreturn_t timer_interrupt(int, void *, struct pt_regs *); 525extern irqreturn_t timer_interrupt(int, void *);
526 526
527void timer_irq(int irq, struct pt_regs *regs) 527void timer_irq(int irq, struct pt_regs *regs)
528{ 528{
529 unsigned long clr_mask = 1 << irq; 529 unsigned long clr_mask = 1 << irq;
530 unsigned long tick_mask = tick_ops->softint_mask; 530 unsigned long tick_mask = tick_ops->softint_mask;
531 struct pt_regs *old_regs;
531 532
532 if (get_softint() & tick_mask) { 533 if (get_softint() & tick_mask) {
533 irq = 0; 534 irq = 0;
@@ -535,12 +536,14 @@ void timer_irq(int irq, struct pt_regs *regs)
535 } 536 }
536 clear_softint(clr_mask); 537 clear_softint(clr_mask);
537 538
539 old_regs = set_irq_regs(regs);
538 irq_enter(); 540 irq_enter();
539 541
540 kstat_this_cpu.irqs[0]++; 542 kstat_this_cpu.irqs[0]++;
541 timer_interrupt(irq, NULL, regs); 543 timer_interrupt(irq, NULL);
542 544
543 irq_exit(); 545 irq_exit();
546 set_irq_regs(old_regs);
544} 547}
545#endif 548#endif
546 549
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
index 00f6fc4aaaff..061e1b1fa583 100644
--- a/arch/sparc64/kernel/time.c
+++ b/arch/sparc64/kernel/time.c
@@ -45,6 +45,7 @@
45#include <asm/cpudata.h> 45#include <asm/cpudata.h>
46#include <asm/uaccess.h> 46#include <asm/uaccess.h>
47#include <asm/prom.h> 47#include <asm/prom.h>
48#include <asm/irq_regs.h>
48 49
49DEFINE_SPINLOCK(mostek_lock); 50DEFINE_SPINLOCK(mostek_lock);
50DEFINE_SPINLOCK(rtc_lock); 51DEFINE_SPINLOCK(rtc_lock);
@@ -452,7 +453,7 @@ static inline void timer_check_rtc(void)
452 } 453 }
453} 454}
454 455
455irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs) 456irqreturn_t timer_interrupt(int irq, void *dev_id)
456{ 457{
457 unsigned long ticks, compare, pstate; 458 unsigned long ticks, compare, pstate;
458 459
@@ -460,8 +461,8 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
460 461
461 do { 462 do {
462#ifndef CONFIG_SMP 463#ifndef CONFIG_SMP
463 profile_tick(CPU_PROFILING, regs); 464 profile_tick(CPU_PROFILING);
464 update_process_times(user_mode(regs)); 465 update_process_times(user_mode(get_irq_regs()));
465#endif 466#endif
466 do_timer(1); 467 do_timer(1);
467 468