From: Kees Cook <keescook@xxxxxxxxxxxx> When ramoops reserved a memory region in the kernel, it had an unhelpful label of "persistent ram". When reading iomem, it would be repeated many times, did not hint that it was ramoops in particular, and didn't clarify very much about what each was used for: 0x4fdd4000 - 0x4fdf3fff (size 0x00020000) persistent ram 0x4fdf4000 - 0x4fe13fff (size 0x00020000) persistent ram ... 0x4ff74000 - 0x4ff93fff (size 0x00020000) persistent ram 0x4ff94000 - 0x4ffb3fff (size 0x00020000) persistent ram 0x4ffb4000 - 0x4ffd3fff (size 0x00020000) persistent ram Instead, this adds meaningful labels for how the various regions are being used: 0x4fdd4000 - 0x4fdf3fff (size 0x00020000) ramoops:dump(0/12) 0x4fdf4000 - 0x4fe13fff (size 0x00020000) ramoops:dump(1/12) ... 0x4ff74000 - 0x4ff93fff (size 0x00020000) ramoops:console 0x4ff94000 - 0x4ffb3fff (size 0x00020000) ramoops:ftrace 0x4ffb4000 - 0x4ffd3fff (size 0x00020000) ramoops:pmsg Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx> Reviewed-by: Joel Fernandes (Google) <joel@xxxxxxxxxxxxxxxxx> [p.zabel@xxxxxxxxxxxxxx: ported to Barebox from Linux commit 1227daa43bce] Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> --- Documentation/filesystems/pstore.rst | 44 ++++++++++++++++-------------------- fs/pstore/ram.c | 15 ++++++++++-- fs/pstore/ram_core.c | 8 +++++-- include/linux/pstore_ram.h | 3 ++- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/Documentation/filesystems/pstore.rst b/Documentation/filesystems/pstore.rst index 22e89b3f1f..6215f2296c 100644 --- a/Documentation/filesystems/pstore.rst +++ b/Documentation/filesystems/pstore.rst @@ -47,35 +47,29 @@ generated by Barebox. You can change these parameters in Barebox menuconfig. The RAMOOPS parameters for the Kernel are stored in the variable global.linux.bootargs.ramoops. -To see where the RAMOOPS area is located, you can execute iomem in Barebox. The -RAMOOPS area is listed as 'persistent ram': +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 - 0x17e7c0c0 - 0x1fcf817f (size 0x07e7c0c0) malloc space - 0x1fcf8180 - 0x1fcfffff (size 0x00007e80) board data - 0x1fd00000 - 0x1fd6eeff (size 0x0006ef00) barebox - 0x1fd6ef00 - 0x1fd88dff (size 0x00019f00) barebox data - 0x1fd88e00 - 0x1fd8c3db (size 0x000035dc) bss - 0x1fdf4000 - 0x1fe13fff (size 0x00020000) persistent ram - 0x1fe14000 - 0x1fe33fff (size 0x00020000) persistent ram - 0x1fe34000 - 0x1fe53fff (size 0x00020000) persistent ram - 0x1fe54000 - 0x1fe73fff (size 0x00020000) persistent ram - 0x1fe74000 - 0x1fe93fff (size 0x00020000) persistent ram - 0x1fe94000 - 0x1feb3fff (size 0x00020000) persistent ram - 0x1feb4000 - 0x1fed3fff (size 0x00020000) persistent ram - 0x1fed4000 - 0x1fef3fff (size 0x00020000) persistent ram - 0x1fef4000 - 0x1ff13fff (size 0x00020000) persistent ram - 0x1ff14000 - 0x1ff33fff (size 0x00020000) persistent ram - 0x1ff34000 - 0x1ff53fff (size 0x00020000) persistent ram - 0x1ff54000 - 0x1ff73fff (size 0x00020000) persistent ram - 0x1ff74000 - 0x1ff93fff (size 0x00020000) persistent ram - 0x1ff94000 - 0x1ffb3fff (size 0x00020000) persistent ram - 0x1ffb4000 - 0x1ffd3fff (size 0x00020000) persistent ram - 0x1ffd4000 - 0x1fff3fff (size 0x00020000) persistent ram - 0x1fff4000 - 0x1fff7fff (size 0x00004000) ttb - 0x1fff8000 - 0x1fffffff (size 0x00008000) stack + 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, diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index d46612fbff..714755bd66 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -334,8 +334,16 @@ static int ramoops_init_przs(const char *name, goto fail; for (i = 0; i < *cnt; i++) { + char *label; + + if (*cnt == 1) + label = basprintf("ramoops:%s", name); + else + label = basprintf("ramoops:%s(%d/%d)", + name, i, *cnt - 1); prz_ar[i] = persistent_ram_new(*paddr, zone_sz, sig, - &cxt->ecc_info, cxt->memtype); + &cxt->ecc_info, + cxt->memtype, label); if (IS_ERR(prz_ar[i])) { err = PTR_ERR(prz_ar[i]); pr_err("failed to request %s mem region (0x%zx@0x%llx): %d\n", @@ -365,6 +373,8 @@ static int ramoops_init_prz(const char *name, struct persistent_ram_zone **prz, phys_addr_t *paddr, size_t sz, u32 sig) { + char *label; + if (!sz) return 0; @@ -375,8 +385,9 @@ static int ramoops_init_prz(const char *name, return -ENOMEM; } + label = basprintf("ramoops:%s", name); *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info, - cxt->memtype); + cxt->memtype, label); if (IS_ERR(*prz)) { int err = PTR_ERR(*prz); diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index ed48dcddd5..0f7003f937 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -346,7 +346,7 @@ void persistent_ram_zap(struct persistent_ram_zone *prz) static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size, struct persistent_ram_zone *prz, int memtype) { - prz->res = request_sdram_region("persistent ram", start, size); + prz->res = request_sdram_region(prz->label ?: "ramoops", start, size); if (!prz->res) return -ENOMEM; @@ -409,12 +409,13 @@ void persistent_ram_free(struct persistent_ram_zone *prz) prz->ecc_info.par = NULL; persistent_ram_free_old(prz); + kfree(prz->label); kfree(prz); } struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, u32 sig, struct persistent_ram_ecc_info *ecc_info, - unsigned int memtype) + unsigned int memtype, char *label) { struct persistent_ram_zone *prz; int ret = -ENOMEM; @@ -425,6 +426,9 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, goto err; } + /* Initialize general buffer state. */ + prz->label = label; + ret = persistent_ram_buffer_map(start, size, prz, memtype); if (ret) goto err; diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index ecdd229dd4..de6eaa93f9 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -35,6 +35,7 @@ struct persistent_ram_ecc_info { struct persistent_ram_zone { phys_addr_t paddr; size_t size; + char *label; struct persistent_ram_buffer *buffer; size_t buffer_size; struct resource *res; @@ -53,7 +54,7 @@ struct persistent_ram_zone { struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, u32 sig, struct persistent_ram_ecc_info *ecc_info, - unsigned int memtype); + unsigned int memtype, char *label); void persistent_ram_free(struct persistent_ram_zone *prz); void persistent_ram_zap(struct persistent_ram_zone *prz); -- 2.11.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox