.. SPDX-License-Identifier: GPL-2.0

=================
Memory Management
=================

Virtual memory layout
=====================

.. note::

 - Some aspects of the virtual memory layout setup are not
   clarified (number of page levels, alignment, DMA memory).

 - Unused gaps in the virtual memory layout could be present
   or not - depending on how partucular system is configured.
   No page tables are created for the unused gaps.

 - The virtual memory regions are tracked or untracked by KASAN
   instrumentation, as well as the KASAN shadow memory itself is
   created only when CONFIG_KASAN configuration option is enabled.

::

  =============================================================================
  |    Physical      |	  Virtual	| VM area description
  =============================================================================
  +- 0 --------------+- 0 --------------+
  |		     | S390_lowcore	| Low-address memory
  |		     +- 8 KB -----------+
  |		     |			|
  |		     |			|
  |		     | ... unused gap	| KASAN untracked
  |		     |			|
  +- AMODE31_START --+- AMODE31_START --+ .amode31 rand. phys/virt start
  |.amode31 text/data|.amode31 text/data| KASAN untracked
  +- AMODE31_END ----+- AMODE31_END ----+ .amode31 rand. phys/virt end (<2GB)
  |		     |			|
  |		     |			|
  +- __kaslr_offset_phys		| kernel rand. phys start
  |		     |			|
  | kernel text/data |			|
  |		     |			|
  +------------------+			| kernel phys end
  |		     |			|
  |		     |			|
  |		     |			|
  |		     |			|
  +- ident_map_size -+			|
		     |			|
		     |	... unused gap	| KASAN untracked
		     |			|
		     +- __identity_base + identity mapping start (>= 2GB)
		     |			|
		     | identity		| phys == virt - __identity_base
		     | mapping		| virt == phys + __identity_base
		     |			|
		     |			| KASAN tracked
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     |			|
		     +---- vmemmap -----+ 'struct page' array start
		     |			|
		     | virtually mapped |
		     | memory map	| KASAN untracked
		     |			|
		     +- __abs_lowcore --+
		     |			|
		     | Absolute Lowcore | KASAN untracked
		     |			|
		     +- __memcpy_real_area
		     |			|
		     |	Real Memory Copy| KASAN untracked
		     |			|
		     +- VMALLOC_START --+ vmalloc area start
		     |			| KASAN untracked or
		     |	vmalloc area	| KASAN shallowly populated in case
		     |			|	CONFIG_KASAN_VMALLOC=y
		     +- MODULES_VADDR --+ modules area start
		     |			| KASAN allocated per module or
		     |	modules area	| KASAN shallowly populated in case
		     |			|	CONFIG_KASAN_VMALLOC=y
		     +- __kaslr_offset -+ kernel rand. virt start
		     |			| KASAN tracked
		     | kernel text/data | phys == (kvirt - __kaslr_offset) +
		     |			|	  __kaslr_offset_phys
		     +- kernel .bss end + kernel rand. virt end
		     |			|
		     |	... unused gap	| KASAN untracked
		     |			|
		     +------------------+ UltraVisor Secure Storage limit
		     |			|
		     |	... unused gap	| KASAN untracked
		     |			|
		     +KASAN_SHADOW_START+ KASAN shadow memory start
		     |			|
		     |	 KASAN shadow	| KASAN untracked
		     |			|
		     +------------------+ ASCE limit
		     |			|
		     | CONFIG_ILLEGAL_POINTER_VALUE causes memory access fault
		     |			|
		     +------------------+
