diff options
Diffstat (limited to 'arch/s390')
-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 |
6 files changed, 21 insertions, 14 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; |