169ac9cd6SBernhard WalleWhat: /sys/firmware/memmap/ 269ac9cd6SBernhard WalleDate: June 2008 3*97bef7ddSBernhard WalleContact: Bernhard Walle <bernhard.walle@gmx.de> 469ac9cd6SBernhard WalleDescription: 569ac9cd6SBernhard Walle On all platforms, the firmware provides a memory map which the 669ac9cd6SBernhard Walle kernel reads. The resources from that memory map are registered 769ac9cd6SBernhard Walle in the kernel resource tree and exposed to userspace via 869ac9cd6SBernhard Walle /proc/iomem (together with other resources). 969ac9cd6SBernhard Walle 1069ac9cd6SBernhard Walle However, on most architectures that firmware-provided memory 1169ac9cd6SBernhard Walle map is modified afterwards by the kernel itself, either because 1269ac9cd6SBernhard Walle the kernel merges that memory map with other information or 1369ac9cd6SBernhard Walle just because the user overwrites that memory map via command 1469ac9cd6SBernhard Walle line. 1569ac9cd6SBernhard Walle 1669ac9cd6SBernhard Walle kexec needs the raw firmware-provided memory map to setup the 1769ac9cd6SBernhard Walle parameter segment of the kernel that should be booted with 1869ac9cd6SBernhard Walle kexec. Also, the raw memory map is useful for debugging. For 1969ac9cd6SBernhard Walle that reason, /sys/firmware/memmap is an interface that provides 2069ac9cd6SBernhard Walle the raw memory map to userspace. 2169ac9cd6SBernhard Walle 2269ac9cd6SBernhard Walle The structure is as follows: Under /sys/firmware/memmap there 2369ac9cd6SBernhard Walle are subdirectories with the number of the entry as their name: 2469ac9cd6SBernhard Walle 2569ac9cd6SBernhard Walle /sys/firmware/memmap/0 2669ac9cd6SBernhard Walle /sys/firmware/memmap/1 2769ac9cd6SBernhard Walle /sys/firmware/memmap/2 2869ac9cd6SBernhard Walle /sys/firmware/memmap/3 2969ac9cd6SBernhard Walle ... 3069ac9cd6SBernhard Walle 3169ac9cd6SBernhard Walle The maximum depends on the number of memory map entries provided 3269ac9cd6SBernhard Walle by the firmware. The order is just the order that the firmware 3369ac9cd6SBernhard Walle provides. 3469ac9cd6SBernhard Walle 3569ac9cd6SBernhard Walle Each directory contains three files: 3669ac9cd6SBernhard Walle 3769ac9cd6SBernhard Walle start : The start address (as hexadecimal number with the 3869ac9cd6SBernhard Walle '0x' prefix). 3969ac9cd6SBernhard Walle end : The end address, inclusive (regardless whether the 4069ac9cd6SBernhard Walle firmware provides inclusive or exclusive ranges). 4169ac9cd6SBernhard Walle type : Type of the entry as string. See below for a list of 4269ac9cd6SBernhard Walle valid types. 4369ac9cd6SBernhard Walle 4469ac9cd6SBernhard Walle So, for example: 4569ac9cd6SBernhard Walle 4669ac9cd6SBernhard Walle /sys/firmware/memmap/0/start 4769ac9cd6SBernhard Walle /sys/firmware/memmap/0/end 4869ac9cd6SBernhard Walle /sys/firmware/memmap/0/type 4969ac9cd6SBernhard Walle /sys/firmware/memmap/1/start 5069ac9cd6SBernhard Walle ... 5169ac9cd6SBernhard Walle 5269ac9cd6SBernhard Walle Currently following types exist: 5369ac9cd6SBernhard Walle 5469ac9cd6SBernhard Walle - System RAM 5569ac9cd6SBernhard Walle - ACPI Tables 5669ac9cd6SBernhard Walle - ACPI Non-volatile Storage 5769ac9cd6SBernhard Walle - reserved 5869ac9cd6SBernhard Walle 5969ac9cd6SBernhard Walle Following shell snippet can be used to display that memory 6069ac9cd6SBernhard Walle map in a human-readable format: 6169ac9cd6SBernhard Walle 6269ac9cd6SBernhard Walle -------------------- 8< ---------------------------------------- 6369ac9cd6SBernhard Walle #!/bin/bash 6469ac9cd6SBernhard Walle cd /sys/firmware/memmap 6569ac9cd6SBernhard Walle for dir in * ; do 6669ac9cd6SBernhard Walle start=$(cat $dir/start) 6769ac9cd6SBernhard Walle end=$(cat $dir/end) 6869ac9cd6SBernhard Walle type=$(cat $dir/type) 6969ac9cd6SBernhard Walle printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type" 7069ac9cd6SBernhard Walle done 7169ac9cd6SBernhard Walle -------------------- >8 ---------------------------------------- 72