[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>
This commit is contained in:
@ -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)
|
||||
|
@ -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]++;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user