 69ac9cd629
			
		
	
	
	69ac9cd629
	
	
	
		
			
			This patch adds /sys/firmware/memmap interface that represents the BIOS
(or Firmware) provided memory map. The tree looks like:
    /sys/firmware/memmap/0/start   (hex number)
                           end     (hex number)
                           type    (string)
    ...                 /1/start
                           end
                           type
With the following shell snippet one can print the memory map in the same form
the kernel prints itself when booting on x86 (the E820 map).
  --------- 8< --------------------------
    #!/bin/sh
    cd /sys/firmware/memmap
    for dir in * ; do
        start=$(cat $dir/start)
        end=$(cat $dir/end)
        type=$(cat $dir/type)
        printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type"
    done
  --------- >8 --------------------------
That patch only provides the needed interface:
 1. The sysfs interface.
 2. The structure and enumeration definition.
 3. The function firmware_map_add() and firmware_map_add_early()
    that should be called from architecture code (E820/EFI, for
    example) to add the contents to the interface.
If the kernel is compiled without CONFIG_FIRMWARE_MEMMAP, the interface does
nothing without cluttering the architecture-specific code with #ifdef's.
The purpose of the new interface is kexec: While /proc/iomem represents
the *used* memory map (e.g. modified via kernel parameters like 'memmap'
and 'mem'), the /sys/firmware/memmap tree represents the unmodified memory
map provided via the firmware. So kexec can:
 - use the original memory map for rebooting,
 - use the /proc/iomem for setting up the ELF core headers for kdump
   case that should only represent the memory of the system.
The patch has been tested on i386 and x86_64.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Acked-by: Greg KH <gregkh@suse.de>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Cc: kexec@lists.infradead.org
Cc: yhlu.kernel@gmail.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
		
	
			
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| What:		/sys/firmware/memmap/
 | |
| Date:		June 2008
 | |
| Contact:	Bernhard Walle <bwalle@suse.de>
 | |
| Description:
 | |
| 		On all platforms, the firmware provides a memory map which the
 | |
| 		kernel reads. The resources from that memory map are registered
 | |
| 		in the kernel resource tree and exposed to userspace via
 | |
| 		/proc/iomem (together with other resources).
 | |
| 
 | |
| 		However, on most architectures that firmware-provided memory
 | |
| 		map is modified afterwards by the kernel itself, either because
 | |
| 		the kernel merges that memory map with other information or
 | |
| 		just because the user overwrites that memory map via command
 | |
| 		line.
 | |
| 
 | |
| 		kexec needs the raw firmware-provided memory map to setup the
 | |
| 		parameter segment of the kernel that should be booted with
 | |
| 		kexec. Also, the raw memory map is useful for debugging. For
 | |
| 		that reason, /sys/firmware/memmap is an interface that provides
 | |
| 		the raw memory map to userspace.
 | |
| 
 | |
| 		The structure is as follows: Under /sys/firmware/memmap there
 | |
| 		are subdirectories with the number of the entry as their name:
 | |
| 
 | |
| 			/sys/firmware/memmap/0
 | |
| 			/sys/firmware/memmap/1
 | |
| 			/sys/firmware/memmap/2
 | |
| 			/sys/firmware/memmap/3
 | |
| 			...
 | |
| 
 | |
| 		The maximum depends on the number of memory map entries provided
 | |
| 		by the firmware. The order is just the order that the firmware
 | |
| 		provides.
 | |
| 
 | |
| 		Each directory contains three files:
 | |
| 
 | |
| 		start	: The start address (as hexadecimal number with the
 | |
| 			  '0x' prefix).
 | |
| 		end	: The end address, inclusive (regardless whether the
 | |
| 			  firmware provides inclusive or exclusive ranges).
 | |
| 		type	: Type of the entry as string. See below for a list of
 | |
| 			  valid types.
 | |
| 
 | |
| 		So, for example:
 | |
| 
 | |
| 			/sys/firmware/memmap/0/start
 | |
| 			/sys/firmware/memmap/0/end
 | |
| 			/sys/firmware/memmap/0/type
 | |
| 			/sys/firmware/memmap/1/start
 | |
| 			...
 | |
| 
 | |
| 		Currently following types exist:
 | |
| 
 | |
| 		  - System RAM
 | |
| 		  - ACPI Tables
 | |
| 		  - ACPI Non-volatile Storage
 | |
| 		  - reserved
 | |
| 
 | |
| 		Following shell snippet can be used to display that memory
 | |
| 		map in a human-readable format:
 | |
| 
 | |
| 		-------------------- 8< ----------------------------------------
 | |
| 		  #!/bin/bash
 | |
| 		  cd /sys/firmware/memmap
 | |
| 		  for dir in * ; do
 | |
| 		      start=$(cat $dir/start)
 | |
| 		      end=$(cat $dir/end)
 | |
| 		      type=$(cat $dir/type)
 | |
| 		      printf "%016x-%016x (%s)\n" $start $[ $end +1] "$type"
 | |
| 		  done
 | |
| 		-------------------- >8 ----------------------------------------
 |