Merge remote-tracking branches 'asoc/topic/ac97', 'asoc/topic/ac97-mfd', 'asoc/topic...
[sfrench/cifs-2.6.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 */