[PATCH] powerpc: Allow relative pointers in bug table entries

Jordan Niethe jniethe5 at gmail.com
Mon Nov 30 11:59:27 AEDT 2020


On Sun, Nov 29, 2020 at 6:00 AM Christophe Leroy
<christophe.leroy at csgroup.eu> wrote:
>
>
>
> Le 27/11/2020 à 04:02, Jordan Niethe a écrit :
> > This enables GENERIC_BUG_RELATIVE_POINTERS on Power so that 32-bit
> > offsets are stored in the bug entries rather than 64-bit pointers.
> >
> > Signed-off-by: Jordan Niethe <jniethe5 at gmail.com>
> > ---
> >   arch/powerpc/Kconfig           |  4 ++++
> >   arch/powerpc/include/asm/bug.h | 37 ++++++++++++++++++++++++++++++++--
> >   arch/powerpc/xmon/xmon.c       | 17 ++++++++++++++--
> >   3 files changed, 54 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> > index e9f13fe08492..294108e0e5c6 100644
> > --- a/arch/powerpc/Kconfig
> > +++ b/arch/powerpc/Kconfig
> > @@ -311,6 +311,10 @@ config GENERIC_BUG
> >       default y
> >       depends on BUG
> >
> > +config GENERIC_BUG_RELATIVE_POINTERS
> > +     def_bool y
> > +     depends on GENERIC_BUG
> > +
> >   config SYS_SUPPORTS_APM_EMULATION
> >       default y if PMAC_APM_EMU
> >       bool
> > diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
> > index 338f36cd9934..d03d834042a1 100644
> > --- a/arch/powerpc/include/asm/bug.h
> > +++ b/arch/powerpc/include/asm/bug.h
> > @@ -12,7 +12,11 @@
> >   #ifdef CONFIG_DEBUG_BUGVERBOSE
> >   .macro EMIT_BUG_ENTRY addr,file,line,flags
> >        .section __bug_table,"aw"
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> As far as I understand, as soon as CONFIG_BUG is selected, GENERIC_BUG is automatically selected so
> GENERIC_BUG_RELATIVE_POINTERS is selected as well. Therefore this #ifndef is never possible.
Thanks, you are right. I'll fix that up.
>
> >   5001:        PPC_LONG \addr, 5002f
> > +#else
> > +5001:         .4byte \addr - 5001b, 5002f - 5001b
> > +#endif /* CONFIG_GENERIC_BUG_RELATIVE_POINTERS */
> >        .short \line, \flags
> >        .org 5001b+BUG_ENTRY_SIZE
> >        .previous
> > @@ -23,7 +27,11 @@
> >   #else
> >   .macro EMIT_BUG_ENTRY addr,file,line,flags
> >        .section __bug_table,"aw"
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> Same
>
> >   5001:        PPC_LONG \addr
> > +#else
> > +5001:         .4byte \addr - 5001b
> > +#endif /* CONFIG_GENERIC_BUG_RELATIVE_POINTERS */
> >        .short \flags
> >        .org 5001b+BUG_ENTRY_SIZE
> >        .previous
> > @@ -34,20 +42,45 @@
> >   /* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
> >      sizeof(struct bug_entry), respectively */
> >   #ifdef CONFIG_DEBUG_BUGVERBOSE
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> Same
>
> >   #define _EMIT_BUG_ENTRY                             \
> >       ".section __bug_table,\"aw\"\n"         \
> >       "2:\t" PPC_LONG "1b, %0\n"              \
> >       "\t.short %1, %2\n"                     \
> >       ".org 2b+%3\n"                          \
> >       ".previous\n"
> > -#else
> > +
> > +#else /* relative pointers */
> > +
> > +#define _EMIT_BUG_ENTRY                              \
> > +     ".section __bug_table,\"aw\"\n"         \
> > +     "2:\t.4byte 1b - 2b, %0 - 2b\n"         \
> > +     "\t.short %1, %2\n"                     \
> > +     ".org 2b+%3\n"                          \
> > +     ".previous\n"
> > +#endif /* relative pointers */
> > +
> > +#else /* verbose */
> > +
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> Same
>
> >   #define _EMIT_BUG_ENTRY                             \
> >       ".section __bug_table,\"aw\"\n"         \
> >       "2:\t" PPC_LONG "1b\n"                  \
> >       "\t.short %2\n"                         \
> >       ".org 2b+%3\n"                          \
> >       ".previous\n"
> > -#endif
> > +
> > +#else /* relative pointers */
> > +
> > +#define _EMIT_BUG_ENTRY                              \
> > +     ".section __bug_table,\"aw\"\n"         \
> > +     "2:\t.4byte 1b - 2b\n"          \
> > +     "\t.short %2\n"                         \
> > +     ".org 2b+%3\n"                          \
> > +     ".previous\n"
> > +
> > +#endif /* relative pointers */
> > +#endif /* verbose */
> >
> >   #define BUG_ENTRY(insn, flags, ...)                 \
> >       __asm__ __volatile__(                           \
> > diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> > index 55c43a6c9111..5f7cf7e95767 100644
> > --- a/arch/powerpc/xmon/xmon.c
> > +++ b/arch/powerpc/xmon/xmon.c
> > @@ -1731,6 +1731,9 @@ static void print_bug_trap(struct pt_regs *regs)
> >   #ifdef CONFIG_BUG
> >       const struct bug_entry *bug;
> >       unsigned long addr;
> > +#ifdef CONFIG_DEBUG_BUGVERBOSE
> > +     char *file;
> > +#endif
> >
> >       if (regs->msr & MSR_PR)
> >               return;         /* not in kernel */
> > @@ -1744,10 +1747,20 @@ static void print_bug_trap(struct pt_regs *regs)
> >               return;
> >
> >   #ifdef CONFIG_DEBUG_BUGVERBOSE
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> Same
>
> > +     file = bug->file;
> > +#else /* relative pointers */
> > +     file = (char *)bug + bug->file_disp;
> > +#endif /* relative pointers */
> >       printf("kernel BUG at %s:%u!\n",
> > -            bug->file, bug->line);
> > +            file, bug->line);
> >   #else
> > -     printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
> > +#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
>
> Same
>
> > +     addr = bug->addr;
> > +#else /* relative pointers */
> > +     addr = (unsigned long)bug + bug->bug_addr_disp;
> > +#endif /* relative pointers */
> > +     printf("kernel BUG at %px!\n", (void *)addr);
> >   #endif
> >   #endif /* CONFIG_BUG */
> >   }
> >
>
> Christophe


More information about the Linuxppc-dev mailing list