• Ulrich Weigand's avatar
    powerpc/module: Handle R_PPC64_ENTRY relocations · cd8014be
    Ulrich Weigand authored
    commit a61674bd upstream.
    
    GCC 6 will include changes to generated code with -mcmodel=large,
    which is used to build kernel modules on powerpc64le.  This was
    necessary because the large model is supposed to allow arbitrary
    sizes and locations of the code and data sections, but the ELFv2
    global entry point prolog still made the unconditional assumption
    that the TOC associated with any particular function can be found
    within 2 GB of the function entry point:
    
    func:
    	addis r2,r12,(.TOC.-func)@ha
    	addi  r2,r2,(.TOC.-func)@l
    	.localentry func, .-func
    
    To remove this assumption, GCC will now generate instead this global
    entry point prolog sequence when using -mcmodel=large:
    
    	.quad .TOC.-func
    func:
    	.reloc ., R_PPC64_ENTRY
    	ld    r2, -8(r12)
    	add   r2, r2, r12
    	.localentry func, .-func
    
    The new .reloc triggers an optimization in the linker that will
    replace this new prolog with the original code (see above) if the
    linker determines that the distance between .TOC. and func is in
    range after all.
    
    Since this new relocation is now present in module object files,
    the kernel module loader is required to handle them too.  This
    patch adds support for the new relocation and implements the
    same optimization done by the GNU linker.
    Signed-off-by: default avatarUlrich Weigand <ulrich.weigand@de.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    cd8014be
module_64.c 19 KB