1*69ac9cd6SBernhard WalleWhat: /sys/firmware/memmap/ 2*69ac9cd6SBernhard WalleDate: June 2008 3*69ac9cd6SBernhard WalleContact: Bernhard Walle <bwalle@suse.de> 4*69ac9cd6SBernhard WalleDescription: 5*69ac9cd6SBernhard Walle On all platforms, the firmware provides a memory map which the 6*69ac9cd6SBernhard Walle kernel reads. The resources from that memory map are registered 7*69ac9cd6SBernhard Walle in the kernel resource tree and exposed to userspace via 8*69ac9cd6SBernhard Walle /proc/iomem (together with other resources). 9*69ac9cd6SBernhard Walle 10*69ac9cd6SBernhard Walle However, on most architectures that firmware-provided memory 11*69ac9cd6SBernhard Walle map is modified afterwards by the kernel itself, either because 12*69ac9cd6SBernhard Walle the kernel merges that memory map with other information or 13*69ac9cd6SBernhard Walle just because the user overwrites that memory map via command 14*69ac9cd6SBernhard Walle line. 15*69ac9cd6SBernhard Walle 16*69ac9cd6SBernhard Walle kexec needs the raw firmware-provided memory map to setup the 17*69ac9cd6SBernhard Walle parameter segment of the kernel that should be booted with 18*69ac9cd6SBernhard Walle kexec. Also, the raw memory map is useful for debugging. For 19*69ac9cd6SBernhard Walle that reason, /sys/firmware/memmap is an interface that provides 20*69ac9cd6SBernhard Walle the raw memory map to userspace. 21*69ac9cd6SBernhard Walle 22*69ac9cd6SBernhard Walle The structure is as follows: Under /sys/firmware/memmap there 23*69ac9cd6SBernhard Walle are subdirectories with the number of the entry as their name: 24*69ac9cd6SBernhard Walle 25*69ac9cd6SBernhard Walle /sys/firmware/memmap/0 26*69ac9cd6SBernhard Walle /sys/firmware/memmap/1 27*69ac9cd6SBernhard Walle /sys/firmware/memmap/2 28*69ac9cd6SBernhard Walle /sys/firmware/memmap/3 29*69ac9cd6SBernhard Walle ... 30*69ac9cd6SBernhard Walle 31*69ac9cd6SBernhard Walle The maximum depends on the number of memory map entries provided 32*69ac9cd6SBernhard Walle by the firmware. The order is just the order that the firmware 33*69ac9cd6SBernhard Walle provides. 34*69ac9cd6SBernhard Walle 35*69ac9cd6SBernhard Walle Each directory contains three files: 36*69ac9cd6SBernhard Walle 37*69ac9cd6SBernhard Walle start : The start address (as hexadecimal number with the 38*69ac9cd6SBernhard Walle '0x' prefix). 39*69ac9cd6SBernhard Walle end : The end address, inclusive (regardless whether the 40*69ac9cd6SBernhard Walle firmware provides inclusive or exclusive ranges). 41*69ac9cd6SBernhard Walle type : Type of the entry as string. See below for a list of 42*69ac9cd6SBernhard Walle valid types. 43*69ac9cd6SBernhard Walle 44*69ac9cd6SBernhard Walle So, for example: 45*69ac9cd6SBernhard Walle 46*69ac9cd6SBernhard Walle /sys/firmware/memmap/0/start 47*69ac9cd6SBernhard Walle /sys/firmware/memmap/0/end 48*69ac9cd6SBernhard Walle /sys/firmware/memmap/0/type 49*69ac9cd6SBernhard Walle /sys/firmware/memmap/1/start 50*69ac9cd6SBernhard Walle ... 51*69ac9cd6SBernhard Walle 52*69ac9cd6SBernhard Walle Currently following types exist: 53*69ac9cd6SBernhard Walle 54*69ac9cd6SBernhard Walle - System RAM 55*69ac9cd6SBernhard Walle - ACPI Tables 56*69ac9cd6SBernhard Walle - ACPI Non-volatile Storage 57*69ac9cd6SBernhard Walle - reserved 58*69ac9cd6SBernhard Walle 59*69ac9cd6SBernhard Walle Following shell snippet can be used to display that memory 60*69ac9cd6SBernhard Walle map in a human-readable format: 61*69ac9cd6SBernhard Walle 62*69ac9cd6SBernhard Walle -------------------- 8< ---------------------------------------- 63*69ac9cd6SBernhard Walle #!/bin/bash 64*69ac9cd6SBernhard Walle cd /sys/firmware/memmap 65*69ac9cd6SBernhard Walle for dir in * ; do 66*69ac9cd6SBernhard Walle start=$(cat $dir/start) 67*69ac9cd6SBernhard Walle end=$(cat $dir/end) 68*69ac9cd6SBernhard Walle type=$(cat $dir/type) 69*69ac9cd6SBernhard Walle printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type" 70*69ac9cd6SBernhard Walle done 71*69ac9cd6SBernhard Walle -------------------- >8 ---------------------------------------- 72