Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/s390/boot/head_kdump.S
26424 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* S390 kdump lowlevel functions (new kernel)
4
*
5
* Copyright IBM Corp. 2011
6
* Author(s): Michael Holzheu <[email protected]>
7
*/
8
9
#include <asm/sigp.h>
10
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
SYM_CODE_START_LOCAL(startup_kdump)
23
lhi %r1,2 # mode 2 = esame (dump)
24
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode
25
sam64 # Switch to 64 bit addressing
26
basr %r13,0
27
.Lbase:
28
larl %r2,.Lbase_addr # Check, if we have been
29
lg %r2,0(%r2) # already relocated:
30
clgr %r2,%r13 #
31
jne .Lrelocate # No : Start data mover
32
lghi %r2,0 # Yes: Start kdump kernel
33
brasl %r14,startup_kdump_relocated
34
35
.Lrelocate:
36
larl %r4,startup
37
lg %r2,0x418(%r4) # Get kdump base
38
lg %r3,0x420(%r4) # Get kdump size
39
40
larl %r10,.Lcopy_start # Source of data mover
41
lghi %r8,DATAMOVER_ADDR # Target of data mover
42
mvc 0(256,%r8),0(%r10) # Copy data mover code
43
44
agr %r8,%r2 # Copy data mover to
45
mvc 0(256,%r8),0(%r10) # reserved mem
46
47
lghi %r14,DATAMOVER_ADDR # Jump to copied data mover
48
basr %r14,%r14
49
.Lbase_addr:
50
.quad .Lbase
51
52
#
53
# kdump data mover code (runs at address DATAMOVER_ADDR)
54
#
55
# r2: kdump base address
56
# r3: kdump size
57
#
58
.Lcopy_start:
59
basr %r13,0 # Base
60
0:
61
lgr %r11,%r2 # Save kdump base address
62
lgr %r12,%r2
63
agr %r12,%r3 # Compute kdump end address
64
65
lghi %r5,0
66
lghi %r10,COPY_PAGE_ADDR # Load copy page address
67
1:
68
mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp
69
mvc 0(256,%r5),0(%r11) # Copy new kernel to old
70
mvc 0(256,%r11),0(%r10) # Copy tmp to new
71
aghi %r11,256
72
aghi %r5,256
73
clgr %r11,%r12
74
jl 1b
75
76
lg %r14,.Lstartup_kdump-0b(%r13)
77
basr %r14,%r14 # Start relocated kernel
78
.Lstartup_kdump:
79
.long 0x00000000,0x00000000 + startup_kdump_relocated
80
.Lcopy_end:
81
82
#
83
# Startup of kdump (relocated new kernel)
84
#
85
.balign 2
86
startup_kdump_relocated:
87
basr %r13,0
88
0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel...
89
SYM_CODE_END(startup_kdump)
90
.balign 8
91
.Lrestart_psw:
92
.quad 0x0000000080000000,0x0000000000000000 + startup
93
#else
94
SYM_CODE_START_LOCAL(startup_kdump)
95
larl %r13,startup_kdump_crash
96
lpswe 0(%r13)
97
SYM_CODE_END(startup_kdump)
98
.balign 8
99
startup_kdump_crash:
100
.quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash
101
#endif /* CONFIG_CRASH_DUMP */
102
103