diff options
Diffstat (limited to 'arch/s390/kernel')
-rw-r--r-- | arch/s390/kernel/asm-offsets.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/compat_signal.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/entry.S | 41 | ||||
-rw-r--r-- | arch/s390/kernel/entry64.S | 34 | ||||
-rw-r--r-- | arch/s390/kernel/init_task.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/process.c | 3 | ||||
-rw-r--r-- | arch/s390/kernel/ptrace.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 4 | ||||
-rw-r--r-- | arch/s390/kernel/signal.c | 6 | ||||
-rw-r--r-- | arch/s390/kernel/sys_s390.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/time.c | 13 | ||||
-rw-r--r-- | arch/s390/kernel/topology.c | 11 | ||||
-rw-r--r-- | arch/s390/kernel/vmlinux.lds.S | 3 |
13 files changed, 68 insertions, 57 deletions
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index fa28ecae636b..3d144e6020c6 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
@@ -32,7 +32,7 @@ int main(void) | |||
32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); | 32 | DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs)); |
33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); | 33 | DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2)); |
34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); | 34 | DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc)); |
35 | DEFINE(__PT_TRAP, offsetof(struct pt_regs, trap)); | 35 | DEFINE(__PT_SVCNR, offsetof(struct pt_regs, svcnr)); |
36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); | 36 | DEFINE(__PT_SIZE, sizeof(struct pt_regs)); |
37 | BLANK(); | 37 | BLANK(); |
38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); | 38 | DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain)); |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index c7f02e777af2..b537cb0e9b55 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -340,7 +340,7 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
340 | return err; | 340 | return err; |
341 | 341 | ||
342 | restore_fp_regs(¤t->thread.fp_regs); | 342 | restore_fp_regs(¤t->thread.fp_regs); |
343 | regs->trap = -1; /* disable syscall checks */ | 343 | regs->svcnr = 0; /* disable syscall checks */ |
344 | return 0; | 344 | return 0; |
345 | } | 345 | } |
346 | 346 | ||
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index ed500ef799b7..198ea18a534d 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 56 | |||
46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 60 |
47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
51 | 51 | ||
52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ |
@@ -61,22 +61,25 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
61 | 61 | ||
62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
64 | l %r1,BASED(.Ltrace_irq_on) | 64 | basr %r2,%r0 |
65 | l %r1,BASED(.Ltrace_irq_on_caller) | ||
65 | basr %r14,%r1 | 66 | basr %r14,%r1 |
66 | .endm | 67 | .endm |
67 | 68 | ||
68 | .macro TRACE_IRQS_OFF | 69 | .macro TRACE_IRQS_OFF |
69 | l %r1,BASED(.Ltrace_irq_off) | 70 | basr %r2,%r0 |
71 | l %r1,BASED(.Ltrace_irq_off_caller) | ||
70 | basr %r14,%r1 | 72 | basr %r14,%r1 |
71 | .endm | 73 | .endm |
72 | 74 | ||
73 | .macro TRACE_IRQS_CHECK | 75 | .macro TRACE_IRQS_CHECK |
76 | basr %r2,%r0 | ||
74 | tm SP_PSW(%r15),0x03 # irqs enabled? | 77 | tm SP_PSW(%r15),0x03 # irqs enabled? |
75 | jz 0f | 78 | jz 0f |
76 | l %r1,BASED(.Ltrace_irq_on) | 79 | l %r1,BASED(.Ltrace_irq_on_caller) |
77 | basr %r14,%r1 | 80 | basr %r14,%r1 |
78 | j 1f | 81 | j 1f |
79 | 0: l %r1,BASED(.Ltrace_irq_off) | 82 | 0: l %r1,BASED(.Ltrace_irq_off_caller) |
80 | basr %r14,%r1 | 83 | basr %r14,%r1 |
81 | 1: | 84 | 1: |
82 | .endm | 85 | .endm |
@@ -180,11 +183,10 @@ STACK_SIZE = 1 << STACK_SHIFT | |||
180 | .macro CREATE_STACK_FRAME psworg,savearea | 183 | .macro CREATE_STACK_FRAME psworg,savearea |
181 | s %r15,BASED(.Lc_spsize) # make room for registers & psw | 184 | s %r15,BASED(.Lc_spsize) # make room for registers & psw |
182 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack | 185 | mvc SP_PSW(8,%r15),0(%r12) # move user PSW to stack |
183 | la %r12,\psworg | ||
184 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 186 | st %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
185 | icm %r12,12,__LC_SVC_ILC | 187 | icm %r12,3,__LC_SVC_ILC |
186 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 188 | stm %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
187 | st %r12,SP_ILC(%r15) | 189 | st %r12,SP_SVCNR(%r15) |
188 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack | 190 | mvc SP_R12(16,%r15),\savearea # move %r12-%r15 to stack |
189 | la %r12,0 | 191 | la %r12,0 |
190 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain | 192 | st %r12,__SF_BACKCHAIN(%r15) # clear back chain |
@@ -261,16 +263,17 @@ sysc_update: | |||
261 | #endif | 263 | #endif |
262 | sysc_do_svc: | 264 | sysc_do_svc: |
263 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 265 | l %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
264 | sla %r7,2 # *4 and test for svc 0 | 266 | ltr %r7,%r7 # test for svc 0 |
265 | bnz BASED(sysc_nr_ok) # svc number > 0 | 267 | bnz BASED(sysc_nr_ok) # svc number > 0 |
266 | # svc 0: system call number in %r1 | 268 | # svc 0: system call number in %r1 |
267 | cl %r1,BASED(.Lnr_syscalls) | 269 | cl %r1,BASED(.Lnr_syscalls) |
268 | bnl BASED(sysc_nr_ok) | 270 | bnl BASED(sysc_nr_ok) |
269 | lr %r7,%r1 # copy svc number to %r7 | 271 | lr %r7,%r1 # copy svc number to %r7 |
270 | sla %r7,2 # *4 | ||
271 | sysc_nr_ok: | 272 | sysc_nr_ok: |
272 | mvc SP_ARGS(4,%r15),SP_R7(%r15) | 273 | mvc SP_ARGS(4,%r15),SP_R7(%r15) |
273 | sysc_do_restart: | 274 | sysc_do_restart: |
275 | sth %r7,SP_SVCNR(%r15) | ||
276 | sll %r7,2 # svc number *4 | ||
274 | l %r8,BASED(.Lsysc_table) | 277 | l %r8,BASED(.Lsysc_table) |
275 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) | 278 | tm __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) |
276 | l %r8,0(%r7,%r8) # get system call addr. | 279 | l %r8,0(%r7,%r8) # get system call addr. |
@@ -373,7 +376,6 @@ sysc_notify_resume: | |||
373 | sysc_restart: | 376 | sysc_restart: |
374 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 377 | ni __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
375 | l %r7,SP_R2(%r15) # load new svc number | 378 | l %r7,SP_R2(%r15) # load new svc number |
376 | sla %r7,2 | ||
377 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument | 379 | mvc SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument |
378 | lm %r2,%r6,SP_R2(%r15) # load svc arguments | 380 | lm %r2,%r6,SP_R2(%r15) # load svc arguments |
379 | b BASED(sysc_do_restart) # restart svc | 381 | b BASED(sysc_do_restart) # restart svc |
@@ -383,7 +385,8 @@ sysc_restart: | |||
383 | # | 385 | # |
384 | sysc_singlestep: | 386 | sysc_singlestep: |
385 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 387 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
386 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 388 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
389 | mvi SP_SVCNR+1(%r15),0xff | ||
387 | la %r2,SP_PTREGS(%r15) # address of register-save area | 390 | la %r2,SP_PTREGS(%r15) # address of register-save area |
388 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 391 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
389 | la %r14,BASED(sysc_return) # load adr. of system return | 392 | la %r14,BASED(sysc_return) # load adr. of system return |
@@ -404,7 +407,7 @@ sysc_tracesys: | |||
404 | bnl BASED(sysc_tracenogo) | 407 | bnl BASED(sysc_tracenogo) |
405 | l %r8,BASED(.Lsysc_table) | 408 | l %r8,BASED(.Lsysc_table) |
406 | lr %r7,%r2 | 409 | lr %r7,%r2 |
407 | sll %r7,2 # *4 | 410 | sll %r7,2 # svc number *4 |
408 | l %r8,0(%r7,%r8) | 411 | l %r8,0(%r7,%r8) |
409 | sysc_tracego: | 412 | sysc_tracego: |
410 | lm %r3,%r6,SP_R3(%r15) | 413 | lm %r3,%r6,SP_R3(%r15) |
@@ -583,7 +586,8 @@ pgm_svcper: | |||
583 | # per was called from kernel, must be kprobes | 586 | # per was called from kernel, must be kprobes |
584 | # | 587 | # |
585 | kernel_per: | 588 | kernel_per: |
586 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | 589 | mvi SP_SVCNR(%r15),0xff # set trap indication to pgm check |
590 | mvi SP_SVCNR+1(%r15),0xff | ||
587 | la %r2,SP_PTREGS(%r15) # address of register-save area | 591 | la %r2,SP_PTREGS(%r15) # address of register-save area |
588 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | 592 | l %r1,BASED(.Lhandle_per) # load adr. of per handler |
589 | la %r14,BASED(sysc_restore)# load adr. of system return | 593 | la %r14,BASED(sysc_restore)# load adr. of system return |
@@ -1113,9 +1117,12 @@ cleanup_io_leave_insn: | |||
1113 | .Lschedtail: .long schedule_tail | 1117 | .Lschedtail: .long schedule_tail |
1114 | .Lsysc_table: .long sys_call_table | 1118 | .Lsysc_table: .long sys_call_table |
1115 | #ifdef CONFIG_TRACE_IRQFLAGS | 1119 | #ifdef CONFIG_TRACE_IRQFLAGS |
1116 | .Ltrace_irq_on: .long trace_hardirqs_on | 1120 | .Ltrace_irq_on_caller: |
1117 | .Ltrace_irq_off: | 1121 | .long trace_hardirqs_on_caller |
1118 | .long trace_hardirqs_off | 1122 | .Ltrace_irq_off_caller: |
1123 | .long trace_hardirqs_off_caller | ||
1124 | #endif | ||
1125 | #ifdef CONFIG_LOCKDEP | ||
1119 | .Llockdep_sys_exit: | 1126 | .Llockdep_sys_exit: |
1120 | .long lockdep_sys_exit | 1127 | .long lockdep_sys_exit |
1121 | #endif | 1128 | #endif |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index d7ce150453f2..89c121ae6339 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -46,7 +46,7 @@ SP_R14 = STACK_FRAME_OVERHEAD + __PT_GPRS + 112 | |||
46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 | 46 | SP_R15 = STACK_FRAME_OVERHEAD + __PT_GPRS + 120 |
47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 | 47 | SP_ORIG_R2 = STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2 |
48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | 48 | SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC |
49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_SVCNR = STACK_FRAME_OVERHEAD + __PT_SVCNR |
50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
51 | 51 | ||
52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | 52 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER |
@@ -61,19 +61,22 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
61 | 61 | ||
62 | #ifdef CONFIG_TRACE_IRQFLAGS | 62 | #ifdef CONFIG_TRACE_IRQFLAGS |
63 | .macro TRACE_IRQS_ON | 63 | .macro TRACE_IRQS_ON |
64 | brasl %r14,trace_hardirqs_on | 64 | basr %r2,%r0 |
65 | brasl %r14,trace_hardirqs_on_caller | ||
65 | .endm | 66 | .endm |
66 | 67 | ||
67 | .macro TRACE_IRQS_OFF | 68 | .macro TRACE_IRQS_OFF |
68 | brasl %r14,trace_hardirqs_off | 69 | basr %r2,%r0 |
70 | brasl %r14,trace_hardirqs_off_caller | ||
69 | .endm | 71 | .endm |
70 | 72 | ||
71 | .macro TRACE_IRQS_CHECK | 73 | .macro TRACE_IRQS_CHECK |
74 | basr %r2,%r0 | ||
72 | tm SP_PSW(%r15),0x03 # irqs enabled? | 75 | tm SP_PSW(%r15),0x03 # irqs enabled? |
73 | jz 0f | 76 | jz 0f |
74 | brasl %r14,trace_hardirqs_on | 77 | brasl %r14,trace_hardirqs_on_caller |
75 | j 1f | 78 | j 1f |
76 | 0: brasl %r14,trace_hardirqs_off | 79 | 0: brasl %r14,trace_hardirqs_off_caller |
77 | 1: | 80 | 1: |
78 | .endm | 81 | .endm |
79 | #else | 82 | #else |
@@ -168,11 +171,10 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | |||
168 | .macro CREATE_STACK_FRAME psworg,savearea | 171 | .macro CREATE_STACK_FRAME psworg,savearea |
169 | aghi %r15,-SP_SIZE # make room for registers & psw | 172 | aghi %r15,-SP_SIZE # make room for registers & psw |
170 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack | 173 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack |
171 | la %r12,\psworg | ||
172 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 | 174 | stg %r2,SP_ORIG_R2(%r15) # store original content of gpr 2 |
173 | icm %r12,12,__LC_SVC_ILC | 175 | icm %r12,3,__LC_SVC_ILC |
174 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 176 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
175 | st %r12,SP_ILC(%r15) | 177 | st %r12,SP_SVCNR(%r15) |
176 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack | 178 | mvc SP_R12(32,%r15),\savearea # move %r12-%r15 to stack |
177 | la %r12,0 | 179 | la %r12,0 |
178 | stg %r12,__SF_BACKCHAIN(%r15) | 180 | stg %r12,__SF_BACKCHAIN(%r15) |
@@ -247,16 +249,17 @@ sysc_update: | |||
247 | #endif | 249 | #endif |
248 | sysc_do_svc: | 250 | sysc_do_svc: |
249 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 251 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
250 | slag %r7,%r7,2 # *4 and test for svc 0 | 252 | ltgr %r7,%r7 # test for svc 0 |
251 | jnz sysc_nr_ok | 253 | jnz sysc_nr_ok |
252 | # svc 0: system call number in %r1 | 254 | # svc 0: system call number in %r1 |
253 | cl %r1,BASED(.Lnr_syscalls) | 255 | cl %r1,BASED(.Lnr_syscalls) |
254 | jnl sysc_nr_ok | 256 | jnl sysc_nr_ok |
255 | lgfr %r7,%r1 # clear high word in r1 | 257 | lgfr %r7,%r1 # clear high word in r1 |
256 | slag %r7,%r7,2 # svc 0: system call number in %r1 | ||
257 | sysc_nr_ok: | 258 | sysc_nr_ok: |
258 | mvc SP_ARGS(8,%r15),SP_R7(%r15) | 259 | mvc SP_ARGS(8,%r15),SP_R7(%r15) |
259 | sysc_do_restart: | 260 | sysc_do_restart: |
261 | sth %r7,SP_SVCNR(%r15) | ||
262 | sllg %r7,%r7,2 # svc number * 4 | ||
260 | larl %r10,sys_call_table | 263 | larl %r10,sys_call_table |
261 | #ifdef CONFIG_COMPAT | 264 | #ifdef CONFIG_COMPAT |
262 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? | 265 | tm __TI_flags+5(%r9),(_TIF_31BIT>>16) # running in 31 bit mode ? |
@@ -360,7 +363,6 @@ sysc_notify_resume: | |||
360 | sysc_restart: | 363 | sysc_restart: |
361 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC | 364 | ni __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC |
362 | lg %r7,SP_R2(%r15) # load new svc number | 365 | lg %r7,SP_R2(%r15) # load new svc number |
363 | slag %r7,%r7,2 # *4 | ||
364 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument | 366 | mvc SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument |
365 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments | 367 | lmg %r2,%r6,SP_R2(%r15) # load svc arguments |
366 | j sysc_do_restart # restart svc | 368 | j sysc_do_restart # restart svc |
@@ -369,9 +371,8 @@ sysc_restart: | |||
369 | # _TIF_SINGLE_STEP is set, call do_single_step | 371 | # _TIF_SINGLE_STEP is set, call do_single_step |
370 | # | 372 | # |
371 | sysc_singlestep: | 373 | sysc_singlestep: |
372 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 374 | ni __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
373 | lhi %r0,__LC_PGM_OLD_PSW | 375 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
374 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
375 | la %r2,SP_PTREGS(%r15) # address of register-save area | 376 | la %r2,SP_PTREGS(%r15) # address of register-save area |
376 | larl %r14,sysc_return # load adr. of system return | 377 | larl %r14,sysc_return # load adr. of system return |
377 | jg do_single_step # branch to do_sigtrap | 378 | jg do_single_step # branch to do_sigtrap |
@@ -389,7 +390,7 @@ sysc_tracesys: | |||
389 | lghi %r0,NR_syscalls | 390 | lghi %r0,NR_syscalls |
390 | clgr %r0,%r2 | 391 | clgr %r0,%r2 |
391 | jnh sysc_tracenogo | 392 | jnh sysc_tracenogo |
392 | slag %r7,%r2,2 # *4 | 393 | sllg %r7,%r2,2 # svc number *4 |
393 | lgf %r8,0(%r7,%r10) | 394 | lgf %r8,0(%r7,%r10) |
394 | sysc_tracego: | 395 | sysc_tracego: |
395 | lmg %r3,%r6,SP_R3(%r15) | 396 | lmg %r3,%r6,SP_R3(%r15) |
@@ -564,8 +565,7 @@ pgm_svcper: | |||
564 | # per was called from kernel, must be kprobes | 565 | # per was called from kernel, must be kprobes |
565 | # | 566 | # |
566 | kernel_per: | 567 | kernel_per: |
567 | lhi %r0,__LC_PGM_OLD_PSW | 568 | xc SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number |
568 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
569 | la %r2,SP_PTREGS(%r15) # address of register-save area | 569 | la %r2,SP_PTREGS(%r15) # address of register-save area |
570 | larl %r14,sysc_restore # load adr. of system ret, no work | 570 | larl %r14,sysc_restore # load adr. of system ret, no work |
571 | jg do_single_step # branch to do_single_step | 571 | jg do_single_step # branch to do_single_step |
diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c index 7ad003969251..e80716843619 100644 --- a/arch/s390/kernel/init_task.c +++ b/arch/s390/kernel/init_task.c | |||
@@ -26,7 +26,7 @@ EXPORT_SYMBOL(init_mm); | |||
26 | /* | 26 | /* |
27 | * Initial thread structure. | 27 | * Initial thread structure. |
28 | * | 28 | * |
29 | * We need to make sure that this is 8192-byte aligned due to the | 29 | * We need to make sure that this is THREAD_SIZE aligned due to the |
30 | * way process stacks are handled. This is done by having a special | 30 | * way process stacks are handled. This is done by having a special |
31 | * "init_task" linker map entry.. | 31 | * "init_task" linker map entry.. |
32 | */ | 32 | */ |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3e2c05cb6a87..04f8c67a6101 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -136,9 +136,12 @@ static void default_idle(void) | |||
136 | return; | 136 | return; |
137 | } | 137 | } |
138 | trace_hardirqs_on(); | 138 | trace_hardirqs_on(); |
139 | /* Don't trace preempt off for idle. */ | ||
140 | stop_critical_timings(); | ||
139 | /* Wait for external, I/O or machine check interrupt. */ | 141 | /* Wait for external, I/O or machine check interrupt. */ |
140 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | | 142 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | |
141 | PSW_MASK_IO | PSW_MASK_EXT); | 143 | PSW_MASK_IO | PSW_MASK_EXT); |
144 | start_critical_timings(); | ||
142 | } | 145 | } |
143 | 146 | ||
144 | void cpu_idle(void) | 147 | void cpu_idle(void) |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 1f31be1ecc4b..38ff2bce1203 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -657,7 +657,7 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) | |||
657 | * debugger stored an invalid system call number. Skip | 657 | * debugger stored an invalid system call number. Skip |
658 | * the system call and the system call restart handling. | 658 | * the system call and the system call restart handling. |
659 | */ | 659 | */ |
660 | regs->trap = -1; | 660 | regs->svcnr = 0; |
661 | ret = -1; | 661 | ret = -1; |
662 | } | 662 | } |
663 | 663 | ||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 62122bad1e33..400b040df7fa 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -604,13 +604,13 @@ setup_memory(void) | |||
604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) | 604 | if (memory_chunk[i].type != CHUNK_READ_WRITE) |
605 | continue; | 605 | continue; |
606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); | 606 | start_chunk = PFN_DOWN(memory_chunk[i].addr); |
607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1; | 607 | end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size); |
608 | end_chunk = min(end_chunk, end_pfn); | 608 | end_chunk = min(end_chunk, end_pfn); |
609 | if (start_chunk >= end_chunk) | 609 | if (start_chunk >= end_chunk) |
610 | continue; | 610 | continue; |
611 | add_active_range(0, start_chunk, end_chunk); | 611 | add_active_range(0, start_chunk, end_chunk); |
612 | pfn = max(start_chunk, start_pfn); | 612 | pfn = max(start_chunk, start_pfn); |
613 | for (; pfn <= end_chunk; pfn++) | 613 | for (; pfn < end_chunk; pfn++) |
614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); | 614 | page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY); |
615 | } | 615 | } |
616 | 616 | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4f7fc3059a8e..8e6812a22670 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -160,7 +160,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; | 160 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; |
161 | 161 | ||
162 | restore_fp_regs(¤t->thread.fp_regs); | 162 | restore_fp_regs(¤t->thread.fp_regs); |
163 | regs->trap = -1; /* disable syscall checks */ | 163 | regs->svcnr = 0; /* disable syscall checks */ |
164 | return 0; | 164 | return 0; |
165 | } | 165 | } |
166 | 166 | ||
@@ -445,7 +445,7 @@ void do_signal(struct pt_regs *regs) | |||
445 | oldset = ¤t->blocked; | 445 | oldset = ¤t->blocked; |
446 | 446 | ||
447 | /* Are we from a system call? */ | 447 | /* Are we from a system call? */ |
448 | if (regs->trap == __LC_SVC_OLD_PSW) { | 448 | if (regs->svcnr) { |
449 | continue_addr = regs->psw.addr; | 449 | continue_addr = regs->psw.addr; |
450 | restart_addr = continue_addr - regs->ilc; | 450 | restart_addr = continue_addr - regs->ilc; |
451 | retval = regs->gprs[2]; | 451 | retval = regs->gprs[2]; |
@@ -462,7 +462,7 @@ void do_signal(struct pt_regs *regs) | |||
462 | case -ERESTART_RESTARTBLOCK: | 462 | case -ERESTART_RESTARTBLOCK: |
463 | regs->gprs[2] = -EINTR; | 463 | regs->gprs[2] = -EINTR; |
464 | } | 464 | } |
465 | regs->trap = -1; /* Don't deal with this again. */ | 465 | regs->svcnr = 0; /* Don't deal with this again. */ |
466 | } | 466 | } |
467 | 467 | ||
468 | /* Get signal to deliver. When running under ptrace, at this point | 468 | /* Get signal to deliver. When running under ptrace, at this point |
diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c index 5fdb799062b7..4fe952e557ac 100644 --- a/arch/s390/kernel/sys_s390.c +++ b/arch/s390/kernel/sys_s390.c | |||
@@ -198,7 +198,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name) | |||
198 | { | 198 | { |
199 | int ret = sys_newuname(name); | 199 | int ret = sys_newuname(name); |
200 | 200 | ||
201 | if (current->personality == PER_LINUX32 && !ret) { | 201 | if (personality(current->personality) == PER_LINUX32 && !ret) { |
202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); | 202 | ret = copy_to_user(name->machine, "s390\0\0\0\0", 8); |
203 | if (ret) ret = -EFAULT; | 203 | if (ret) ret = -EFAULT; |
204 | } | 204 | } |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index b94e9e3b694a..eccefbbff887 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -59,7 +59,7 @@ | |||
59 | 59 | ||
60 | static ext_int_info_t ext_int_info_cc; | 60 | static ext_int_info_t ext_int_info_cc; |
61 | static ext_int_info_t ext_int_etr_cc; | 61 | static ext_int_info_t ext_int_etr_cc; |
62 | static u64 jiffies_timer_cc; | 62 | static u64 sched_clock_base_cc; |
63 | 63 | ||
64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); | 64 | static DEFINE_PER_CPU(struct clock_event_device, comparators); |
65 | 65 | ||
@@ -68,7 +68,7 @@ static DEFINE_PER_CPU(struct clock_event_device, comparators); | |||
68 | */ | 68 | */ |
69 | unsigned long long sched_clock(void) | 69 | unsigned long long sched_clock(void) |
70 | { | 70 | { |
71 | return ((get_clock_xt() - jiffies_timer_cc) * 125) >> 9; | 71 | return ((get_clock_xt() - sched_clock_base_cc) * 125) >> 9; |
72 | } | 72 | } |
73 | 73 | ||
74 | /* | 74 | /* |
@@ -229,13 +229,10 @@ static struct clocksource clocksource_tod = { | |||
229 | */ | 229 | */ |
230 | void __init time_init(void) | 230 | void __init time_init(void) |
231 | { | 231 | { |
232 | u64 init_timer_cc; | 232 | sched_clock_base_cc = reset_tod_clock(); |
233 | |||
234 | init_timer_cc = reset_tod_clock(); | ||
235 | jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY; | ||
236 | 233 | ||
237 | /* set xtime */ | 234 | /* set xtime */ |
238 | tod_to_timeval(init_timer_cc - TOD_UNIX_EPOCH, &xtime); | 235 | tod_to_timeval(sched_clock_base_cc - TOD_UNIX_EPOCH, &xtime); |
239 | set_normalized_timespec(&wall_to_monotonic, | 236 | set_normalized_timespec(&wall_to_monotonic, |
240 | -xtime.tv_sec, -xtime.tv_nsec); | 237 | -xtime.tv_sec, -xtime.tv_nsec); |
241 | 238 | ||
@@ -289,7 +286,7 @@ static unsigned long long adjust_time(unsigned long long old, | |||
289 | delta = -delta; | 286 | delta = -delta; |
290 | adjust.offset = -ticks * (1000000 / HZ); | 287 | adjust.offset = -ticks * (1000000 / HZ); |
291 | } | 288 | } |
292 | jiffies_timer_cc += delta; | 289 | sched_clock_base_cc += delta; |
293 | if (adjust.offset != 0) { | 290 | if (adjust.offset != 0) { |
294 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", | 291 | printk(KERN_NOTICE "etr: time adjusted by %li micro-seconds\n", |
295 | adjust.offset); | 292 | adjust.offset); |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 632b13e10053..a947899dcba1 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -65,18 +65,21 @@ static int machine_has_topology_irq; | |||
65 | static struct timer_list topology_timer; | 65 | static struct timer_list topology_timer; |
66 | static void set_topology_timer(void); | 66 | static void set_topology_timer(void); |
67 | static DECLARE_WORK(topology_work, topology_work_fn); | 67 | static DECLARE_WORK(topology_work, topology_work_fn); |
68 | /* topology_lock protects the core linked list */ | ||
69 | static DEFINE_SPINLOCK(topology_lock); | ||
68 | 70 | ||
69 | cpumask_t cpu_core_map[NR_CPUS]; | 71 | cpumask_t cpu_core_map[NR_CPUS]; |
70 | 72 | ||
71 | cpumask_t cpu_coregroup_map(unsigned int cpu) | 73 | cpumask_t cpu_coregroup_map(unsigned int cpu) |
72 | { | 74 | { |
73 | struct core_info *core = &core_info; | 75 | struct core_info *core = &core_info; |
76 | unsigned long flags; | ||
74 | cpumask_t mask; | 77 | cpumask_t mask; |
75 | 78 | ||
76 | cpus_clear(mask); | 79 | cpus_clear(mask); |
77 | if (!machine_has_topology) | 80 | if (!machine_has_topology) |
78 | return cpu_present_map; | 81 | return cpu_present_map; |
79 | mutex_lock(&smp_cpu_state_mutex); | 82 | spin_lock_irqsave(&topology_lock, flags); |
80 | while (core) { | 83 | while (core) { |
81 | if (cpu_isset(cpu, core->mask)) { | 84 | if (cpu_isset(cpu, core->mask)) { |
82 | mask = core->mask; | 85 | mask = core->mask; |
@@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu) | |||
84 | } | 87 | } |
85 | core = core->next; | 88 | core = core->next; |
86 | } | 89 | } |
87 | mutex_unlock(&smp_cpu_state_mutex); | 90 | spin_unlock_irqrestore(&topology_lock, flags); |
88 | if (cpus_empty(mask)) | 91 | if (cpus_empty(mask)) |
89 | mask = cpumask_of_cpu(cpu); | 92 | mask = cpumask_of_cpu(cpu); |
90 | return mask; | 93 | return mask; |
@@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info) | |||
133 | union tl_entry *tle, *end; | 136 | union tl_entry *tle, *end; |
134 | struct core_info *core = &core_info; | 137 | struct core_info *core = &core_info; |
135 | 138 | ||
136 | mutex_lock(&smp_cpu_state_mutex); | 139 | spin_lock_irq(&topology_lock); |
137 | clear_cores(); | 140 | clear_cores(); |
138 | tle = info->tle; | 141 | tle = info->tle; |
139 | end = (union tl_entry *)((unsigned long)info + info->length); | 142 | end = (union tl_entry *)((unsigned long)info + info->length); |
@@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info) | |||
157 | } | 160 | } |
158 | tle = next_tle(tle); | 161 | tle = next_tle(tle); |
159 | } | 162 | } |
160 | mutex_unlock(&smp_cpu_state_mutex); | 163 | spin_unlock_irq(&topology_lock); |
161 | } | 164 | } |
162 | 165 | ||
163 | static void topology_update_polarization_simple(void) | 166 | static void topology_update_polarization_simple(void) |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index 607bd67a18ce..d796d05c9c01 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -2,6 +2,7 @@ | |||
2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) | 2 | * Written by Martin Schwidefsky (schwidefsky@de.ibm.com) |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <asm/thread_info.h> | ||
5 | #include <asm/page.h> | 6 | #include <asm/page.h> |
6 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
7 | 8 | ||
@@ -86,7 +87,7 @@ SECTIONS | |||
86 | } | 87 | } |
87 | _edata = .; /* End of data section */ | 88 | _edata = .; /* End of data section */ |
88 | 89 | ||
89 | . = ALIGN(2 * PAGE_SIZE); /* init_task */ | 90 | . = ALIGN(THREAD_SIZE); /* init_task */ |
90 | .data.init_task : { | 91 | .data.init_task : { |
91 | *(.data.init_task) | 92 | *(.data.init_task) |
92 | } | 93 | } |