x86: make crashdump works
[openwrt/staging/wigyori.git] / package / boot / kexec-tools / files / kdump.init
1 #!/bin/sh /etc/rc.common
2
3 START=41
4 STOP=90
5
6 BOOT_IMAGE=/boot/vmlinuz
7
8 EXTRA_COMMANDS="status"
9 EXTRA_HELP=" status Print crashkernel status"
10
11 verify_kdump() {
12 local cfg="$1"
13 local enabled
14 local path
15 local save_vmcore
16 local save_dmesg
17
18 config_get_bool enabled "$cfg" enabled 1
19 config_get_bool save_dmesg "$cfg" save_dmesg 1
20 config_get_bool save_vmcore "$cfg" save_vmcore 0
21
22 [ "$enabled" -gt 0 ] || return 2
23
24 [ "$save_dmesg" -gt 0 ] || [ "$save_vmcore" -gt 0 ] || return 2
25
26 config_get path "$cfg" path "/"
27
28 [ -d "$path" ] || mkdir -p "$path" 2>/dev/null || return 1
29 }
30
31 run_kdump() {
32 local cfg="$1"
33 local enabled
34 local path
35 local save_vmcore
36 local save_dmesg
37
38 config_get_bool enabled "$cfg" enabled 1
39 [ "$enabled" -gt 0 ] || return
40
41 config_get_bool save_dmesg "$cfg" save_dmesg 1
42 config_get_bool save_vmcore "$cfg" save_vmcore 0
43 config_get path "$cfg" path "/"
44
45 timestamp=$(date "+%Y%m%dT%H%M%S")
46
47 if [ "$save_vmcore" -eq 1 ]; then
48 echo -n "Saving vmcore (this may take a while)..."
49 # would like 'sparse' but busybox doesn't support it
50 dd if=/proc/vmcore of="$path/vmcore-$timestamp" conv=fsync bs=1M
51 echo " done"
52 fi
53
54 if [ "$save_dmesg" -eq 1 ]; then
55 vmcore-dmesg /proc/vmcore > "$path/dmesg-$timestamp"
56 fi
57
58 sync
59 reboot -f
60 }
61
62 find_kernel() {
63 . /lib/functions.sh
64 local kernel
65
66 kernel="$BOOT_IMAGE"
67 if [ -r "$kernel" ]; then
68 echo $kernel
69 return 0
70 fi
71
72 kernel="$(find_mtd_part kernel)"
73 if [ -r "$kernel" ]; then
74 echo $kernel
75 return 0
76 fi
77
78 for voldir in /sys/class/ubi/ubi*_*; do
79 [ ! -e "$voldir" ] && continue
80 if [ "$(cat "${voldir}/name")" = "kernel" ]; then
81 kernel="/dev/$(basename "$voldir")"
82 echo $kernel
83 return 0
84 fi
85 done
86
87 return 1
88 }
89
90 load_crashkernel() {
91 local append_cmdline
92 local kernel
93
94 kernel="$(find_kernel)"
95 [ $? -gt 0 ] && return 1
96
97 case "$(uname -m)" in
98 i?86|x86_64)
99 grep -q "crashkernel=" /proc/cmdline || return 1
100 append_cmdline="1 irqpoll reset_devices maxcpus=1"
101 ;;
102 arm*)
103 append_cmdline="1 maxcpus=1 reset_devices"
104 ;;
105 esac
106 kexec -p "$kernel" --reuse-cmdline --append="$append_cmdline"
107 return $?
108 }
109
110 start() {
111 local retval
112
113 if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
114 return 1
115 fi
116
117 if [ -e /proc/vmcore ]; then
118 config_load kdump
119 config_foreach run_kdump kdump
120 else
121 config_load kdump
122 config_foreach verify_kdump kdump
123 retval=$?
124 [ $retval = 1 ] && return 1
125 [ $retval = 0 ] && load_crashkernel
126 return $?
127 fi
128 }
129
130 stop() {
131 [ "$(cat /sys/kernel/kexec_crash_loaded)" = "1" ] || return
132
133 if [ -e "$BOOT_IMAGE" ]; then
134 kexec -p -u "$BOOT_IMAGE"
135 fi
136 }
137
138 status() {
139 local retval kernel
140
141 if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
142 echo "crashdump not supported by kernel"
143 return
144 fi
145
146 if [ $(cat /sys/kernel/kexec_crash_size) -eq 0 ]; then
147 echo "memory for crashdump kernel not reserved!"
148 echo "check crashkernel= kernel cmdline parameter"
149 echo "(a reboot is required after installing kdump)"
150 return
151 fi
152
153 kernel="$(find_kernel)"
154 if [ $? -gt 0 ]; then
155 echo "cannot find kernel image"
156 return
157 else
158 echo "using kernel image $kernel"
159 fi
160
161 echo -n "kdump configuration is "
162 config_load kdump
163 retval=$?
164 if [ $retval = 0 ]; then
165 if [ "$(config_foreach echo kdump)" ]; then
166 config_foreach verify_kdump kdump
167 retval=$?
168 else
169 retval=1
170 fi
171 fi
172
173 if [ $retval = 0 ]; then
174 echo "valid"
175 elif [ $retval = 2 ]; then
176 echo "disabled"
177 else
178 echo "BROKEN"
179 fi
180
181 echo -n "kexec crash kernel "
182 if [ "$(cat /sys/kernel/kexec_crash_loaded)" = "0" ]; then
183 echo -n "not "
184 fi
185 echo "loaded"
186 }