]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/s390/kernel/head_kdump.S
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[mirror_ubuntu-bionic-kernel.git] / arch / s390 / kernel / head_kdump.S
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 <holzheu@linux.vnet.ibm.com>
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 .align 2
23 .Lep_startup_kdump:
24 lhi %r1,2 # mode 2 = esame (dump)
25 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode
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
89 0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel...
90 .align 8
91 .Lrestart_psw:
92 .quad 0x0000000080000000,0x0000000000000000 + startup
93 #else
94 .align 2
95 .Lep_startup_kdump:
96 larl %r13,startup_kdump_crash
97 lpswe 0(%r13)
98 .align 8
99 startup_kdump_crash:
100 .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash
101 #endif /* CONFIG_CRASH_DUMP */