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