Hi Aditya,

Thanks for your comments!

On Thu, Nov 6, 2025 at 7:52 PM Aditya Gupta <[email protected]> wrote:
>
> +shivang, lianbo
>
> Adding shivang, he can review/add details if needed
>
> On 25/11/06 04:06PM, Tao Liu wrote:
> > > <...snip...>
> >
> > Regarding to v1's discussion, we cannot run abiv1 program on abiv2
> > kernel, it's because abiv1 is big-endian and abiv2 is little-endian, and
> > abiv2, or ppc64le kernel doesn't support big-endian, or abiv1 program
> > cannot run upon it, see the following:
> >
> > $ file blkid
> > blkid: ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, Power ELF 
> > V1 ABI, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, 
> > BuildID[sha1]=b36e8a2a5e4d27039591a35fca38fa48735f5540, stripped
> > $ ~/qemu-10.1.2/build/qemu-ppc64 ./blkid
> > /dev/mapper/root: UUID="..." TYPE="xfs"
> > /dev/sda3: UUID="..." TYPE="LVM2_member" PARTUUID="..."
> > /dev/sda2: UUID="..." TYPE="xfs" PARTUUID="..."
> > /dev/mapper/swap: UUID="..." TYPE="swap"
> > /dev/mapper/home: UUID="..." TYPE="xfs"
> > /dev/sda1: PARTUUID="..."
> > $ ./blkid
> > -bash: ./blkid: cannot execute binary file: Exec format error
> > $ uname -a
> > Linux 6.12.0-150.el10.ppc64le #1 SMP Fri Oct 31 06:58:14 EDT 2025 ppc64le 
> > GNU/Linux
> > $ file /bin/bash
> > /bin/bash: ELF 64-bit LSB pie executable, 64-bit PowerPC or cisco 7500, 
> > OpenPOWER ELF V2 ABI, version 1 (SYSV), dynamically linked, interpreter 
> > /lib64/ld64.so.2, BuildID[sha1]=9ab800028ced16c5974f5b19cb6ed754178802a8, 
> > for GNU/Linux 3.10.0, stripped
> >
> > The abiv1 program blkid cannot be run on this machine, except with the
> > help of qemu. So from my view, we don't need to consider the case that abiv2
> > kernel might containing a abiv1 program or .ko.
> >
> > Please feel free to correct me if I'm wrong. @Aditya Gupta
>
> Yes Tao, that looks correct to me. I also don't think we need consider
> the incompatible abiv1<->abiv2 or little-endian<->big-endian kernel and
> userspace cases.
>
> About abiv1 always being big endian, i don't recall. Will go back and
> read, but I don't think we need to consider abiv2 kernel running abiv1
> program, I will give it a try if such case can exist.

Yeah, I'm not sure if abiv1 is always a big endian either. I found the
abiv1 program called blkid in [1].

[1]: 
https://cdimage.debian.org/cdimage/ports/9.0/ppc64/iso-cd/debian-9.0-ppc64-NETINST-1.iso

>
> >
> > ---
> >  defs.h    |  3 ++-
> >  netdump.c | 14 ++++++++++----
> >  ppc64.c   | 34 +++++++++++++++++++++++++++++++---
> >  symbols.c |  5 +++--
> >  4 files changed, 46 insertions(+), 10 deletions(-)
> >
> > diff --git a/defs.h b/defs.h
> > index ab4aee8..19dff88 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -4699,6 +4699,7 @@ struct efi_memory_desc_t {
> >  #define MSR_PR_LG    14      /* Problem State / Privilege Level */
> >                               /* Used to find the user or kernel-mode 
> > frame*/
> >
> > +#define STACK_SWITCH_FRAME_REGS         48
> >  #define STACK_FRAME_OVERHEAD            112
> >  #define EXCP_FRAME_MARKER               0x7265677368657265
> >
> > > <...snip...>
> >
> > @@ -3035,6 +3036,25 @@ ppc64_get_sp(ulong task)
> >       return sp;
> >  }
> >
> > +static bool
> > +is_ppc64_elf_abi_v2(void)
> > +{
> > +     static bool ret = false;
> > +     static bool checked = false;
> > +
> > +     if (checked)
> > +             return ret;
> > +     switch (file_elf_header(pc->namelist, "e_flags")) {
> > +     case 2:
> > +             ret = true;
> > +     case 1:
> > +             break;
> > +     default:
> > +             error(WARNING, "Unknown e_flags for v1/v2 elf_abi 
> > detection.\n");
> > +     }
> > +     checked = true;
> > +     return ret;
> > +}
> >
> >  /*
> >   *  get the SP and PC values for idle tasks.
> > @@ -3056,9 +3076,17 @@ get_ppc64_frame(struct bt_info *bt, ulong *getpc, 
> > ulong *getsp)
> >       sp = ppc64_get_sp(task);
> >       if (!INSTACK(sp, bt))
> >               goto out;
> > -     readmem(sp+STACK_FRAME_OVERHEAD, KVADDR, &regs,
> > -             sizeof(struct ppc64_pt_regs),
> > -             "PPC64 pt_regs", FAULT_ON_ERROR);
> > +
> > +     if (THIS_KERNEL_VERSION >= LINUX(6,2,0) && is_ppc64_elf_abi_v2()) {
>
> Did the issue only occur with 6.2.0+ or is it dependent only on the
> vmlinux being abiv2 ? Sorry i don't recall whether previous kernels were
> compiled with abiv1 always.

No, it has to be abiv2 & 6.2.0+, in order to let sp+48 take effect:

v6.1.158:
#define STACK_PT_REGS_OFFSET(sym, val) \
DEFINE(sym, STACK_FRAME_OVERHEAD + offsetof(struct pt_regs, val)) [1]
#define STACK_FRAME_OVERHEAD 112 [2]

[1]: 
https://elixir.bootlin.com/linux/v6.1.158/source/arch/powerpc/kernel/asm-offsets.c#L74
[2]: 
https://elixir.bootlin.com/linux/v6.1.158/source/arch/powerpc/include/asm/ptrace.h#L123

v6.2:
#define STACK_PT_REGS_OFFSET(sym, val) \
DEFINE(sym, STACK_INT_FRAME_REGS + offsetof(struct pt_regs, val)) [3]

#ifdef CONFIG_PPC64_ELF_ABI_V2 [4]
#define STACK_FRAME_MIN_SIZE 32
#define STACK_INT_FRAME_REGS (STACK_FRAME_MIN_SIZE + 16)
#else
#define STACK_FRAME_MIN_SIZE 112
#define STACK_INT_FRAME_REGS STACK_FRAME_MIN_SIZE
#endif
[3]: 
https://elixir.bootlin.com/linux/v6.2/source/arch/powerpc/kernel/asm-offsets.c#L74
[4]: 
https://elixir.bootlin.com/linux/v6.2/source/arch/powerpc/include/asm/ptrace.h#L123

So e.g. we are v6.0 + abiv2, we still need to use the original 112.

>
> > +             readmem(sp+STACK_SWITCH_FRAME_REGS, KVADDR, &regs,
> > +                     sizeof(struct ppc64_pt_regs),
> > +                     "PPC64 pt_regs", FAULT_ON_ERROR);
> > +     } else {
> > +             readmem(sp+STACK_FRAME_OVERHEAD, KVADDR, &regs,
> > +                     sizeof(struct ppc64_pt_regs),
> > +                     "PPC64 pt_regs", FAULT_ON_ERROR);
> > +     }
> > +
> >       ip = regs.nip;
> >       closest = closest_symbol(ip);
> >       if (STREQ(closest, ".__switch_to") || STREQ(closest, "__switch_to")) {
> > diff --git a/symbols.c b/symbols.c
> > index 480fdb6..0a11c2f 100644
> > --- a/symbols.c
> > +++ b/symbols.c
> > @@ -217,7 +217,7 @@ symtab_init(void)
> >        *  Check whether the namelist is a kerntypes file built by
> >        *  dwarfextract, which places a magic number in e_version.
> >        */
> > -     if (file_elf_version(pc->namelist) == EV_DWARFEXTRACT)
> > +     if (file_elf_header(pc->namelist, "e_version") == EV_DWARFEXTRACT)
> >               pc->flags |= KERNTYPES;
> >
> >       if (pc->flags & SYSMAP) {
> > @@ -13149,7 +13149,8 @@ load_module_symbols(char *modref, char *namelist, 
> > ulong base_addr)
> >               error(FATAL, "cannot determine object file format: %s\n",
> >                       namelist);
> >
> > -     if (LKCD_KERNTYPES() && (file_elf_version(namelist) == 
> > EV_DWARFEXTRACT))
> > +     if (LKCD_KERNTYPES() &&
> > +         (file_elf_header(namelist, "e_version") == EV_DWARFEXTRACT))
> >               goto add_symbols;   /* no symbols, add the debuginfo */
> >
> >       if (!(bfd_get_file_flags(mbfd) & HAS_SYMS))
>
> The patch looks good to me. Will test and respond.
>
> Thanks Tao !

Thanks Aditya!

>
> - Aditya G
>
> > --
> > 2.47.0
> >
>
--
Crash-utility mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to