diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-02-03 11:37:15 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-02-05 05:00:50 -0500 |
commit | 8d7f6690cedb83456edd41c9bd583783f0703bf0 (patch) | |
tree | b7b45c28d9f5d84b7e2aa1e813c32e6f18bd481e /arch/s390/kernel/head64.S | |
parent | d7736ff5be31edaa4fe5ab62810c64529a24b149 (diff) |
s390: fix kernel crash due to linkage stack instructions
The kernel currently crashes with a low-address-protection exception
if a user space process executes an instruction that tries to use the
linkage stack. Set the base-ASTE origin and the subspace-ASTE origin
of the dispatchable-unit-control-table to point to a dummy ASTE.
Set up control register 15 to point to an empty linkage stack with no
room left.
A user space process with a linkage stack instruction will still crash
but with a different exception which is correctly translated to a
segmentation fault instead of a kernel oops.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/head64.S')
-rw-r--r-- | arch/s390/kernel/head64.S | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index b9e25ae2579c..d7c00507568a 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -59,7 +59,7 @@ ENTRY(startup_continue) | |||
59 | .quad 0 # cr12: tracing off | 59 | .quad 0 # cr12: tracing off |
60 | .quad 0 # cr13: home space segment table | 60 | .quad 0 # cr13: home space segment table |
61 | .quad 0xc0000000 # cr14: machine check handling off | 61 | .quad 0xc0000000 # cr14: machine check handling off |
62 | .quad 0 # cr15: linkage stack operations | 62 | .quad .Llinkage_stack # cr15: linkage stack operations |
63 | .Lpcmsk:.quad 0x0000000180000000 | 63 | .Lpcmsk:.quad 0x0000000180000000 |
64 | .L4malign:.quad 0xffffffffffc00000 | 64 | .L4malign:.quad 0xffffffffffc00000 |
65 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 | 65 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 |
@@ -67,12 +67,15 @@ ENTRY(startup_continue) | |||
67 | .Lparmaddr: | 67 | .Lparmaddr: |
68 | .quad PARMAREA | 68 | .quad PARMAREA |
69 | .align 64 | 69 | .align 64 |
70 | .Lduct: .long 0,0,0,0,.Lduald,0,0,0 | 70 | .Lduct: .long 0,.Laste,.Laste,0,.Lduald,0,0,0 |
71 | .long 0,0,0,0,0,0,0,0 | 71 | .long 0,0,0,0,0,0,0,0 |
72 | .Laste: .quad 0,0xffffffffffffffff,0,0,0,0,0,0 | ||
72 | .align 128 | 73 | .align 128 |
73 | .Lduald:.rept 8 | 74 | .Lduald:.rept 8 |
74 | .long 0x80000000,0,0,0 # invalid access-list entries | 75 | .long 0x80000000,0,0,0 # invalid access-list entries |
75 | .endr | 76 | .endr |
77 | .Llinkage_stack: | ||
78 | .long 0,0,0x89000000,0,0,0,0x8a000000,0 | ||
76 | 79 | ||
77 | ENTRY(_ehead) | 80 | ENTRY(_ehead) |
78 | 81 | ||