.. index:: pstore (filesystem)

*pstore* filesystem with RAM backend (RAMOOPS)
==============================================

Barebox supports the *pstore* filesystem known from the kernel. The main backend
implementation is RAM. All other backends are currently not implemented by
Barebox.

*pstore* is a filesystem to store kernel log or kernel panic messages. These
messages are stored by the kernel in a specified RAM area which is never
overwritten by any user. This data can be accessed after a reboot through
``/pstore`` in Barebox or the kernel. The *pstore* filesystem is automatically
mounted at boot:

.. code-block:: none

	none on / type ramfs
	none on /dev type devfs
	none on /pstore type pstore

*pstore* may add additional warnings during boot due to wrong ECCs (no data
written):

.. code-block:: none

  persistent_ram: found existing invalid buffer, size 791282217, start 1116786789
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 791282281, start 1133564005
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 791347753, start 1133564005
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 791347753, start 1133572197
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 774505001, start 1133564005
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 791282281, start 1133564005
  persistent_ram: uncorrectable error in header
  persistent_ram: found existing invalid buffer, size 791282217, start 1133564005
  pstore: Registered ramoops as persistent store backend
  ramoops: attached 0x200000@0x1fdf4000, ecc: 16/0

To use *pstore/RAMOOPS* both Barebox and Kernel have to be compiled with *pstore*
and RAM backend support. The kernel receives the parameters describing the
layout via devicetree or - as a fallback - over the kernel command line.
To ensure both worlds are using the same memory layout, the required
configuration data for the kernel is generated on-the-fly prior booting a kernel.
For the devicetree use case Barebox adapts the kernel's devicetree, for the
kernel command line fallback the variable ``global.linux.bootargs.ramoops`` is
created and its content used to build the kernel command line.

You can adapt the *pstore* parameters in Barebox menuconfig.

To see where the RAMOOPS area is located, you can execute the ``iomem`` command
in the Barebox shell. The RAMOOPS area is listed as 'persistent ram':

.. code-block:: none

  0x10000000 - 0x1fffffff (size 0x10000000) ram0
    0x247f59c0 - 0x2fbf59bf (size 0x0b400000) malloc space
    0x2fbf59c0 - 0x2fbffffe (size 0x0000a63f) board data
    0x2fc00000 - 0x2fc8619f (size 0x000861a0) barebox
    0x2fc861a0 - 0x2fca35ef (size 0x0001d450) barebox data
    0x2fca35f0 - 0x2fca9007 (size 0x00005a18) bss
    0x2fdd4000 - 0x2fdf3fff (size 0x00020000) ramoops:dump(0/4)
    0x2fdf4000 - 0x2fe13fff (size 0x00020000) ramoops:dump(1/4)
    0x2fe14000 - 0x2fe33fff (size 0x00020000) ramoops:dump(2/4)
    0x2fe34000 - 0x2fe53fff (size 0x00020000) ramoops:dump(3/4)
    0x2fe54000 - 0x2fe73fff (size 0x00020000) ramoops:dump(4/4)
    0x2fe74000 - 0x2fe93fff (size 0x00020000) ramoops:console
    0x2fe94000 - 0x2feb3fff (size 0x00020000) ramoops:ftrace
    0x2feb4000 - 0x2fed3fff (size 0x00020000) ramoops:pmsg
    0x2fee4000 - 0x2fee7fff (size 0x00004000) ttb
    0x2fee8000 - 0x2feeffff (size 0x00008000) stack

All pstore files that could be found are added to the /pstore directory. This is
a read-only filesystem. If you disable the Kconfig option FS_PSTORE_RAMOOPS_RO,
the RAMOOPS area is reset and its ECC recalculated. But that does not allow any
writes from Barebox into that area.

If the menu entry ``FS_PSTORE_CONSOLE`` is enabled, Barebox itself will add all
its own console output to the *ramoops:console* part, which enables the regular
userland later on to have access to the bootloaders output.
