• Neeraj Upadhyay's avatar
    arm64: kaslr: Fix up the kernel image alignment · b9ed800f
    Neeraj Upadhyay authored
    commit afd0e5a8 upstream.
    
    If kernel image extends across alignment boundary, existing
    code increases the KASLR offset by size of kernel image. The
    offset is masked after resizing. There are cases, where after
    masking, we may still have kernel image extending across
    boundary. This eventually results in only 2MB block getting
    mapped while creating the page tables. This results in data aborts
    while accessing unmapped regions during second relocation (with
    kaslr offset) in __primary_switch. To fix this problem, round up the
    kernel image size, by swapper block size, before adding it for
    correction.
    
    For example consider below case, where kernel image still crosses
    1GB alignment boundary, after masking the offset, which is fixed
    by rounding up kernel image size.
    
    SWAPPER_TABLE_SHIFT = 30
    Swapper using section maps with section size 2MB.
    CONFIG_PGTABLE_LEVELS = 3
    VA_BITS = 39
    
    _text  : 0xffffff8008080000
    _end   : 0xffffff800aa1b000
    offset : 0x1f35600000
    mask = ((1UL << (VA_BITS - 2)) - 1) & ~(SZ_2M - 1)
    
    (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7c
    (_end + offset) >> SWAPPER_TABLE_SHIFT  = 0x3fffffe7d
    
    offset after existing correction (before mask) = 0x1f37f9b000
    (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d
    (_end + offset) >> SWAPPER_TABLE_SHIFT  = 0x3fffffe7d
    
    offset (after mask) = 0x1f37e00000
    (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7c
    (_end + offset) >> SWAPPER_TABLE_SHIFT  = 0x3fffffe7d
    
    new offset w/ rounding up = 0x1f38000000
    (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d
    (_end + offset) >> SWAPPER_TABLE_SHIFT  = 0x3fffffe7d
    
    Fixes: f80fb3a3 ("arm64: add support for kernel ASLR")
    Reviewed-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Signed-off-by: default avatarNeeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: default avatarSrinivas Ramana <sramana@codeaurora.org>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b9ed800f