• Benjamin Herrenschmidt's avatar
    [POWERPC] Support feature fixups in vdso's · 0909c8c2
    Benjamin Herrenschmidt authored
    This patch reworks the feature fixup mecanism so vdso's can be fixed up.
    The main issue was that the construct:
    
            .long   label  (or .llong on 64 bits)
    
    will not work in the case of a shared library like the vdso. It will
    generate an empty placeholder in the fixup table along with a reloc,
    which is not something we can deal with in the vdso.
    
    The idea here (thanks Alan Modra !) is to instead use something like:
    
    1:
            .long   label - 1b
    
    That is, the feature fixup tables no longer contain addresses of bits of
    code to patch, but offsets of such code from the fixup table entry
    itself. That is properly resolved by ld when building the .so's. I've
    modified the fixup mecanism generically to use that method for the rest
    of the kernel as well.
    
    Another trick is that the 32 bits vDSO included in the 64 bits kernel
    need to have a table in the 64 bits format. However, gas does not
    support 32 bits code with a statement of the form:
    
            .llong  label - 1b  (Or even just .llong label)
    
    That is, it cannot emit the right fixup/relocation for the linker to use
    to assign a 32 bits address to an .llong field. Thus, in the specific
    case of the 32 bits vdso built as part of the 64 bits kernel, we are
    using a modified macro that generates:
    
            .long   0xffffffff
            .llong  label - 1b
    
    Note that is assumes that the value is negative which is enforced by
    the .lds (those offsets are always negative as the .text is always
    before the fixup table and gas doesn't support emiting the reloc the
    other way around).
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    0909c8c2
vdso.c 19.6 KB