diff options
Diffstat (limited to 'arch/sparc64/kernel/irq.c')
-rw-r--r-- | arch/sparc64/kernel/irq.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c index 4e64724cb9ae..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 |
525 | extern irqreturn_t timer_interrupt(int, void *, struct pt_regs *); | 525 | extern irqreturn_t timer_interrupt(int, void *); |
526 | 526 | ||
527 | void timer_irq(int irq, struct pt_regs *regs) | 527 | void 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,21 +536,25 @@ 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 | ||
547 | void handler_irq(int irq, struct pt_regs *regs) | 550 | void handler_irq(int irq, struct pt_regs *regs) |
548 | { | 551 | { |
549 | struct ino_bucket *bucket; | 552 | struct ino_bucket *bucket; |
553 | struct pt_regs *old_regs; | ||
550 | 554 | ||
551 | clear_softint(1 << irq); | 555 | clear_softint(1 << irq); |
552 | 556 | ||
557 | old_regs = set_irq_regs(regs); | ||
553 | irq_enter(); | 558 | irq_enter(); |
554 | 559 | ||
555 | /* Sliiiick... */ | 560 | /* Sliiiick... */ |
@@ -558,12 +563,13 @@ void handler_irq(int irq, struct pt_regs *regs) | |||
558 | struct ino_bucket *next = __bucket(bucket->irq_chain); | 563 | struct ino_bucket *next = __bucket(bucket->irq_chain); |
559 | 564 | ||
560 | bucket->irq_chain = 0; | 565 | bucket->irq_chain = 0; |
561 | __do_IRQ(bucket->virt_irq, regs); | 566 | __do_IRQ(bucket->virt_irq); |
562 | 567 | ||
563 | bucket = next; | 568 | bucket = next; |
564 | } | 569 | } |
565 | 570 | ||
566 | irq_exit(); | 571 | irq_exit(); |
572 | set_irq_regs(old_regs); | ||
567 | } | 573 | } |
568 | 574 | ||
569 | struct sun5_timer { | 575 | struct sun5_timer { |