diff options
author | Michael Holzheu <holzheu@linux.vnet.ibm.com> | 2011-10-30 10:16:40 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-10-30 10:16:42 -0400 |
commit | 60a0c68df2632feaa4a986af084650d1165d89c5 (patch) | |
tree | f55907defeab43de02a5a3127c8d5a694a21b3a2 /arch/s390/kernel/head_kdump.S | |
parent | 7f0bf656c66e4292e965c95fd9de55c72b6578bb (diff) |
[S390] kdump backend code
This patch provides the architecture specific part of the s390 kdump
support.
Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/head_kdump.S')
-rw-r--r-- | arch/s390/kernel/head_kdump.S | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/arch/s390/kernel/head_kdump.S b/arch/s390/kernel/head_kdump.S new file mode 100644 index 000000000000..e1ac3893e972 --- /dev/null +++ b/arch/s390/kernel/head_kdump.S | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * S390 kdump lowlevel functions (new kernel) | ||
3 | * | ||
4 | * Copyright IBM Corp. 2011 | ||
5 | * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #define DATAMOVER_ADDR 0x4000 | ||
9 | #define COPY_PAGE_ADDR 0x6000 | ||
10 | |||
11 | #ifdef CONFIG_CRASH_DUMP | ||
12 | |||
13 | # | ||
14 | # kdump entry (new kernel - not yet relocated) | ||
15 | # | ||
16 | # Note: This code has to be position independent | ||
17 | # | ||
18 | |||
19 | .align 2 | ||
20 | .Lep_startup_kdump: | ||
21 | lhi %r1,2 # mode 2 = esame (dump) | ||
22 | sigp %r1,%r0,0x12 # Switch to esame mode | ||
23 | sam64 # Switch to 64 bit addressing | ||
24 | basr %r13,0 | ||
25 | .Lbase: | ||
26 | larl %r2,.Lbase_addr # Check, if we have been | ||
27 | lg %r2,0(%r2) # already relocated: | ||
28 | clgr %r2,%r13 # | ||
29 | jne .Lrelocate # No : Start data mover | ||
30 | lghi %r2,0 # Yes: Start kdump kernel | ||
31 | brasl %r14,startup_kdump_relocated | ||
32 | |||
33 | .Lrelocate: | ||
34 | larl %r4,startup | ||
35 | lg %r2,0x418(%r4) # Get kdump base | ||
36 | lg %r3,0x420(%r4) # Get kdump size | ||
37 | |||
38 | larl %r10,.Lcopy_start # Source of data mover | ||
39 | lghi %r8,DATAMOVER_ADDR # Target of data mover | ||
40 | mvc 0(256,%r8),0(%r10) # Copy data mover code | ||
41 | |||
42 | agr %r8,%r2 # Copy data mover to | ||
43 | mvc 0(256,%r8),0(%r10) # reserved mem | ||
44 | |||
45 | lghi %r14,DATAMOVER_ADDR # Jump to copied data mover | ||
46 | basr %r14,%r14 | ||
47 | .Lbase_addr: | ||
48 | .quad .Lbase | ||
49 | |||
50 | # | ||
51 | # kdump data mover code (runs at address DATAMOVER_ADDR) | ||
52 | # | ||
53 | # r2: kdump base address | ||
54 | # r3: kdump size | ||
55 | # | ||
56 | .Lcopy_start: | ||
57 | basr %r13,0 # Base | ||
58 | 0: | ||
59 | lgr %r11,%r2 # Save kdump base address | ||
60 | lgr %r12,%r2 | ||
61 | agr %r12,%r3 # Compute kdump end address | ||
62 | |||
63 | lghi %r5,0 | ||
64 | lghi %r10,COPY_PAGE_ADDR # Load copy page address | ||
65 | 1: | ||
66 | mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp | ||
67 | mvc 0(256,%r5),0(%r11) # Copy new kernel to old | ||
68 | mvc 0(256,%r11),0(%r10) # Copy tmp to new | ||
69 | aghi %r11,256 | ||
70 | aghi %r5,256 | ||
71 | clgr %r11,%r12 | ||
72 | jl 1b | ||
73 | |||
74 | lg %r14,.Lstartup_kdump-0b(%r13) | ||
75 | basr %r14,%r14 # Start relocated kernel | ||
76 | .Lstartup_kdump: | ||
77 | .long 0x00000000,0x00000000 + startup_kdump_relocated | ||
78 | .Lcopy_end: | ||
79 | |||
80 | # | ||
81 | # Startup of kdump (relocated new kernel) | ||
82 | # | ||
83 | .align 2 | ||
84 | startup_kdump_relocated: | ||
85 | basr %r13,0 | ||
86 | 0: | ||
87 | mvc 0(8,%r0),.Lrestart_psw-0b(%r13) # Setup restart PSW | ||
88 | mvc 464(16,%r0),.Lpgm_psw-0b(%r13) # Setup pgm check PSW | ||
89 | lhi %r1,1 # Start new kernel | ||
90 | diag %r1,%r1,0x308 # with diag 308 | ||
91 | |||
92 | .Lno_diag308: # No diag 308 | ||
93 | sam31 # Switch to 31 bit addr mode | ||
94 | sr %r1,%r1 # Erase register r1 | ||
95 | sr %r2,%r2 # Erase register r2 | ||
96 | sigp %r1,%r2,0x12 # Switch to 31 bit arch mode | ||
97 | lpsw 0 # Start new kernel... | ||
98 | .align 8 | ||
99 | .Lrestart_psw: | ||
100 | .long 0x00080000,0x80000000 + startup | ||
101 | .Lpgm_psw: | ||
102 | .quad 0x0000000180000000,0x0000000000000000 + .Lno_diag308 | ||
103 | #else | ||
104 | .align 2 | ||
105 | .Lep_startup_kdump: | ||
106 | #ifdef CONFIG_64BIT | ||
107 | larl %r13,startup_kdump_crash | ||
108 | lpswe 0(%r13) | ||
109 | .align 8 | ||
110 | startup_kdump_crash: | ||
111 | .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash | ||
112 | #else | ||
113 | basr %r13,0 | ||
114 | 0: lpsw startup_kdump_crash-0b(%r13) | ||
115 | .align 8 | ||
116 | startup_kdump_crash: | ||
117 | .long 0x000a0000,0x00000000 + startup_kdump_crash | ||
118 | #endif /* CONFIG_64BIT */ | ||
119 | #endif /* CONFIG_CRASH_DUMP */ | ||