• Alexander Gordeev's avatar
    s390/mm: start kernel with DAT enabled · bb1520d5
    Alexander Gordeev authored
    The setup of the kernel virtual address space is spread
    throughout the sources, boot stages and config options
    like this:
    
    1. The available physical memory regions are queried
       and stored as mem_detect information for later use
       in the decompressor.
    
    2. Based on the physical memory availability the virtual
       memory layout is established in the decompressor;
    
    3. If CONFIG_KASAN is disabled the kernel paging setup
       code populates kernel pgtables and turns DAT mode on.
       It uses the information stored at step [1].
    
    4. If CONFIG_KASAN is enabled the kernel early boot
       kasan setup populates kernel pgtables and turns DAT
       mode on. It uses the information stored at step [1].
    
       The kasan setup creates early_pg_dir directory and
       directly overwrites swapper_pg_dir entries to make
       shadow memory pages available.
    
    Move the kernel virtual memory setup to the decompressor
    and start the kernel with DAT turned on right from the
    very first istruction. That completely eliminates the
    boot phase when the kernel runs in DAT-off mode, simplies
    the overall design and consolidates pgtables setup.
    
    The identity mapping is created in the decompressor, while
    kasan shadow mappings are still created by the early boot
    kernel code.
    
    Share with decompressor the existing kasan memory allocator.
    It decreases the size of a newly requested memory block from
    pgalloc_pos and ensures that kernel image is not overwritten.
    pgalloc_low and pgalloc_pos pointers are made preserved boot
    variables for that.
    
    Use the bootdata infrastructure to setup swapper_pg_dir
    and invalid_pg_dir directories used by the kernel later.
    The interim early_pg_dir directory established by the
    kasan initialization code gets eliminated as result.
    
    As the kernel runs in DAT-on mode only the PSW_KERNEL_BITS
    define gets PSW_MASK_DAT bit by default. Additionally, the
    setup_lowcore_dat_off() and setup_lowcore_dat_on() routines
    get merged, since there is no DAT-off mode stage anymore.
    
    The memory mappings are created with RW+X protection that
    allows the early boot code setting up all necessary data
    and services for the kernel being booted. Just before the
    paging is enabled the memory protection is changed to
    RO+X for text, RO+NX for read-only data and RW+NX for
    kernel data and the identity mapping.
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    bb1520d5
vmlinux.lds.S 4.96 KB