diff options
-rw-r--r-- | arch/s390/kernel/s390_ext.c | 9 | ||||
-rw-r--r-- | arch/s390/kernel/smp.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/time.c | 15 | ||||
-rw-r--r-- | arch/s390/kernel/traps.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 5 | ||||
-rw-r--r-- | arch/s390/mm/fault.c | 2 | ||||
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/ctrlchar.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/keyboard.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/sclp.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 6 | ||||
-rw-r--r-- | drivers/s390/net/iucv.c | 4 | ||||
-rw-r--r-- | include/asm-s390/hardirq.h | 2 | ||||
-rw-r--r-- | include/asm-s390/irq_regs.h | 1 | ||||
-rw-r--r-- | include/asm-s390/s390_ext.h | 2 |
15 files changed, 36 insertions, 24 deletions
diff --git a/arch/s390/kernel/s390_ext.c b/arch/s390/kernel/s390_ext.c index c1b383537fec..c49ab8c784d2 100644 --- a/arch/s390/kernel/s390_ext.c +++ b/arch/s390/kernel/s390_ext.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <asm/lowcore.h> | 17 | #include <asm/lowcore.h> |
18 | #include <asm/s390_ext.h> | 18 | #include <asm/s390_ext.h> |
19 | #include <asm/irq_regs.h> | ||
19 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
20 | 21 | ||
21 | /* | 22 | /* |
@@ -114,26 +115,28 @@ void do_extint(struct pt_regs *regs, unsigned short code) | |||
114 | { | 115 | { |
115 | ext_int_info_t *p; | 116 | ext_int_info_t *p; |
116 | int index; | 117 | int index; |
118 | struct pt_regs *old_regs; | ||
117 | 119 | ||
118 | irq_enter(); | 120 | irq_enter(); |
121 | old_regs = set_irq_regs(regs); | ||
119 | asm volatile ("mc 0,0"); | 122 | asm volatile ("mc 0,0"); |
120 | if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer) | 123 | if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer) |
121 | /** | 124 | /** |
122 | * Make sure that the i/o interrupt did not "overtake" | 125 | * Make sure that the i/o interrupt did not "overtake" |
123 | * the last HZ timer interrupt. | 126 | * the last HZ timer interrupt. |
124 | */ | 127 | */ |
125 | account_ticks(regs); | 128 | account_ticks(); |
126 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | 129 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; |
127 | index = ext_hash(code); | 130 | index = ext_hash(code); |
128 | for (p = ext_int_hash[index]; p; p = p->next) { | 131 | for (p = ext_int_hash[index]; p; p = p->next) { |
129 | if (likely(p->code == code)) { | 132 | if (likely(p->code == code)) { |
130 | if (likely(p->handler)) | 133 | if (likely(p->handler)) |
131 | p->handler(regs, code); | 134 | p->handler(code); |
132 | } | 135 | } |
133 | } | 136 | } |
137 | set_irq_regs(old_regs); | ||
134 | irq_exit(); | 138 | irq_exit(); |
135 | } | 139 | } |
136 | 140 | ||
137 | EXPORT_SYMBOL(register_external_interrupt); | 141 | EXPORT_SYMBOL(register_external_interrupt); |
138 | EXPORT_SYMBOL(unregister_external_interrupt); | 142 | EXPORT_SYMBOL(unregister_external_interrupt); |
139 | |||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index a8e6199755d4..62822245f9be 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -339,7 +339,7 @@ void machine_power_off_smp(void) | |||
339 | * cpus are handled. | 339 | * cpus are handled. |
340 | */ | 340 | */ |
341 | 341 | ||
342 | void do_ext_call_interrupt(struct pt_regs *regs, __u16 code) | 342 | void do_ext_call_interrupt(__u16 code) |
343 | { | 343 | { |
344 | unsigned long bits; | 344 | unsigned long bits; |
345 | 345 | ||
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 4bf66cc4a267..2c8c690688cb 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/s390_ext.h> | 34 | #include <asm/s390_ext.h> |
35 | #include <asm/div64.h> | 35 | #include <asm/div64.h> |
36 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
37 | #include <asm/irq_regs.h> | ||
37 | #include <asm/timer.h> | 38 | #include <asm/timer.h> |
38 | 39 | ||
39 | /* change this if you have some constant time drift */ | 40 | /* change this if you have some constant time drift */ |
@@ -150,9 +151,9 @@ EXPORT_SYMBOL(do_settimeofday); | |||
150 | 151 | ||
151 | 152 | ||
152 | #ifdef CONFIG_PROFILING | 153 | #ifdef CONFIG_PROFILING |
153 | #define s390_do_profile(regs) profile_tick(CPU_PROFILING, regs) | 154 | #define s390_do_profile() profile_tick(CPU_PROFILING) |
154 | #else | 155 | #else |
155 | #define s390_do_profile(regs) do { ; } while(0) | 156 | #define s390_do_profile() do { ; } while(0) |
156 | #endif /* CONFIG_PROFILING */ | 157 | #endif /* CONFIG_PROFILING */ |
157 | 158 | ||
158 | 159 | ||
@@ -160,7 +161,7 @@ EXPORT_SYMBOL(do_settimeofday); | |||
160 | * timer_interrupt() needs to keep up the real-time clock, | 161 | * timer_interrupt() needs to keep up the real-time clock, |
161 | * as well as call the "do_timer()" routine every clocktick | 162 | * as well as call the "do_timer()" routine every clocktick |
162 | */ | 163 | */ |
163 | void account_ticks(struct pt_regs *regs) | 164 | void account_ticks(void) |
164 | { | 165 | { |
165 | __u64 tmp; | 166 | __u64 tmp; |
166 | __u32 ticks; | 167 | __u32 ticks; |
@@ -221,10 +222,10 @@ void account_ticks(struct pt_regs *regs) | |||
221 | account_tick_vtime(current); | 222 | account_tick_vtime(current); |
222 | #else | 223 | #else |
223 | while (ticks--) | 224 | while (ticks--) |
224 | update_process_times(user_mode(regs)); | 225 | update_process_times(user_mode(get_irq_regs())); |
225 | #endif | 226 | #endif |
226 | 227 | ||
227 | s390_do_profile(regs); | 228 | s390_do_profile(); |
228 | } | 229 | } |
229 | 230 | ||
230 | #ifdef CONFIG_NO_IDLE_HZ | 231 | #ifdef CONFIG_NO_IDLE_HZ |
@@ -285,9 +286,11 @@ static inline void stop_hz_timer(void) | |||
285 | */ | 286 | */ |
286 | static inline void start_hz_timer(void) | 287 | static inline void start_hz_timer(void) |
287 | { | 288 | { |
289 | BUG_ON(!in_interrupt()); | ||
290 | |||
288 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) | 291 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) |
289 | return; | 292 | return; |
290 | account_ticks(task_pt_regs(current)); | 293 | account_ticks(); |
291 | cpu_clear(smp_processor_id(), nohz_cpu_mask); | 294 | cpu_clear(smp_processor_id(), nohz_cpu_mask); |
292 | } | 295 | } |
293 | 296 | ||
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 3eb4fab048b8..05bf3cc8530a 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -61,7 +61,7 @@ extern pgm_check_handler_t do_dat_exception; | |||
61 | #ifdef CONFIG_PFAULT | 61 | #ifdef CONFIG_PFAULT |
62 | extern int pfault_init(void); | 62 | extern int pfault_init(void); |
63 | extern void pfault_fini(void); | 63 | extern void pfault_fini(void); |
64 | extern void pfault_interrupt(struct pt_regs *regs, __u16 error_code); | 64 | extern void pfault_interrupt(__u16 error_code); |
65 | static ext_int_info_t ext_int_pfault; | 65 | static ext_int_info_t ext_int_pfault; |
66 | #endif | 66 | #endif |
67 | extern pgm_check_handler_t do_monitor_call; | 67 | extern pgm_check_handler_t do_monitor_call; |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 2306cd83fca1..1d7d3938b2b1 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <asm/s390_ext.h> | 23 | #include <asm/s390_ext.h> |
24 | #include <asm/timer.h> | 24 | #include <asm/timer.h> |
25 | #include <asm/irq_regs.h> | ||
25 | 26 | ||
26 | static ext_int_info_t ext_int_info_timer; | 27 | static ext_int_info_t ext_int_info_timer; |
27 | DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer); | 28 | DEFINE_PER_CPU(struct vtimer_queue, virt_cpu_timer); |
@@ -241,7 +242,7 @@ static void do_callbacks(struct list_head *cb_list, struct pt_regs *regs) | |||
241 | /* | 242 | /* |
242 | * Handler for the virtual CPU timer. | 243 | * Handler for the virtual CPU timer. |
243 | */ | 244 | */ |
244 | static void do_cpu_timer_interrupt(struct pt_regs *regs, __u16 error_code) | 245 | static void do_cpu_timer_interrupt(__u16 error_code) |
245 | { | 246 | { |
246 | int cpu; | 247 | int cpu; |
247 | __u64 next, delta; | 248 | __u64 next, delta; |
@@ -274,7 +275,7 @@ static void do_cpu_timer_interrupt(struct pt_regs *regs, __u16 error_code) | |||
274 | list_move_tail(&event->entry, &cb_list); | 275 | list_move_tail(&event->entry, &cb_list); |
275 | } | 276 | } |
276 | spin_unlock(&vt_list->lock); | 277 | spin_unlock(&vt_list->lock); |
277 | do_callbacks(&cb_list, regs); | 278 | do_callbacks(&cb_list, get_irq_regs()); |
278 | 279 | ||
279 | /* next event is first in list */ | 280 | /* next event is first in list */ |
280 | spin_lock(&vt_list->lock); | 281 | spin_lock(&vt_list->lock); |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 9c3c19fe62fc..1c323bbfda91 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -451,7 +451,7 @@ void pfault_fini(void) | |||
451 | } | 451 | } |
452 | 452 | ||
453 | asmlinkage void | 453 | asmlinkage void |
454 | pfault_interrupt(struct pt_regs *regs, __u16 error_code) | 454 | pfault_interrupt(__u16 error_code) |
455 | { | 455 | { |
456 | struct task_struct *tsk; | 456 | struct task_struct *tsk; |
457 | __u16 subcode; | 457 | __u16 subcode; |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 222a8a71a5e8..53db58a68617 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -218,7 +218,7 @@ dasd_diag_term_IO(struct dasd_ccw_req * cqr) | |||
218 | 218 | ||
219 | /* Handle external interruption. */ | 219 | /* Handle external interruption. */ |
220 | static void | 220 | static void |
221 | dasd_ext_handler(struct pt_regs *regs, __u16 code) | 221 | dasd_ext_handler(__u16 code) |
222 | { | 222 | { |
223 | struct dasd_ccw_req *cqr, *next; | 223 | struct dasd_ccw_req *cqr, *next; |
224 | struct dasd_device *device; | 224 | struct dasd_device *device; |
diff --git a/drivers/s390/char/ctrlchar.c b/drivers/s390/char/ctrlchar.c index d83eb6358bac..49e9628d9297 100644 --- a/drivers/s390/char/ctrlchar.c +++ b/drivers/s390/char/ctrlchar.c | |||
@@ -20,7 +20,7 @@ static int ctrlchar_sysrq_key; | |||
20 | static void | 20 | static void |
21 | ctrlchar_handle_sysrq(void *tty) | 21 | ctrlchar_handle_sysrq(void *tty) |
22 | { | 22 | { |
23 | handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); | 23 | handle_sysrq(ctrlchar_sysrq_key, (struct tty_struct *) tty); |
24 | } | 24 | } |
25 | 25 | ||
26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); | 26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); |
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 3be06569180d..e3491a5f5219 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c | |||
@@ -304,7 +304,7 @@ kbd_keycode(struct kbd_data *kbd, unsigned int keycode) | |||
304 | if (kbd->sysrq) { | 304 | if (kbd->sysrq) { |
305 | if (kbd->sysrq == K(KT_LATIN, '-')) { | 305 | if (kbd->sysrq == K(KT_LATIN, '-')) { |
306 | kbd->sysrq = 0; | 306 | kbd->sysrq = 0; |
307 | handle_sysrq(value, NULL, kbd->tty); | 307 | handle_sysrq(value, kbd->tty); |
308 | return; | 308 | return; |
309 | } | 309 | } |
310 | if (value == '-') { | 310 | if (value == '-') { |
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 31e335751d6d..8a056df09d6b 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
@@ -324,7 +324,7 @@ __sclp_find_req(u32 sccb) | |||
324 | * Prepare read event data request if necessary. Start processing of next | 324 | * Prepare read event data request if necessary. Start processing of next |
325 | * request on queue. */ | 325 | * request on queue. */ |
326 | static void | 326 | static void |
327 | sclp_interrupt_handler(struct pt_regs *regs, __u16 code) | 327 | sclp_interrupt_handler(__u16 code) |
328 | { | 328 | { |
329 | struct sclp_req *req; | 329 | struct sclp_req *req; |
330 | u32 finished_sccb; | 330 | u32 finished_sccb; |
@@ -743,7 +743,7 @@ EXPORT_SYMBOL(sclp_reactivate); | |||
743 | /* Handler for external interruption used during initialization. Modify | 743 | /* Handler for external interruption used during initialization. Modify |
744 | * request state to done. */ | 744 | * request state to done. */ |
745 | static void | 745 | static void |
746 | sclp_check_handler(struct pt_regs *regs, __u16 code) | 746 | sclp_check_handler(__u16 code) |
747 | { | 747 | { |
748 | u32 finished_sccb; | 748 | u32 finished_sccb; |
749 | 749 | ||
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 2e2882daefbb..f18b1623cad7 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/cio.h> | 19 | #include <asm/cio.h> |
20 | #include <asm/delay.h> | 20 | #include <asm/delay.h> |
21 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
22 | #include <asm/irq_regs.h> | ||
22 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
23 | #include "airq.h" | 24 | #include "airq.h" |
24 | #include "cio.h" | 25 | #include "cio.h" |
@@ -606,15 +607,17 @@ do_IRQ (struct pt_regs *regs) | |||
606 | struct tpi_info *tpi_info; | 607 | struct tpi_info *tpi_info; |
607 | struct subchannel *sch; | 608 | struct subchannel *sch; |
608 | struct irb *irb; | 609 | struct irb *irb; |
610 | struct pt_regs *old_regs; | ||
609 | 611 | ||
610 | irq_enter (); | 612 | irq_enter (); |
613 | old_regs = set_irq_regs(regs); | ||
611 | asm volatile ("mc 0,0"); | 614 | asm volatile ("mc 0,0"); |
612 | if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer) | 615 | if (S390_lowcore.int_clock >= S390_lowcore.jiffy_timer) |
613 | /** | 616 | /** |
614 | * Make sure that the i/o interrupt did not "overtake" | 617 | * Make sure that the i/o interrupt did not "overtake" |
615 | * the last HZ timer interrupt. | 618 | * the last HZ timer interrupt. |
616 | */ | 619 | */ |
617 | account_ticks(regs); | 620 | account_ticks(); |
618 | /* | 621 | /* |
619 | * Get interrupt information from lowcore | 622 | * Get interrupt information from lowcore |
620 | */ | 623 | */ |
@@ -652,6 +655,7 @@ do_IRQ (struct pt_regs *regs) | |||
652 | * out of the sie which costs more cycles than it saves. | 655 | * out of the sie which costs more cycles than it saves. |
653 | */ | 656 | */ |
654 | } while (!MACHINE_IS_VM && tpi (NULL) != 0); | 657 | } while (!MACHINE_IS_VM && tpi (NULL) != 0); |
658 | set_irq_regs(old_regs); | ||
655 | irq_exit (); | 659 | irq_exit (); |
656 | } | 660 | } |
657 | 661 | ||
diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c index 809dd8d7f47a..1476ce2b437c 100644 --- a/drivers/s390/net/iucv.c +++ b/drivers/s390/net/iucv.c | |||
@@ -116,7 +116,7 @@ static DEFINE_SPINLOCK(iucv_irq_queue_lock); | |||
116 | *Internal function prototypes | 116 | *Internal function prototypes |
117 | */ | 117 | */ |
118 | static void iucv_tasklet_handler(unsigned long); | 118 | static void iucv_tasklet_handler(unsigned long); |
119 | static void iucv_irq_handler(struct pt_regs *, __u16); | 119 | static void iucv_irq_handler(__u16); |
120 | 120 | ||
121 | static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0); | 121 | static DECLARE_TASKLET(iucv_tasklet,iucv_tasklet_handler,0); |
122 | 122 | ||
@@ -2251,7 +2251,7 @@ iucv_sever(__u16 pathid, __u8 user_data[16]) | |||
2251 | * Places the interrupt buffer on a queue and schedules iucv_tasklet_handler(). | 2251 | * Places the interrupt buffer on a queue and schedules iucv_tasklet_handler(). |
2252 | */ | 2252 | */ |
2253 | static void | 2253 | static void |
2254 | iucv_irq_handler(struct pt_regs *regs, __u16 code) | 2254 | iucv_irq_handler(__u16 code) |
2255 | { | 2255 | { |
2256 | iucv_irqdata *irqdata; | 2256 | iucv_irqdata *irqdata; |
2257 | 2257 | ||
diff --git a/include/asm-s390/hardirq.h b/include/asm-s390/hardirq.h index e84b7ef54aac..c2f6a8782d31 100644 --- a/include/asm-s390/hardirq.h +++ b/include/asm-s390/hardirq.h | |||
@@ -32,6 +32,6 @@ typedef struct { | |||
32 | 32 | ||
33 | #define HARDIRQ_BITS 8 | 33 | #define HARDIRQ_BITS 8 |
34 | 34 | ||
35 | extern void account_ticks(struct pt_regs *); | 35 | extern void account_ticks(void); |
36 | 36 | ||
37 | #endif /* __ASM_HARDIRQ_H */ | 37 | #endif /* __ASM_HARDIRQ_H */ |
diff --git a/include/asm-s390/irq_regs.h b/include/asm-s390/irq_regs.h new file mode 100644 index 000000000000..3dd9c0b70270 --- /dev/null +++ b/include/asm-s390/irq_regs.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/irq_regs.h> | |||
diff --git a/include/asm-s390/s390_ext.h b/include/asm-s390/s390_ext.h index e9a2862b230d..df9b1017b703 100644 --- a/include/asm-s390/s390_ext.h +++ b/include/asm-s390/s390_ext.h | |||
@@ -10,7 +10,7 @@ | |||
10 | * Martin Schwidefsky (schwidefsky@de.ibm.com) | 10 | * Martin Schwidefsky (schwidefsky@de.ibm.com) |
11 | */ | 11 | */ |
12 | 12 | ||
13 | typedef void (*ext_int_handler_t)(struct pt_regs *regs, __u16 code); | 13 | typedef void (*ext_int_handler_t)(__u16 code); |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * Warning: if you change ext_int_info_t you have to change the | 16 | * Warning: if you change ext_int_info_t you have to change the |