]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
60a0c68d MH |
2 | /* |
3 | * S390 kdump lowlevel functions (new kernel) | |
4 | * | |
5 | * Copyright IBM Corp. 2011 | |
6 | * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com> | |
7 | */ | |
8 | ||
eb546195 HC |
9 | #include <asm/sigp.h> |
10 | ||
60a0c68d MH |
11 | #define DATAMOVER_ADDR 0x4000 |
12 | #define COPY_PAGE_ADDR 0x6000 | |
13 | ||
14 | #ifdef CONFIG_CRASH_DUMP | |
15 | ||
16 | # | |
17 | # kdump entry (new kernel - not yet relocated) | |
18 | # | |
19 | # Note: This code has to be position independent | |
20 | # | |
21 | ||
22 | .align 2 | |
23 | .Lep_startup_kdump: | |
24 | lhi %r1,2 # mode 2 = esame (dump) | |
eb546195 | 25 | sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode |
60a0c68d MH |
26 | sam64 # Switch to 64 bit addressing |
27 | basr %r13,0 | |
28 | .Lbase: | |
29 | larl %r2,.Lbase_addr # Check, if we have been | |
30 | lg %r2,0(%r2) # already relocated: | |
31 | clgr %r2,%r13 # | |
32 | jne .Lrelocate # No : Start data mover | |
33 | lghi %r2,0 # Yes: Start kdump kernel | |
34 | brasl %r14,startup_kdump_relocated | |
35 | ||
36 | .Lrelocate: | |
37 | larl %r4,startup | |
38 | lg %r2,0x418(%r4) # Get kdump base | |
39 | lg %r3,0x420(%r4) # Get kdump size | |
40 | ||
41 | larl %r10,.Lcopy_start # Source of data mover | |
42 | lghi %r8,DATAMOVER_ADDR # Target of data mover | |
43 | mvc 0(256,%r8),0(%r10) # Copy data mover code | |
44 | ||
45 | agr %r8,%r2 # Copy data mover to | |
46 | mvc 0(256,%r8),0(%r10) # reserved mem | |
47 | ||
48 | lghi %r14,DATAMOVER_ADDR # Jump to copied data mover | |
49 | basr %r14,%r14 | |
50 | .Lbase_addr: | |
51 | .quad .Lbase | |
52 | ||
53 | # | |
54 | # kdump data mover code (runs at address DATAMOVER_ADDR) | |
55 | # | |
56 | # r2: kdump base address | |
57 | # r3: kdump size | |
58 | # | |
59 | .Lcopy_start: | |
60 | basr %r13,0 # Base | |
61 | 0: | |
62 | lgr %r11,%r2 # Save kdump base address | |
63 | lgr %r12,%r2 | |
64 | agr %r12,%r3 # Compute kdump end address | |
65 | ||
66 | lghi %r5,0 | |
67 | lghi %r10,COPY_PAGE_ADDR # Load copy page address | |
68 | 1: | |
69 | mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp | |
70 | mvc 0(256,%r5),0(%r11) # Copy new kernel to old | |
71 | mvc 0(256,%r11),0(%r10) # Copy tmp to new | |
72 | aghi %r11,256 | |
73 | aghi %r5,256 | |
74 | clgr %r11,%r12 | |
75 | jl 1b | |
76 | ||
77 | lg %r14,.Lstartup_kdump-0b(%r13) | |
78 | basr %r14,%r14 # Start relocated kernel | |
79 | .Lstartup_kdump: | |
80 | .long 0x00000000,0x00000000 + startup_kdump_relocated | |
81 | .Lcopy_end: | |
82 | ||
83 | # | |
84 | # Startup of kdump (relocated new kernel) | |
85 | # | |
86 | .align 2 | |
87 | startup_kdump_relocated: | |
88 | basr %r13,0 | |
9db8c050 | 89 | 0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel... |
60a0c68d MH |
90 | .align 8 |
91 | .Lrestart_psw: | |
9db8c050 | 92 | .quad 0x0000000080000000,0x0000000000000000 + startup |
60a0c68d MH |
93 | #else |
94 | .align 2 | |
95 | .Lep_startup_kdump: | |
60a0c68d MH |
96 | larl %r13,startup_kdump_crash |
97 | lpswe 0(%r13) | |
98 | .align 8 | |
99 | startup_kdump_crash: | |
100 | .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash | |
60a0c68d | 101 | #endif /* CONFIG_CRASH_DUMP */ |