diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/irq.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/time.c | 24 |
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 | */ |
56 | asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs) | 56 | asmlinkage 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 | */ |
325 | void local_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 325 | void 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 | */ |
336 | irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 336 | irqreturn_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 | ||
427 | int null_perf_irq(struct pt_regs *regs) | 427 | int null_perf_irq(void) |
428 | { | 428 | { |
429 | return 0; | 429 | return 0; |
430 | } | 430 | } |
431 | 431 | ||
432 | int (*perf_irq)(struct pt_regs *regs) = null_perf_irq; | 432 | int (*perf_irq)(void) = null_perf_irq; |
433 | 433 | ||
434 | EXPORT_SYMBOL(null_perf_irq); | 434 | EXPORT_SYMBOL(null_perf_irq); |
435 | EXPORT_SYMBOL(perf_irq); | 435 | EXPORT_SYMBOL(perf_irq); |
436 | 436 | ||
437 | asmlinkage void ll_timer_interrupt(int irq, struct pt_regs *regs) | 437 | asmlinkage 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 | ||
458 | out: | 459 | out: |
459 | irq_exit(); | 460 | irq_exit(); |
461 | set_irq_regs(old_regs); | ||
460 | } | 462 | } |
461 | 463 | ||
462 | asmlinkage void ll_local_timer_interrupt(int irq, struct pt_regs *regs) | 464 | asmlinkage 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 | /* |