lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 2/5] MIPS: VDSO: Move disabling the VDSO logic to Kconfig
    Date
    After commit 9553d16fa671 ("init/kconfig: Add LD_VERSION Kconfig"), we
    have access to GNU ld's version at configuration time. As a result, we
    can make it clearer under what configuration circumstances the MIPS VDSO
    needs to be disabled.

    This is a prerequisite for getting rid of the MIPS VDSO binutils
    warning and linking the VDSO when LD is ld.lld. Wrapping the call to
    ld-ifversion with CONFIG_LD_IS_LLD does not work because the config
    values are wiped away during 'make clean'.

    Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
    ---

    v3 -> v4:

    * No changes.

    v2 -> v3:

    * Fix CONFIG macro in arch/mips/vdso/vdso.lds.S, thanks to Sedat for
    catching it.

    v1 -> v2:

    * New patch.

    arch/mips/Kconfig | 2 ++
    arch/mips/vdso/Kconfig | 18 ++++++++++++++++++
    arch/mips/vdso/Makefile | 30 ++----------------------------
    arch/mips/vdso/vdso.lds.S | 2 +-
    4 files changed, 23 insertions(+), 29 deletions(-)
    create mode 100644 arch/mips/vdso/Kconfig

    diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
    index 690718b3701af..45220e4b8a653 100644
    --- a/arch/mips/Kconfig
    +++ b/arch/mips/Kconfig
    @@ -3275,3 +3275,5 @@ endmenu
    source "drivers/firmware/Kconfig"

    source "arch/mips/kvm/Kconfig"
    +
    +source "arch/mips/vdso/Kconfig"
    diff --git a/arch/mips/vdso/Kconfig b/arch/mips/vdso/Kconfig
    new file mode 100644
    index 0000000000000..36a52158d849b
    --- /dev/null
    +++ b/arch/mips/vdso/Kconfig
    @@ -0,0 +1,18 @@
    +# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
    +# the base address of VDSO, the linker will emit a R_MIPS_PC32
    +# relocation in binutils > 2.25 but it will fail with older versions
    +# because that relocation is not supported for that symbol. As a result
    +# of which we are forced to disable the VDSO symbols when building
    +# with < 2.25 binutils on pre-R6 kernels. For more references on why we
    +# can't use other methods to get the base address of VDSO please refer to
    +# the comments on that file.
    +#
    +# GCC (at least up to version 9.2) appears to emit function calls that make use
    +# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
    +# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
    +
    +config MIPS_LD_CAN_LINK_VDSO
    + def_bool LD_VERSION >= 225000000
    +
    +config MIPS_DISABLE_VDSO
    + def_bool CPU_MICROMIPS || (!CPU_MIPSR6 && !MIPS_LD_CAN_LINK_VDSO)
    diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
    index d7fe8408603e8..92b53d1df42c3 100644
    --- a/arch/mips/vdso/Makefile
    +++ b/arch/mips/vdso/Makefile
    @@ -52,37 +52,11 @@ endif

    CFLAGS_REMOVE_vgettimeofday.o = -pg

    -DISABLE_VDSO := n
    -
    -#
    -# For the pre-R6 code in arch/mips/vdso/vdso.h for locating
    -# the base address of VDSO, the linker will emit a R_MIPS_PC32
    -# relocation in binutils > 2.25 but it will fail with older versions
    -# because that relocation is not supported for that symbol. As a result
    -# of which we are forced to disable the VDSO symbols when building
    -# with < 2.25 binutils on pre-R6 kernels. For more references on why we
    -# can't use other methods to get the base address of VDSO please refer to
    -# the comments on that file.
    -#
    -ifndef CONFIG_CPU_MIPSR6
    - ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
    +ifdef CONFIG_MIPS_DISABLE_VDSO
    + ifndef CONFIG_MIPS_LD_CAN_LINK_VDSO
    $(warning MIPS VDSO requires binutils >= 2.25)
    - DISABLE_VDSO := y
    endif
    -endif
    -
    -#
    -# GCC (at least up to version 9.2) appears to emit function calls that make use
    -# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
    -# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
    -#
    -ifdef CONFIG_CPU_MICROMIPS
    - DISABLE_VDSO := y
    -endif
    -
    -ifeq ($(DISABLE_VDSO),y)
    obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
    - ccflags-vdso += -DDISABLE_MIPS_VDSO
    endif

    # VDSO linker flags.
    diff --git a/arch/mips/vdso/vdso.lds.S b/arch/mips/vdso/vdso.lds.S
    index da4627430aba4..d90b65724d78e 100644
    --- a/arch/mips/vdso/vdso.lds.S
    +++ b/arch/mips/vdso/vdso.lds.S
    @@ -91,7 +91,7 @@ PHDRS
    VERSION
    {
    LINUX_2.6 {
    -#ifndef DISABLE_MIPS_VDSO
    +#ifndef CONFIG_MIPS_DISABLE_VDSO
    global:
    __vdso_clock_gettime;
    __vdso_gettimeofday;
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-04-29 00:15    [W:4.286 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site