diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2006-10-08 17:49:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-08 19:34:08 -0400 |
commit | 7bea96fd22a8fd19f90817405b4abe032317a0e3 (patch) | |
tree | 518bbc228f61f8ff393e4f9a57eeaab8aa2ea2df /arch/um | |
parent | e24bb60e11e3fe9858b71874a4ac59333adbc4fc (diff) |
[PATCH] uml pt_regs fixes
Real fix for UML pt_regs stuff. Note set_irq_regs() logics in there...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/drivers/line.c | 7 | ||||
-rw-r--r-- | arch/um/drivers/mconsole_kern.c | 8 | ||||
-rw-r--r-- | arch/um/drivers/net_kern.c | 2 | ||||
-rw-r--r-- | arch/um/drivers/port_kern.c | 4 | ||||
-rw-r--r-- | arch/um/drivers/ubd_kern.c | 2 | ||||
-rw-r--r-- | arch/um/drivers/xterm_kern.c | 2 | ||||
-rw-r--r-- | arch/um/include/irq_kern.h | 5 | ||||
-rw-r--r-- | arch/um/kernel/irq.c | 15 | ||||
-rw-r--r-- | arch/um/kernel/sigio.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/time.c | 2 |
10 files changed, 24 insertions, 25 deletions
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index cfd9f01fd464..426633e5d6e3 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | #define LINE_BUFSIZE 4096 | 21 | #define LINE_BUFSIZE 4096 |
22 | 22 | ||
23 | static irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused) | 23 | static irqreturn_t line_interrupt(int irq, void *data) |
24 | { | 24 | { |
25 | struct chan *chan = data; | 25 | struct chan *chan = data; |
26 | struct line *line = chan->line; | 26 | struct line *line = chan->line; |
@@ -364,8 +364,7 @@ void line_unthrottle(struct tty_struct *tty) | |||
364 | reactivate_chan(&line->chan_list, line->driver->read_irq); | 364 | reactivate_chan(&line->chan_list, line->driver->read_irq); |
365 | } | 365 | } |
366 | 366 | ||
367 | static irqreturn_t line_write_interrupt(int irq, void *data, | 367 | static irqreturn_t line_write_interrupt(int irq, void *data) |
368 | struct pt_regs *unused) | ||
369 | { | 368 | { |
370 | struct chan *chan = data; | 369 | struct chan *chan = data; |
371 | struct line *line = chan->line; | 370 | struct line *line = chan->line; |
@@ -712,7 +711,7 @@ struct winch { | |||
712 | struct tty_struct *tty; | 711 | struct tty_struct *tty; |
713 | }; | 712 | }; |
714 | 713 | ||
715 | static irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused) | 714 | static irqreturn_t winch_interrupt(int irq, void *data) |
716 | { | 715 | { |
717 | struct winch *winch = data; | 716 | struct winch *winch = data; |
718 | struct tty_struct *tty; | 717 | struct tty_struct *tty; |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index a67dcbd78de4..d08bd036ccb8 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -74,8 +74,7 @@ static void mc_work_proc(void *unused) | |||
74 | 74 | ||
75 | static DECLARE_WORK(mconsole_work, mc_work_proc, NULL); | 75 | static DECLARE_WORK(mconsole_work, mc_work_proc, NULL); |
76 | 76 | ||
77 | static irqreturn_t mconsole_interrupt(int irq, void *dev_id, | 77 | static irqreturn_t mconsole_interrupt(int irq, void *dev_id) |
78 | struct pt_regs *regs) | ||
79 | { | 78 | { |
80 | /* long to avoid size mismatch warnings from gcc */ | 79 | /* long to avoid size mismatch warnings from gcc */ |
81 | long fd; | 80 | long fd; |
@@ -674,8 +673,9 @@ static void with_console(struct mc_request *req, void (*proc)(void *), | |||
674 | static void sysrq_proc(void *arg) | 673 | static void sysrq_proc(void *arg) |
675 | { | 674 | { |
676 | char *op = arg; | 675 | char *op = arg; |
677 | 676 | struct pt_regs *old_regs = set_irq_regs(¤t->thread.regs); | |
678 | handle_sysrq(*op, ¤t->thread.regs, NULL); | 677 | handle_sysrq(*op, NULL); |
678 | set_irq_regs(old_regs); | ||
679 | } | 679 | } |
680 | 680 | ||
681 | void mconsole_sysrq(struct mc_request *req) | 681 | void mconsole_sysrq(struct mc_request *req) |
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index c1c5604752fb..ec9eb8bd9432 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c | |||
@@ -77,7 +77,7 @@ static void uml_dev_close(void* dev) | |||
77 | dev_close( (struct net_device *) dev); | 77 | dev_close( (struct net_device *) dev); |
78 | } | 78 | } |
79 | 79 | ||
80 | irqreturn_t uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 80 | irqreturn_t uml_net_interrupt(int irq, void *dev_id) |
81 | { | 81 | { |
82 | struct net_device *dev = dev_id; | 82 | struct net_device *dev = dev_id; |
83 | struct uml_net_private *lp = dev->priv; | 83 | struct uml_net_private *lp = dev->priv; |
diff --git a/arch/um/drivers/port_kern.c b/arch/um/drivers/port_kern.c index 73755f37a8a8..ce9f3733f73e 100644 --- a/arch/um/drivers/port_kern.c +++ b/arch/um/drivers/port_kern.c | |||
@@ -47,7 +47,7 @@ struct connection { | |||
47 | struct port_list *port; | 47 | struct port_list *port; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | static irqreturn_t pipe_interrupt(int irq, void *data, struct pt_regs *regs) | 50 | static irqreturn_t pipe_interrupt(int irq, void *data) |
51 | { | 51 | { |
52 | struct connection *conn = data; | 52 | struct connection *conn = data; |
53 | int fd; | 53 | int fd; |
@@ -152,7 +152,7 @@ void port_work_proc(void *unused) | |||
152 | 152 | ||
153 | DECLARE_WORK(port_work, port_work_proc, NULL); | 153 | DECLARE_WORK(port_work, port_work_proc, NULL); |
154 | 154 | ||
155 | static irqreturn_t port_interrupt(int irq, void *data, struct pt_regs *regs) | 155 | static irqreturn_t port_interrupt(int irq, void *data) |
156 | { | 156 | { |
157 | struct port_list *port = data; | 157 | struct port_list *port = data; |
158 | 158 | ||
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index f0b0668458b7..bc458f57921b 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -524,7 +524,7 @@ static void ubd_handler(void) | |||
524 | do_ubd_request(ubd_queue); | 524 | do_ubd_request(ubd_queue); |
525 | } | 525 | } |
526 | 526 | ||
527 | static irqreturn_t ubd_intr(int irq, void *dev, struct pt_regs *unused) | 527 | static irqreturn_t ubd_intr(int irq, void *dev) |
528 | { | 528 | { |
529 | ubd_handler(); | 529 | ubd_handler(); |
530 | return(IRQ_HANDLED); | 530 | return(IRQ_HANDLED); |
diff --git a/arch/um/drivers/xterm_kern.c b/arch/um/drivers/xterm_kern.c index 6036ec85895a..a4ce7058e10e 100644 --- a/arch/um/drivers/xterm_kern.c +++ b/arch/um/drivers/xterm_kern.c | |||
@@ -21,7 +21,7 @@ struct xterm_wait { | |||
21 | int new_fd; | 21 | int new_fd; |
22 | }; | 22 | }; |
23 | 23 | ||
24 | static irqreturn_t xterm_interrupt(int irq, void *data, struct pt_regs *regs) | 24 | static irqreturn_t xterm_interrupt(int irq, void *data) |
25 | { | 25 | { |
26 | struct xterm_wait *xterm = data; | 26 | struct xterm_wait *xterm = data; |
27 | int fd; | 27 | int fd; |
diff --git a/arch/um/include/irq_kern.h b/arch/um/include/irq_kern.h index c222d56b1494..81beb1841299 100644 --- a/arch/um/include/irq_kern.h +++ b/arch/um/include/irq_kern.h | |||
@@ -10,12 +10,11 @@ | |||
10 | #include "asm/ptrace.h" | 10 | #include "asm/ptrace.h" |
11 | 11 | ||
12 | extern int um_request_irq(unsigned int irq, int fd, int type, | 12 | extern int um_request_irq(unsigned int irq, int fd, int type, |
13 | irqreturn_t (*handler)(int, void *, | 13 | irqreturn_t (*handler)(int, void *), |
14 | struct pt_regs *), | ||
15 | unsigned long irqflags, const char * devname, | 14 | unsigned long irqflags, const char * devname, |
16 | void *dev_id); | 15 | void *dev_id); |
17 | extern int init_aio_irq(int irq, char *name, | 16 | extern int init_aio_irq(int irq, char *name, |
18 | irqreturn_t (*handler)(int, void *, struct pt_regs *)); | 17 | irqreturn_t (*handler)(int, void *)); |
19 | 18 | ||
20 | #endif | 19 | #endif |
21 | 20 | ||
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 7c41dabe7a2c..3c01c2bc979a 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -355,14 +355,16 @@ void forward_interrupts(int pid) | |||
355 | */ | 355 | */ |
356 | unsigned int do_IRQ(int irq, union uml_pt_regs *regs) | 356 | unsigned int do_IRQ(int irq, union uml_pt_regs *regs) |
357 | { | 357 | { |
358 | irq_enter(); | 358 | struct pt_regs *old_regs = set_irq_regs((struct pt_regs *)regs); |
359 | __do_IRQ(irq); | 359 | irq_enter(); |
360 | irq_exit(); | 360 | __do_IRQ(irq); |
361 | return 1; | 361 | irq_exit(); |
362 | set_irq_regs(old_regs); | ||
363 | return 1; | ||
362 | } | 364 | } |
363 | 365 | ||
364 | int um_request_irq(unsigned int irq, int fd, int type, | 366 | int um_request_irq(unsigned int irq, int fd, int type, |
365 | irqreturn_t (*handler)(int, void *, struct pt_regs *), | 367 | irqreturn_t (*handler)(int, void *), |
366 | unsigned long irqflags, const char * devname, | 368 | unsigned long irqflags, const char * devname, |
367 | void *dev_id) | 369 | void *dev_id) |
368 | { | 370 | { |
@@ -423,8 +425,7 @@ void __init init_IRQ(void) | |||
423 | } | 425 | } |
424 | } | 426 | } |
425 | 427 | ||
426 | int init_aio_irq(int irq, char *name, irqreturn_t (*handler)(int, void *, | 428 | int init_aio_irq(int irq, char *name, irqreturn_t (*handler)(int, void *)) |
427 | struct pt_regs *)) | ||
428 | { | 429 | { |
429 | int fds[2], err; | 430 | int fds[2], err; |
430 | 431 | ||
diff --git a/arch/um/kernel/sigio.c b/arch/um/kernel/sigio.c index 0ad755ceb212..2b0ab438301c 100644 --- a/arch/um/kernel/sigio.c +++ b/arch/um/kernel/sigio.c | |||
@@ -17,7 +17,7 @@ | |||
17 | /* Protected by sigio_lock() called from write_sigio_workaround */ | 17 | /* Protected by sigio_lock() called from write_sigio_workaround */ |
18 | static int sigio_irq_fd = -1; | 18 | static int sigio_irq_fd = -1; |
19 | 19 | ||
20 | static irqreturn_t sigio_interrupt(int irq, void *data, struct pt_regs *unused) | 20 | static irqreturn_t sigio_interrupt(int irq, void *data) |
21 | { | 21 | { |
22 | char c; | 22 | char c; |
23 | 23 | ||
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index a92965f8f9cd..2e354b3ca060 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c | |||
@@ -86,7 +86,7 @@ static inline unsigned long long get_time(void) | |||
86 | return nsecs; | 86 | return nsecs; |
87 | } | 87 | } |
88 | 88 | ||
89 | irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs) | 89 | irqreturn_t um_timer(int irq, void *dev) |
90 | { | 90 | { |
91 | unsigned long long nsecs; | 91 | unsigned long long nsecs; |
92 | unsigned long flags; | 92 | unsigned long flags; |