• Vasily Gorbik's avatar
    s390/kasan: support protvirt with 4-level paging · c360c9a2
    Vasily Gorbik authored
    Currently the kernel crashes in Kasan instrumentation code if
    CONFIG_KASAN_S390_4_LEVEL_PAGING is used on protected virtualization
    capable machine where the ultravisor imposes addressing limitations on
    the host and those limitations are lower then KASAN_SHADOW_OFFSET.
    
    The problem is that Kasan has to know in advance where vmalloc/modules
    areas would be. With protected virtualization enabled vmalloc/modules
    areas are moved down to the ultravisor secure storage limit while kasan
    still expects them at the very end of 4-level paging address space.
    
    To fix that make Kasan recognize when protected virtualization is enabled
    and predefine vmalloc/modules areas position which are compliant with
    ultravisor secure storage limit.
    
    Kasan shadow itself stays in place and might reside above that ultravisor
    secure storage limit.
    
    One slight difference compaired to a kernel without Kasan enabled is that
    vmalloc/modules areas position is not reverted to default if ultravisor
    initialization fails. It would still be below the ultravisor secure
    storage limit.
    
    Kernel layout with kasan, 4-level paging and protected virtualization
    enabled (ultravisor secure storage limit is at 0x0000800000000000):
    ---[ vmemmap Area Start ]---
    0x0000400000000000-0x0000400080000000
    ---[ vmemmap Area End ]---
    ---[ vmalloc Area Start ]---
    0x00007fe000000000-0x00007fff80000000
    ---[ vmalloc Area End ]---
    ---[ Modules Area Start ]---
    0x00007fff80000000-0x0000800000000000
    ---[ Modules Area End ]---
    ---[ Kasan Shadow Start ]---
    0x0018000000000000-0x001c000000000000
    ---[ Kasan Shadow End ]---
    0x001c000000000000-0x0020000000000000         1P PGD I
    
    Kernel layout with kasan, 4-level paging and protected virtualization
    disabled/unsupported:
    ---[ vmemmap Area Start ]---
    0x0000400000000000-0x0000400060000000
    ---[ vmemmap Area End ]---
    ---[ Kasan Shadow Start ]---
    0x0018000000000000-0x001c000000000000
    ---[ Kasan Shadow End ]---
    ---[ vmalloc Area Start ]---
    0x001fffe000000000-0x001fffff80000000
    ---[ vmalloc Area End ]---
    ---[ Modules Area Start ]---
    0x001fffff80000000-0x0020000000000000
    ---[ Modules Area End ]---
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    c360c9a2
kasan_init.c 13 KB