blob: 4ba7db231cb275507363c0330b01656e8d254f08 [file] [log] [blame]
Sergiu Iordache4126dac2011-08-13 12:34:56 -07001Ramoops oops/panic logger
2=========================
3
4Sergiu Iordache <sergiu@chromium.org>
5
Kees Cook9ba80d92012-05-03 15:45:02 +10006Updated: 17 November 2011
Sergiu Iordache4126dac2011-08-13 12:34:56 -07007
80. Introduction
9
10Ramoops is an oops/panic logger that writes its logs to RAM before the system
11crashes. It works by logging oopses and panics in a circular buffer. Ramoops
12needs a system with persistent RAM so that the content of that area can
13survive after a restart.
14
151. Ramoops concepts
16
17Ramoops uses a predefined memory area to store the dump. The start and size of
18the memory area are set using two variables:
19 * "mem_address" for the start
20 * "mem_size" for the size. The memory size will be rounded down to a
21 power of two.
22
23The memory area is divided into "record_size" chunks (also rounded down to
24power of two) and each oops/panic writes a "record_size" chunk of
25information.
26
27Dumping both oopses and panics can be done by setting 1 in the "dump_oops"
28variable while setting 0 in that variable dumps only the panics.
29
30The module uses a counter to record multiple dumps but the counter gets reset
31on restart (i.e. new dumps after the restart will overwrite old ones).
32
Anton Vorontsov39eb7e972012-05-17 00:15:34 -070033Ramoops also supports software ECC protection of persistent memory regions.
34This might be useful when a hardware reset was used to bring the machine back
35to life (i.e. a watchdog triggered). In such cases, RAM may be somewhat
36corrupt, but usually it is restorable.
37
Sergiu Iordache4126dac2011-08-13 12:34:56 -0700382. Setting the parameters
39
40Setting the ramoops parameters can be done in 2 different manners:
41 1. Use the module parameters (which have the names of the variables described
42 as before).
43 2. Use a platform device and set the platform data. The parameters can then
44 be set through that platform data. An example of doing that is:
45
Anton Vorontsov1894a252012-05-16 05:43:08 -070046#include <linux/pstore_ram.h>
Sergiu Iordache4126dac2011-08-13 12:34:56 -070047[...]
48
49static struct ramoops_platform_data ramoops_data = {
50 .mem_size = <...>,
51 .mem_address = <...>,
52 .record_size = <...>,
53 .dump_oops = <...>,
Anton Vorontsov39eb7e972012-05-17 00:15:34 -070054 .ecc = <...>,
Sergiu Iordache4126dac2011-08-13 12:34:56 -070055};
56
57static struct platform_device ramoops_dev = {
58 .name = "ramoops",
59 .dev = {
60 .platform_data = &ramoops_data,
61 },
62};
63
64[... inside a function ...]
65int ret;
66
67ret = platform_device_register(&ramoops_dev);
68if (ret) {
69 printk(KERN_ERR "unable to register platform device\n");
70 return ret;
71}
72
733. Dump format
74
75The data dump begins with a header, currently defined as "====" followed by a
76timestamp and a new line. The dump then continues with the actual data.
77
784. Reading the data
79
Kees Cook9ba80d92012-05-03 15:45:02 +100080The dump data can be read from the pstore filesystem. The format for these
81files is "dmesg-ramoops-N", where N is the record number in memory. To delete
82a stored record from RAM, simply unlink the respective pstore file.