• Vasily Gorbik's avatar
    s390/decompressor: correct EXCLUDE_FILE construct · 2d6f74f7
    Vasily Gorbik authored
    The following linker construct is problematic with linkers of
    binutils < 2.28:
    
    EXCLUDE_FILE (*piggy.o) *(.rodata.*)
    
    from 8f1732fc2a11dc of binutils:
    "though the linker accepts this without complaint the
    EXCLUDE_FILE part is silently ignored and has no effect."
    
    Silent ignoring of EXCLUDE_FILE construct made .rodata.compressed be
    part of .rodata, and in case of .rodata.compressed following some
    unaligned data, input_len would also become unaligned.
    
    from arch/s390/boot/compressed/vmlinux.map:
     .rodata.compressed
                    0x0000000000012fea   0x4d57e7 arch/s390/boot/compressed/piggy.o
                    0x0000000000012fea                input_len
                    0x0000000000012fee                input_data
    
    input_len is later used here:
    arch/s390/boot/compressed/misc.c:113
    	__decompress(input_data, input_len, NULL, NULL, output, 0, NULL, error);
    
    asm generated by gcc looks like:
    	.loc 3 113 0
    egfrl	%r11,input_len
    
    from what assembler generates invalid (the second operand must be aligned
    on a doubleword boundary):
       0x00000000000129b4 <+148>:   c4 bc 00 00 03 1b       lgfrl   %r11,0x12fea
    hence specification exception is recognized.
    
    To avoid an issue use EXCLUDE_FILE construct which is recognized by
    older linkers (since at least binutils-2_11)
    	*(EXCLUDE_FILE (*piggy.o) .rodata.compressed)
    
    Also ensure that .rodata.compressed is at least doubleword aligned.
    
    Fixes: 89b5202e ("s390/decompressor: support uncompressed kernel")
    Reported-by: default avatarHalil Pasic <pasic@linux.ibm.com>
    Acked-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    2d6f74f7
vmlinux.lds.S 1.01 KB