Re: [PATCH v6 4/6] powerpc/64: make buildable without CONFIG_COMPAT
From: Michal SuchÃnek
Date: Fri Aug 30 2019 - 16:35:42 EST
On Fri, 30 Aug 2019 22:21:09 +0200
Christophe Leroy <christophe.leroy@xxxxxx> wrote:
> Le 30/08/2019 Ã 20:57, Michal Suchanek a ÃcritÂ:
> > There are numerous references to 32bit functions in generic and 64bit
> > code so ifdef them out.
> >
> > Signed-off-by: Michal Suchanek <msuchanek@xxxxxxx>
> > ---
> > 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
> > ---
> > arch/powerpc/include/asm/thread_info.h | 4 +--
> > arch/powerpc/kernel/Makefile | 7 +++--
> > 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 | 5 ++--
> > arch/powerpc/perf/callchain.c | 37 +++++++++++++++-----------
> > 7 files changed, 33 insertions(+), 31 deletions(-)
> >
>
> [...]
>
> > diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c
> > index b7cdcce20280..788ad2c63f18 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>
> > @@ -268,16 +268,6 @@ static void perf_callchain_user_64(struct perf_callchain_entry_ctx *entry,
> > }
> > }
> >
> > -static inline int current_is_64bit(void)
> > -{
> > - /*
> > - * We can't use test_thread_flag() here because we may be on an
> > - * interrupt stack, and the thread flags don't get copied over
> > - * from the thread_info on the main stack to the interrupt stack.
> > - */
> > - return !test_ti_thread_flag(task_thread_info(current), TIF_32BIT);
> > -}
> > -
> > #else /* CONFIG_PPC64 */
> > static int read_user_stack_slow(void __user *ptr, void *buf, int nb)
> > {
> > @@ -314,11 +304,6 @@ static inline void perf_callchain_user_64(struct perf_callchain_entry_ctx *entry
> > {
> > }
> >
> > -static inline int current_is_64bit(void)
> > -{
> > - return 0;
> > -}
> > -
> > static inline int valid_user_sp(unsigned long sp, int is_64)
> > {
> > if (!sp || (sp & 7) || sp > TASK_SIZE - 32)
> > @@ -334,6 +319,7 @@ static inline int valid_user_sp(unsigned long sp, int is_64)
> >
> > #endif /* CONFIG_PPC64 */
> >
> > +#if defined(CONFIG_PPC32) || defined(CONFIG_COMPAT)
> > /*
> > * Layout for non-RT signal frames
> > */
> > @@ -475,6 +461,25 @@ 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)
> > +{
> > + (void)&read_user_stack_32; /* unused if !COMPAT */
>
> You don't need that anymore do you ?
Yes, this part is not needed. It was removed later anyway but this
state is broken.
Thanks
Michal
>
> Christophe
>
> > +}
> > +#endif /* 32bit */
> > +
> > +static inline int current_is_64bit(void)
> > +{
> > + if (!IS_ENABLED(CONFIG_COMPAT))
> > + return IS_ENABLED(CONFIG_PPC64);
> > + /*
> > + * We can't use test_thread_flag() here because we may be on an
> > + * interrupt stack, and the thread flags don't get copied over
> > + * from the thread_info on the main stack to the interrupt stack.
> > + */
> > + return !test_ti_thread_flag(task_thread_info(current), TIF_32BIT);
> > +}
> >
> > void
> > perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
> >