aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r--arch/mips/kernel/irq.c4
-rw-r--r--arch/mips/kernel/time.c24
2 files changed, 17 insertions, 11 deletions
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
index d955aaefbb8e..a00b0e7ab9b1 100644
--- a/arch/mips/kernel/irq.c
+++ b/arch/mips/kernel/irq.c
@@ -55,13 +55,15 @@ unsigned long irq_hwmask[NR_IRQS];
55 */ 55 */
56asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs) 56asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs)
57{ 57{
58 struct pt_regs *old_regs = set_irq_regs(regs);
58 irq_enter(); 59 irq_enter();
59 60
60 __DO_IRQ_SMTC_HOOK(); 61 __DO_IRQ_SMTC_HOOK();
61 __do_IRQ(irq, regs); 62 __do_IRQ(irq);
62 63
63 irq_exit(); 64 irq_exit();
64 65
66 set_irq_regs(old_regs);
65 return 1; 67 return 1;
66} 68}
67 69
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index a8340802f2d7..d349eb9e4ffb 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -322,18 +322,18 @@ static long last_rtc_update;
322 * a broadcasted inter-processor interrupt which itself is triggered 322 * a broadcasted inter-processor interrupt which itself is triggered
323 * by the global timer interrupt. 323 * by the global timer interrupt.
324 */ 324 */
325void local_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 325void local_timer_interrupt(int irq, void *dev_id)
326{ 326{
327 if (current->pid) 327 if (current->pid)
328 profile_tick(CPU_PROFILING, regs); 328 profile_tick(CPU_PROFILING);
329 update_process_times(user_mode(regs)); 329 update_process_times(user_mode(get_irq_regs()));
330} 330}
331 331
332/* 332/*
333 * High-level timer interrupt service routines. This function 333 * High-level timer interrupt service routines. This function
334 * is set as irqaction->handler and is invoked through do_IRQ. 334 * is set as irqaction->handler and is invoked through do_IRQ.
335 */ 335 */
336irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 336irqreturn_t timer_interrupt(int irq, void *dev_id)
337{ 337{
338 unsigned long j; 338 unsigned long j;
339 unsigned int count; 339 unsigned int count;
@@ -419,23 +419,24 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
419 * In SMP mode, local_timer_interrupt() is invoked by appropriate 419 * In SMP mode, local_timer_interrupt() is invoked by appropriate
420 * low-level local timer interrupt handler. 420 * low-level local timer interrupt handler.
421 */ 421 */
422 local_timer_interrupt(irq, dev_id, regs); 422 local_timer_interrupt(irq, dev_id);
423 423
424 return IRQ_HANDLED; 424 return IRQ_HANDLED;
425} 425}
426 426
427int null_perf_irq(struct pt_regs *regs) 427int null_perf_irq(void)
428{ 428{
429 return 0; 429 return 0;
430} 430}
431 431
432int (*perf_irq)(struct pt_regs *regs) = null_perf_irq; 432int (*perf_irq)(void) = null_perf_irq;
433 433
434EXPORT_SYMBOL(null_perf_irq); 434EXPORT_SYMBOL(null_perf_irq);
435EXPORT_SYMBOL(perf_irq); 435EXPORT_SYMBOL(perf_irq);
436 436
437asmlinkage void ll_timer_interrupt(int irq, struct pt_regs *regs) 437asmlinkage void ll_timer_interrupt(int irq, struct pt_regs *regs)
438{ 438{
439 struct pt_regs *old_regs = set_irq_regs(regs);
439 int r2 = cpu_has_mips_r2; 440 int r2 = cpu_has_mips_r2;
440 441
441 irq_enter(); 442 irq_enter();
@@ -448,27 +449,30 @@ asmlinkage void ll_timer_interrupt(int irq, struct pt_regs *regs)
448 * performance counter interrupt handler anyway. 449 * performance counter interrupt handler anyway.
449 */ 450 */
450 if (!r2 || (read_c0_cause() & (1 << 26))) 451 if (!r2 || (read_c0_cause() & (1 << 26)))
451 if (perf_irq(regs)) 452 if (perf_irq())
452 goto out; 453 goto out;
453 454
454 /* we keep interrupt disabled all the time */ 455 /* we keep interrupt disabled all the time */
455 if (!r2 || (read_c0_cause() & (1 << 30))) 456 if (!r2 || (read_c0_cause() & (1 << 30)))
456 timer_interrupt(irq, NULL, regs); 457 timer_interrupt(irq, NULL);
457 458
458out: 459out:
459 irq_exit(); 460 irq_exit();
461 set_irq_regs(old_regs);
460} 462}
461 463
462asmlinkage void ll_local_timer_interrupt(int irq, struct pt_regs *regs) 464asmlinkage void ll_local_timer_interrupt(int irq, struct pt_regs *regs)
463{ 465{
466 struct pt_regs *old_regs = set_irq_regs(regs);
464 irq_enter(); 467 irq_enter();
465 if (smp_processor_id() != 0) 468 if (smp_processor_id() != 0)
466 kstat_this_cpu.irqs[irq]++; 469 kstat_this_cpu.irqs[irq]++;
467 470
468 /* we keep interrupt disabled all the time */ 471 /* we keep interrupt disabled all the time */
469 local_timer_interrupt(irq, NULL, regs); 472 local_timer_interrupt(irq, NULL);
470 473
471 irq_exit(); 474 irq_exit();
475 set_irq_regs(old_regs);
472} 476}
473 477
474/* 478/*