lkml.org 
[lkml]   [2020]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v11 5/8] powerpc/64: make buildable without CONFIG_COMPAT
    Date
    There are numerous references to 32bit functions in generic and 64bit
    code so ifdef them out.

    Signed-off-by: Michal Suchanek <msuchanek@suse.de>
    ---
    v2:
    - fix 32bit ifdef condition in signal.c
    - simplify the compat ifdef condition in vdso.c - 64bit is redundant
    - simplify the compat ifdef condition in callchain.c - 64bit is redundant
    v3:
    - use IS_ENABLED and maybe_unused where possible
    - do not ifdef declarations
    - clean up Makefile
    v4:
    - further makefile cleanup
    - simplify is_32bit_task conditions
    - avoid ifdef in condition by using return
    v5:
    - avoid unreachable code on 32bit
    - make is_current_64bit constant on !COMPAT
    - add stub perf_callchain_user_32 to avoid some ifdefs
    v6:
    - consolidate current_is_64bit
    v7:
    - remove leftover perf_callchain_user_32 stub from previous series version
    v8:
    - fix build again - too trigger-happy with stub removal
    - remove a vdso.c hunk that causes warning according to kbuild test robot
    v9:
    - removed current_is_64bit in previous patch
    v10:
    - rebase on top of 70ed86f4de5bd
    ---
    arch/powerpc/include/asm/thread_info.h | 4 ++--
    arch/powerpc/kernel/Makefile | 6 +++---
    arch/powerpc/kernel/entry_64.S | 2 ++
    arch/powerpc/kernel/signal.c | 3 +--
    arch/powerpc/kernel/syscall_64.c | 6 ++----
    arch/powerpc/kernel/vdso.c | 3 ++-
    arch/powerpc/perf/callchain.c | 8 +++++++-
    7 files changed, 19 insertions(+), 13 deletions(-)

    diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
    index a2270749b282..ca6c97025704 100644
    --- a/arch/powerpc/include/asm/thread_info.h
    +++ b/arch/powerpc/include/asm/thread_info.h
    @@ -162,10 +162,10 @@ static inline bool test_thread_local_flags(unsigned int flags)
    return (ti->local_flags & flags) != 0;
    }

    -#ifdef CONFIG_PPC64
    +#ifdef CONFIG_COMPAT
    #define is_32bit_task() (test_thread_flag(TIF_32BIT))
    #else
    -#define is_32bit_task() (1)
    +#define is_32bit_task() (IS_ENABLED(CONFIG_PPC32))
    #endif

    #if defined(CONFIG_PPC64)
    diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
    index 5700231a8988..98a1c143b613 100644
    --- a/arch/powerpc/kernel/Makefile
    +++ b/arch/powerpc/kernel/Makefile
    @@ -42,16 +42,16 @@ CFLAGS_btext.o += -DDISABLE_BRANCH_PROFILING
    endif

    obj-y := cputable.o ptrace.o syscalls.o \
    - irq.o align.o signal_32.o pmc.o vdso.o \
    + irq.o align.o signal_$(BITS).o pmc.o vdso.o \
    process.o systbl.o idle.o \
    signal.o sysfs.o cacheinfo.o time.o \
    prom.o traps.o setup-common.o \
    udbg.o misc.o io.o misc_$(BITS).o \
    of_platform.o prom_parse.o
    -obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \
    - signal_64.o ptrace32.o \
    +obj-$(CONFIG_PPC64) += setup_64.o \
    paca.o nvram_64.o firmware.o note.o \
    syscall_64.o
    +obj-$(CONFIG_COMPAT) += sys_ppc32.o ptrace32.o signal_32.o
    obj-$(CONFIG_VDSO32) += vdso32/
    obj-$(CONFIG_PPC_WATCHDOG) += watchdog.o
    obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
    diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
    index 4c0d0400e93d..fe1421e08f09 100644
    --- a/arch/powerpc/kernel/entry_64.S
    +++ b/arch/powerpc/kernel/entry_64.S
    @@ -52,8 +52,10 @@
    SYS_CALL_TABLE:
    .tc sys_call_table[TC],sys_call_table

    +#ifdef CONFIG_COMPAT
    COMPAT_SYS_CALL_TABLE:
    .tc compat_sys_call_table[TC],compat_sys_call_table
    +#endif

    /* This value is used to mark exception frames on the stack. */
    exception_marker:
    diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
    index 4b0152108f61..a264989626fd 100644
    --- a/arch/powerpc/kernel/signal.c
    +++ b/arch/powerpc/kernel/signal.c
    @@ -247,7 +247,6 @@ static void do_signal(struct task_struct *tsk)
    sigset_t *oldset = sigmask_to_save();
    struct ksignal ksig = { .sig = 0 };
    int ret;
    - int is32 = is_32bit_task();

    BUG_ON(tsk != current);

    @@ -277,7 +276,7 @@ static void do_signal(struct task_struct *tsk)

    rseq_signal_deliver(&ksig, tsk->thread.regs);

    - if (is32) {
    + if (is_32bit_task()) {
    if (ksig.ka.sa.sa_flags & SA_SIGINFO)
    ret = handle_rt_signal32(&ksig, oldset, tsk);
    else
    diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall_64.c
    index 87d95b455b83..2dcbfe38f5ac 100644
    --- a/arch/powerpc/kernel/syscall_64.c
    +++ b/arch/powerpc/kernel/syscall_64.c
    @@ -24,7 +24,6 @@ notrace long system_call_exception(long r3, long r4, long r5,
    long r6, long r7, long r8,
    unsigned long r0, struct pt_regs *regs)
    {
    - unsigned long ti_flags;
    syscall_fn f;

    if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
    @@ -68,8 +67,7 @@ notrace long system_call_exception(long r3, long r4, long r5,

    local_irq_enable();

    - ti_flags = current_thread_info()->flags;
    - if (unlikely(ti_flags & _TIF_SYSCALL_DOTRACE)) {
    + if (unlikely(current_thread_info()->flags & _TIF_SYSCALL_DOTRACE)) {
    /*
    * We use the return value of do_syscall_trace_enter() as the
    * syscall number. If the syscall was rejected for any reason
    @@ -94,7 +92,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
    /* May be faster to do array_index_nospec? */
    barrier_nospec();

    - if (unlikely(ti_flags & _TIF_32BIT)) {
    + if (unlikely(is_32bit_task())) {
    f = (void *)compat_sys_call_table[r0];

    r3 &= 0x00000000ffffffffULL;
    diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
    index b9a108411c0d..77da3b7d304d 100644
    --- a/arch/powerpc/kernel/vdso.c
    +++ b/arch/powerpc/kernel/vdso.c
    @@ -656,7 +656,8 @@ static void __init vdso_setup_syscall_map(void)
    if (sys_call_table[i] != sys_ni_syscall)
    vdso_data->syscall_map_64[i >> 5] |=
    0x80000000UL >> (i & 0x1f);
    - if (compat_sys_call_table[i] != sys_ni_syscall)
    + if (IS_ENABLED(CONFIG_COMPAT) &&
    + compat_sys_call_table[i] != sys_ni_syscall)
    vdso_data->syscall_map_32[i >> 5] |=
    0x80000000UL >> (i & 0x1f);
    #else /* CONFIG_PPC64 */
    diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c
    index 194c7fd933e6..8a274bd523b1 100644
    --- a/arch/powerpc/perf/callchain.c
    +++ b/arch/powerpc/perf/callchain.c
    @@ -15,7 +15,7 @@
    #include <asm/sigcontext.h>
    #include <asm/ucontext.h>
    #include <asm/vdso.h>
    -#ifdef CONFIG_PPC64
    +#ifdef CONFIG_COMPAT
    #include "../kernel/ppc32.h"
    #endif
    #include <asm/pte-walk.h>
    @@ -285,6 +285,7 @@ static inline void perf_callchain_user_64(struct perf_callchain_entry_ctx *entry

    #endif /* CONFIG_PPC64 */

    +#if defined(CONFIG_PPC32) || defined(CONFIG_COMPAT)
    /*
    * On 32-bit we just access the address and let hash_page create a
    * HPTE if necessary, so there is no need to fall back to reading
    @@ -448,6 +449,11 @@ static void perf_callchain_user_32(struct perf_callchain_entry_ctx *entry,
    sp = next_sp;
    }
    }
    +#else /* 32bit */
    +static void perf_callchain_user_32(struct perf_callchain_entry_ctx *entry,
    + struct pt_regs *regs)
    +{}
    +#endif /* 32bit */

    void
    perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
    --
    2.23.0
    \
     
     \ /
      Last update: 2020-03-19 13:21    [W:2.954 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site