diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2006-10-07 15:16:45 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-07 19:51:14 +0200 |
commit | 2850bc273776cbb1b510c5828e9e456dffb50a32 (patch) | |
tree | 340bd599b6efde40618ef89de59cbe957269eac2 /arch/m68k/kernel | |
parent | [PATCH] reiserfs: null pointer dereferencing in reiserfs_read_bitmap_block (diff) | |
download | linux-2850bc273776cbb1b510c5828e9e456dffb50a32.tar.xz linux-2850bc273776cbb1b510c5828e9e456dffb50a32.zip |
[PATCH] m68k pt_regs fixes
m68k_handle_int() split in two functions: __m68k_handle_int() takes
pt_regs * and does set_irq_regs(); m68k_handle_int() doesn't get pt_regs
*.
Places where we used to call m68k_handle_int() recursively with the same
pt_regs have simply lost the second argument, the rest is switched to
__m68k_handle_int().
The rest of patch is just dropping pt_regs * where needed.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/m68k/kernel')
-rw-r--r-- | arch/m68k/kernel/entry.S | 4 | ||||
-rw-r--r-- | arch/m68k/kernel/ints.c | 20 | ||||
-rw-r--r-- | arch/m68k/kernel/setup.c | 2 | ||||
-rw-r--r-- | arch/m68k/kernel/time.c | 7 |
4 files changed, 21 insertions, 12 deletions
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index 9083c8b7659f..34bf7bd126d2 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S @@ -205,7 +205,7 @@ ENTRY(auto_inthandler) movel %sp,%sp@- movel %d0,%sp@- | put vector # on stack auto_irqhandler_fixup = . + 2 - jsr m68k_handle_int | process the IRQ + jsr __m68k_handle_int | process the IRQ addql #8,%sp | pop parameters off stack ret_from_interrupt: @@ -239,7 +239,7 @@ user_irqvec_fixup = . + 2 movel %sp,%sp@- movel %d0,%sp@- | put vector # on stack user_irqhandler_fixup = . + 2 - jsr m68k_handle_int | process the IRQ + jsr __m68k_handle_int | process the IRQ addql #8,%sp | pop parameters off stack subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c index b33e37fb7b0e..6fa893fc5fd6 100644 --- a/arch/m68k/kernel/ints.c +++ b/arch/m68k/kernel/ints.c @@ -39,6 +39,7 @@ #include <asm/page.h> #include <asm/machdep.h> #include <asm/cacheflush.h> +#include <asm/irq_regs.h> #ifdef CONFIG_Q40 #include <asm/q40ints.h> @@ -104,7 +105,7 @@ void __init init_IRQ(void) * @handler: called from auto vector interrupts * * setup the handler to be called from auto vector interrupts instead of the - * standard m68k_handle_int(), it will be called with irq numbers in the range + * standard __m68k_handle_int(), it will be called with irq numbers in the range * from IRQ_AUTO_1 - IRQ_AUTO_7. */ void __init m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_regs *)) @@ -123,7 +124,7 @@ void __init m68k_setup_auto_interrupt(void (*handler)(unsigned int, struct pt_re * setup user vector interrupts, this includes activating the specified range * of interrupts, only then these interrupts can be requested (note: this is * different from auto vector interrupts). An optional handler can be installed - * to be called instead of the default m68k_handle_int(), it will be called + * to be called instead of the default __m68k_handle_int(), it will be called * with irq numbers starting from IRQ_USER. */ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt, @@ -215,7 +216,7 @@ int setup_irq(unsigned int irq, struct irq_node *node) } int request_irq(unsigned int irq, - irqreturn_t (*handler) (int, void *, struct pt_regs *), + irqreturn_t (*handler) (int, void *), unsigned long flags, const char *devname, void *dev_id) { struct irq_node *node; @@ -379,18 +380,25 @@ unsigned int irq_canonicalize(unsigned int irq) EXPORT_SYMBOL(irq_canonicalize); -asmlinkage void m68k_handle_int(unsigned int irq, struct pt_regs *regs) +asmlinkage void m68k_handle_int(unsigned int irq) { struct irq_node *node; - kstat_cpu(0).irqs[irq]++; node = irq_list[irq]; do { - node->handler(irq, node->dev_id, regs); + node->handler(irq, node->dev_id); node = node->next; } while (node); } +asmlinkage void __m68k_handle_int(unsigned int irq, struct pt_regs *regs) +{ + struct pt_regs *old_regs; + old_regs = set_irq_regs(regs); + m68k_handle_int(irq); + set_irq_regs(old_regs); +} + asmlinkage void handle_badint(struct pt_regs *regs) { kstat_cpu(0).irqs[0]++; diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c index f2d7ee0ee18c..869c4861346e 100644 --- a/arch/m68k/kernel/setup.c +++ b/arch/m68k/kernel/setup.c @@ -64,7 +64,7 @@ static char m68k_command_line[CL_SIZE]; char m68k_debug_device[6] = ""; -void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *)) __initdata = NULL; +void (*mach_sched_init) (irqreturn_t (*handler)(int, void *)) __initdata = NULL; /* machine dependent irq functions */ void (*mach_init_IRQ) (void) __initdata = NULL; void (*mach_get_model) (char *model); diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c index 28b2fefa4513..2a599c3ed787 100644 --- a/arch/m68k/kernel/time.c +++ b/arch/m68k/kernel/time.c @@ -21,6 +21,7 @@ #include <asm/machdep.h> #include <asm/io.h> +#include <asm/irq_regs.h> #include <linux/time.h> #include <linux/timex.h> @@ -37,13 +38,13 @@ static inline int set_rtc_mmss(unsigned long nowtime) * timer_interrupt() needs to keep up the real-time clock, * as well as call the "do_timer()" routine every clocktick */ -static irqreturn_t timer_interrupt(int irq, void *dummy, struct pt_regs * regs) +static irqreturn_t timer_interrupt(int irq, void *dummy) { do_timer(1); #ifndef CONFIG_SMP - update_process_times(user_mode(regs)); + update_process_times(user_mode(get_irq_regs())); #endif - profile_tick(CPU_PROFILING, regs); + profile_tick(CPU_PROFILING); #ifdef CONFIG_HEARTBEAT /* use power LED as a heartbeat instead -- much more useful |