Hi lianbo,

On Fri, Jun 20, 2025 at 7:06 PM lijiang <liji...@redhat.com> wrote:
>
> On Thu, Jun 19, 2025 at 7:16 PM Tao Liu <l...@redhat.com> wrote:
>>
>> Hi lianbo,
>>
>> On Thu, Jun 19, 2025 at 2:49 PM lijiang <liji...@redhat.com> wrote:
>> >
>> > For ppc64 machine, I noticed that the gdb bt may not work as expected, for 
>> > example:
>> >
>> > crash> set 2
>> >     PID: 2
>> > COMMAND: "kthreadd"
>> >    TASK: c000000004797f80  [THREAD_INFO: c000000004797f80]
>> >     CPU: 0
>> >   STATE: TASK_INTERRUPTIBLE
>> > crash> bt
>> > PID: 2        TASK: c000000004797f80  CPU: 0    COMMAND: "kthreadd"
>> >  #0 [c00000000484fbc0] _end at c00000000484fd70  (unreliable)
>> >  #1 [c00000000484fd70] __switch_to at c00000000001fabc
>> >  #2 [c00000000484fdd0] __schedule at c0000000011ca9dc
>> >  #3 [c00000000484feb0] schedule at c0000000011caeb0
>> >  #4 [c00000000484ff20] kthreadd at c0000000001af6c4
>> >  #5 [c00000000484ffe0] start_kernel_thread at c00000000000ded8
>> > crash> gdb bt
>> > #0  0xc00000000484fd70 in ?? ()
>> > gdb: gdb request failed: bt
>> > crash>
>> > crash> sys|grep RELEASE
>> >      RELEASE: 6.12.0
>> >
>> > Is that expected behavior?(I do not remember if I mentioned the similar 
>> > issue in the previous patch review.)
>> >
>> This is a ppc bug which we encountered some time ago. See [1], in
>> short, we cannot determine ABI_V2/V1 correctly, a ABI_V2 kernel might
>> running a ABI_V1 program, see [2]. But it has no relation to gdb bt.
>>
>
> Can you also add it to the patch log? At least we can mark it as a known 
> issue, and  it's
> easy to recall this case in the future.

Sure, will do it in v4

Thanks,
Tao Liu

>
> Thanks
> Lianbo
>
>>
>> [1]: 
>> https://www.mail-archive.com/devel@lists.crash-utility.osci.io/msg01124.html
>> [2]: 
>> https://www.mail-archive.com/devel@lists.crash-utility.osci.io/msg01139.html
>>
>> > I have no more comments for other changes, just three issues(see another 
>> > two comments).
>>
>> Thanks,
>> Tao Liu
>>
>> >
>> > Thanks
>> > Lianbo
>> >
>> > On Tue, Jun 3, 2025 at 1:18 PM <devel-requ...@lists.crash-utility.osci.io> 
>> > wrote:
>> >>
>> >> Date: Tue,  3 Jun 2025 17:11:38 +1200
>> >> From: Tao Liu <l...@redhat.com>
>> >> Subject: [Crash-utility] [PATCH v3 5/5] ppc64: Add gdb multi-stack
>> >>         unwind support
>> >> To: devel@lists.crash-utility.osci.io
>> >> Cc: Alexey Makhalov <alexey.makha...@broadcom.com>
>> >> Message-ID: <20250603051138.59896-6-l...@redhat.com>
>> >> Content-Type: text/plain; charset="US-ASCII"; x-default=true
>> >>
>> >> Co-developed-by: Alexey Makhalov <alexey.makha...@broadcom.com>
>> >> Co-developed-by: Tao Liu <l...@redhat.com>
>> >> Signed-off-by: Tao Liu <l...@redhat.com>
>> >> ---
>> >>  ppc64.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
>> >>  1 file changed, 64 insertions(+), 6 deletions(-)
>> >>
>> >> diff --git a/ppc64.c b/ppc64.c
>> >> index 532eb3f..d1a5067 100644
>> >> --- a/ppc64.c
>> >> +++ b/ppc64.c
>> >> @@ -2053,6 +2053,7 @@ ppc64_back_trace_cmd(struct bt_info *bt)
>> >>         char buf[BUFSIZE];
>> >>         struct gnu_request *req;
>> >>         extern void print_stack_text_syms(struct bt_info *, ulong, ulong);
>> >> +       extra_stacks_idx = 0;
>> >>
>> >>          bt->flags |= BT_EXCEPTION_FRAME;
>> >>
>> >> @@ -2071,6 +2072,29 @@ ppc64_back_trace_cmd(struct bt_info *bt)
>> >>          req->pc = bt->instptr;
>> >>          req->sp = bt->stkptr;
>> >>
>> >> +       if (is_task_active(bt->task)) {
>> >> +               if (!extra_stacks_regs[extra_stacks_idx]) {
>> >> +                       extra_stacks_regs[extra_stacks_idx] =
>> >> +                               (struct user_regs_bitmap_struct *)
>> >> +                               malloc(sizeof(struct 
>> >> user_regs_bitmap_struct));
>> >> +               }
>> >> +               memset(extra_stacks_regs[extra_stacks_idx], 0,
>> >> +                       sizeof(struct user_regs_bitmap_struct));
>> >> +               extra_stacks_regs[extra_stacks_idx]->ur.nip = req->pc;
>> >> +               extra_stacks_regs[extra_stacks_idx]->ur.gpr[1] = req->sp;
>> >> +               SET_BIT(extra_stacks_regs[extra_stacks_idx]->bitmap,
>> >> +                       REG_SEQ(ppc64_pt_regs, nip));
>> >> +               SET_BIT(extra_stacks_regs[extra_stacks_idx]->bitmap,
>> >> +                       REG_SEQ(ppc64_pt_regs, gpr[0]) + 1);
>> >> +               if (!bt->machdep ||
>> >> +                    (extra_stacks_regs[extra_stacks_idx]->ur.gpr[1] !=
>> >> +                     ((struct user_regs_bitmap_struct 
>> >> *)(bt->machdep))->ur.gpr[1] &&
>> >> +                     extra_stacks_regs[extra_stacks_idx]->ur.nip !=
>> >> +                     ((struct user_regs_bitmap_struct 
>> >> *)(bt->machdep))->ur.nip)) {
>> >> +                       gdb_add_substack (extra_stacks_idx++);
>> >> +               }
>> >> +       }
>> >> +
>> >>         if (bt->flags &
>> >>         (BT_TEXT_SYMBOLS|BT_TEXT_SYMBOLS_PRINT|BT_TEXT_SYMBOLS_NOPRINT)) {
>> >>                 if (!INSTACK(req->sp, bt))
>> >> @@ -2512,6 +2536,28 @@ ppc64_print_eframe(char *efrm_str, struct 
>> >> ppc64_pt_regs *regs,
>> >>         fprintf(fp, " %s [%lx] exception frame:\n", efrm_str, regs->trap);
>> >>         ppc64_print_regs(regs);
>> >>         ppc64_print_nip_lr(regs, 1);
>> >> +
>> >> +       if (!((regs->msr >> MSR_PR_LG) & 0x1) &&
>> >> +           !(bt->flags & BT_EFRAME_SEARCH)) {
>> >> +               if (!extra_stacks_regs[extra_stacks_idx]) {
>> >> +                       extra_stacks_regs[extra_stacks_idx] =
>> >> +                               (struct user_regs_bitmap_struct *)
>> >> +                               malloc(sizeof(struct 
>> >> user_regs_bitmap_struct));
>> >> +               }
>> >> +               memset(extra_stacks_regs[extra_stacks_idx], 0,
>> >> +                       sizeof(struct user_regs_bitmap_struct));
>> >> +               memcpy(&extra_stacks_regs[extra_stacks_idx]->ur, regs,
>> >> +                       sizeof(struct ppc64_pt_regs));
>> >> +               for (int i = 0; i < sizeof(struct 
>> >> ppc64_pt_regs)/sizeof(ulong); i++)
>> >> +                       
>> >> SET_BIT(extra_stacks_regs[extra_stacks_idx]->bitmap, i);
>> >> +               if (!bt->machdep ||
>> >> +                    (extra_stacks_regs[extra_stacks_idx]->ur.gpr[1] !=
>> >> +                     ((struct user_regs_bitmap_struct 
>> >> *)(bt->machdep))->ur.gpr[1] &&
>> >> +                     extra_stacks_regs[extra_stacks_idx]->ur.nip !=
>> >> +                     ((struct user_regs_bitmap_struct 
>> >> *)(bt->machdep))->ur.nip)) {
>> >> +                       gdb_add_substack (extra_stacks_idx++);
>> >> +               }
>> >> +       }
>> >>  }
>> >>
>> >>  static int
>> >> @@ -2552,6 +2598,12 @@ ppc64_get_current_task_reg(int regno, const char 
>> >> *name, int size,
>> >>         tc = CURRENT_CONTEXT();
>> >>         if (!tc)
>> >>                 return FALSE;
>> >> +
>> >> +       if (sid && sid <= extra_stacks_idx) {
>> >> +               ur_bitmap = extra_stacks_regs[sid - 1];
>> >> +               goto get_sub;
>> >> +       }
>> >> +
>> >>         BZERO(&bt_setup, sizeof(struct bt_info));
>> >>         clone_bt_info(&bt_setup, &bt_info, tc);
>> >>         fill_stackbuf(&bt_info);
>> >> @@ -2570,39 +2622,45 @@ ppc64_get_current_task_reg(int regno, const char 
>> >> *name, int size,
>> >>                 goto get_all;
>> >>         }
>> >>
>> >> +get_sub:
>> >>         switch (regno) {
>> >>         case PPC64_R0_REGNUM ... PPC64_R31_REGNUM:
>> >>                 if (!NUM_IN_BITMAP(ur_bitmap->bitmap,
>> >>                     REG_SEQ(ppc64_pt_regs, gpr[0]) + regno - 
>> >> PPC64_R0_REGNUM)) {
>> >> -                       FREEBUF(ur_bitmap);
>> >> +                       if (!sid)
>> >> +                               FREEBUF(ur_bitmap);
>> >>                         return FALSE;
>> >>                 }
>> >>                 break;
>> >>         case PPC64_PC_REGNUM:
>> >>                 if (!NUM_IN_BITMAP(ur_bitmap->bitmap,
>> >>                     REG_SEQ(ppc64_pt_regs, nip))) {
>> >> -                       FREEBUF(ur_bitmap);
>> >> +                       if (!sid)
>> >> +                               FREEBUF(ur_bitmap);
>> >>                         return FALSE;
>> >>                 }
>> >>                 break;
>> >>         case PPC64_MSR_REGNUM:
>> >>                 if (!NUM_IN_BITMAP(ur_bitmap->bitmap,
>> >>                     REG_SEQ(ppc64_pt_regs, msr))) {
>> >> -                       FREEBUF(ur_bitmap);
>> >> +                       if (!sid)
>> >> +                               FREEBUF(ur_bitmap);
>> >>                         return FALSE;
>> >>                 }
>> >>                 break;
>> >>         case PPC64_LR_REGNUM:
>> >>                 if (!NUM_IN_BITMAP(ur_bitmap->bitmap,
>> >>                     REG_SEQ(ppc64_pt_regs, link))) {
>> >> -                       FREEBUF(ur_bitmap);
>> >> +                       if (!sid)
>> >> +                               FREEBUF(ur_bitmap);
>> >>                         return FALSE;
>> >>                 }
>> >>                 break;
>> >>         case PPC64_CTR_REGNUM:
>> >>                 if (!NUM_IN_BITMAP(ur_bitmap->bitmap,
>> >>                     REG_SEQ(ppc64_pt_regs, ctr))) {
>> >> -                       FREEBUF(ur_bitmap);
>> >> +                       if (!sid)
>> >> +                               FREEBUF(ur_bitmap);
>> >>                         return FALSE;
>> >>                 }
>> >>                 break;
>> >> @@ -2645,7 +2703,7 @@ get_all:
>> >>                 ret = TRUE;
>> >>                 break;
>> >>         }
>> >> -       if (bt_info.need_free) {
>> >> +       if (!sid && bt_info.need_free) {
>> >>                 FREEBUF(ur_bitmap);
>> >>                 bt_info.need_free = FALSE;
>> >>         }
>> >> --
>> >> 2.47.0
>> >
>> > --
>>
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to