[S390] kernel: Initialize register 14 when starting new CPU
When starting a new CPU we currently jump to start_secondary() without setting register 14 (the return address) correctly. Therefore on the stack frame for start_secondary an invalid return address is stored. This leads to wrong stack back traces in kernel dumps. Example: #00 [1f33fe48] cpu_idle at 10614a #01 [1f33fe90] start_secondary at 54fa88 #02 [1f33feb8] (null) at 0 <--- invalid To fix this start_secondary() is called now with basr/brasl that sets register 14 correctly. The output of the stack backtrace looks then like the following: #00 [1f33fe48] cpu_idle at 10614a #01 [1f33fe90] start_secondary at 54fa88 #02 [1f33feb8] restart_base at 54f41e <--- correct Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
aade6c0dfb
commit
8eb4bd666f
|
@ -836,7 +836,7 @@ restart_base:
|
|||
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
||||
basr %r14,0
|
||||
l %r14,restart_addr-.(%r14)
|
||||
br %r14 # branch to start_secondary
|
||||
basr %r14,%r14 # branch to start_secondary
|
||||
restart_addr:
|
||||
.long start_secondary
|
||||
.align 8
|
||||
|
|
|
@ -841,7 +841,7 @@ restart_base:
|
|||
mvc __LC_SYSTEM_TIMER(8),__TI_system_timer(%r1)
|
||||
xc __LC_STEAL_TIMER(8),__LC_STEAL_TIMER
|
||||
stosm __SF_EMPTY(%r15),0x04 # now we can turn dat on
|
||||
jg start_secondary
|
||||
brasl %r14,start_secondary
|
||||
.align 8
|
||||
restart_vtime:
|
||||
.long 0x7fffffff,0xffffffff
|
||||
|
|
Loading…
Reference in New Issue