Skip to content

Commit

Permalink
sh: Fix bogus regs pointer in do_IRQ().
Browse files Browse the repository at this point in the history
SH-3 and SH-4 were trampling the register, and SH-2 wasn't even
setting it in the first place. This ended up with some rather
broken behaviour in the sysrq show_regs().

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Mar 14, 2007
1 parent ffe1b4e commit 3afb209
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 14 deletions.
1 change: 1 addition & 0 deletions arch/sh/kernel/cpu/sh2/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ ENTRY(exception_handler)

interrupt_entry:
mov r9,r4
mov r15,r5
mov.l 6f,r9
mov.l 7f,r8
jmp @r8
Expand Down
5 changes: 4 additions & 1 deletion arch/sh/kernel/cpu/sh3/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -514,13 +514,16 @@ skip_save:

interrupt_exception:
mov.l 1f, r9
mov.l 2f, r4
mov.l @r4, r4
jmp @r9
nop
mov r15, r5
rts
nop

.align 2
1: .long do_IRQ
2: .long INTEVT

.align 2
ENTRY(exception_none)
Expand Down
15 changes: 2 additions & 13 deletions arch/sh/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include <linux/module.h>
#include <linux/kernel_stat.h>
#include <linux/seq_file.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <asm/processor.h>
#include <asm/uaccess.h>
Expand Down Expand Up @@ -82,13 +81,9 @@ static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
#endif

asmlinkage int do_IRQ(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs)
{
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
struct pt_regs *old_regs = set_irq_regs(regs);
int irq;
#ifdef CONFIG_4KSTACKS
union irq_ctx *curctx, *irqctx;
#endif
Expand All @@ -111,13 +106,7 @@ asmlinkage int do_IRQ(unsigned long r4, unsigned long r5,
}
#endif

#ifdef CONFIG_CPU_HAS_INTEVT
irq = evt2irq(ctrl_inl(INTEVT));
#else
irq = r4;
#endif

irq = irq_demux(irq);
irq = irq_demux(evt2irq(irq));

#ifdef CONFIG_4KSTACKS
curctx = (union irq_ctx *)current_thread_info();
Expand Down
5 changes: 5 additions & 0 deletions include/asm-sh/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,13 @@
/*
* Convert back and forth between INTEVT and IRQ values.
*/
#ifdef CONFIG_CPU_HAS_INTEVT
#define evt2irq(evt) (((evt) >> 5) - 16)
#define irq2evt(irq) (((irq) + 16) << 5)
#else
#define evt2irq(evt) (evt)
#define irq2evt(irq) (irq)
#endif

/*
* Simple Mask Register Support
Expand Down

0 comments on commit 3afb209

Please sign in to comment.