Linux kernel: /proc/iomem-like output to kernel log during boot
In order to have something similar to /proc/iomem printed out to the console (and dmesg), this piece of code can be implanted somewhere in the kernel code (in my case it was arch/arm/mach-zynq/common.c). It may be required to add #include headers, depending on the file it’s added to.
The original code that produces /proc/iomem is at kernel/resource.c.
static struct resource *adhoc_next_resource(struct resource *p, bool sibling_only) { /* Caller wants to traverse through siblings only */ if (sibling_only) return p->sibling; if (p->child) return p->child; while (!p->sibling && p->parent) p = p->parent; return p->sibling; } static void print_iomem(void) { struct resource *r = &iomem_resource; int width = r->end < 0x10000 ? 4 : 8; pr_info("iomem mapping:\n"); while (r) { pr_info("%0*llx-%0*llx : %s\n", width, (unsigned long long) r->start, width, (unsigned long long) r->end, r->name ? r->name : ""); r = adhoc_next_resource(r, false); } }
And then call print_iomem(). The output differs only from /proc/iomem in that it lacks the indentations representing the nesting of memory regions.
This was useful for me to get a snapshot during an early stage of Linux’ boot.