Reputation: 342
I am trying to use persistent store(Pstore) available in linux kernel but somehow I am not getting the logs in case of kernel panics. I made the following kernel modules in kernel config file as built in:
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_RAM=y
Now a/c to documentation pstore I should get the logs on next reboot in /sys/fs/pstore/... (or /dev/pstore/...) but couldn't find the logs there. Am I missing something...?
Upvotes: 4
Views: 11843
Reputation: 793
You have to declare platform data as described by @shadowfire. But all kernel cannot use device tree for ramoops.
Generic way to do it, is to add in the source file for your hardware (example for mx6ul : arch/arm/mach-imx/mach-imx6ul.c) the following piece of code in the function xxx_init_machine :
#include <linux/pstore_ram.h>
[...]
static struct ramoops_platform_data ramoops_data = {
.mem_size = <...>,
.mem_address = <...>,
.mem_type = <...>,
.record_size = <...>,
.dump_oops = <...>,
.ecc = <...>,
};
static struct platform_device ramoops_dev = {
.name = "ramoops",
.dev = {
.platform_data = &ramoops_data,
},
};
[... inside xxx_init_machine ...]
int ret;
ret = platform_device_register(&ramoops_dev);
if (ret) {
printk(KERN_ERR "unable to register platform device\n");
return ret;
}
More info available in documentation : ramoops
Do you have logs in dmesg which can confirm that ramoops is enabled successfully ?
# dmesg | grep -i "pstore\|ramoops"
console [pstore-1] enabled
pstore: Registered ramoops as persistent store backend
ramoops: attached 0x20000@0x80000000, ecc: 0/0
Moreover you must mount pstore directory, that's why the directory is empty on your rootfs :
mount -t pstore -o kmsg_bytes=8000 - /sys/fs/pstore
Default size for the mount is 10 Kbytes in you don't set the kmsg_bytes option. You can use /etc/fstab to mount it automatically.
Upvotes: 1
Reputation: 106
Besides the kernel config options:
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_PMSG=y
CONFIG_PSTORE_RAM=y
I had to reserve a part of memory in which the logs will be saved. I did this through the device tree like this:
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
pstore: pstore@FF00000 {
no-map;
reg = <0x0 0xFF00000 0x0 0x00100000>; /* pstore/ramoops buffer
starts at memory address 0xFF00000 and is of size 0x00100000 */
};
};
ramoops {
compatible = "ramoops";
memory-region = <&pstore>;
record-size = <0x0 0x00020000>;
console-size = <0x0 0x00020000>;
pmsg-size = <0x0 0x00020000>;
};
Also, check if the following kernel patch is present (which is needed for the kernel to be able to parse the options given above): https://android-review.googlesource.com/#/c/kernel/common/+/195160/
Another way is to turn it on through the kernel cmdline, for example:
ramoops.mem_address=0x30000000 ramoops.mem_size=0x100000 memmap=0x100000$0x30000000
Upvotes: 4
Reputation: 1591
check if below config options are enabled
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
**CONFIG_PSTORE_FTRACE=y**
CONFIG_PSTORE_RAM=y
But why /dev/pstore file?, it's not needed,
To check if console-ramoops working, do echo Trigger a kernel panic using command
echo c > /proc/sysrq-trigger
then reboot device manually. after system boots up, run command "/sys/fs/pstore/console-ramoops", check if console_ramoops has got anything logged.
Upvotes: 3