Hi Lianbo & Guanyou,
On Tue, Dec 10, 2024 at 9:45 PM lijiang <lijiang(a)redhat.com> wrote:
Thank you for the update, Guanyou.
The v2(attached patch) looks good to me, So: Ack.
Thanks for the v2 patch. I didn't realize we could get extra regs as
x19 ~ x28 from cpu_context in the first place, thanks a lot for your
improvements on this! @Guanyou Chen . For v2 patch: Ack.
Thanks,
Tao Liu
Thanks
Lianbo
On Tue, Dec 10, 2024 at 2:29 PM Guanyou Chen <chenguanyou9338(a)gmail.com> wrote:
>
> Hi lianbo
>
> > Looks like some variable outputs are not aligned.
> x19~x28 not aligned.
>
> help -o:
> task_struct_thread_reg29: -1
> task_struct_thread_reg31: -1
> task_struct_thread_context_x19: 3648
> task_struct_thread_context_x20: 3656
> task_struct_thread_context_x21: 3664
> task_struct_thread_context_x22: 3672
> task_struct_thread_context_x23: 3680
> task_struct_thread_context_x24: 3688
> task_struct_thread_context_x25: 3696
> task_struct_thread_context_x26: 3704
> task_struct_thread_context_x27: 3712
> task_struct_thread_context_x28: 3720
> task_struct_thread_context_fp: 3728
> task_struct_thread_context_sp: 3736
> task_struct_thread_context_pc: 3744
> task_struct_processor: -1
> task_struct_p_pptr: -1
>
> lijiang <lijiang(a)redhat.com> 于2024年12月10日周二 11:55写道:
>>
>> On Wed, Nov 6, 2024 at 10:41 AM <devel-request(a)lists.crash-utility.osci.io>
wrote:
>>>
>>> Date: Wed, 6 Nov 2024 10:37:22 +0800
>>> From: Guanyou Chen <chenguanyou9338(a)gmail.com>
>>> Subject: [Crash-utility] [PATCH] arm64: gdb stack unwind append more
>>> registers
>>> To: Lianbo <lijiang(a)redhat.com>, Tao Liu <ltao(a)redhat.com>,
>>> devel(a)lists.crash-utility.osci.io
>>> Message-ID:
>>>
<CAHS3RMVgR5aoC99hwJeBGxfHn8JWakJTib8C+wfJD88aCMRWPw(a)mail.gmail.com>
>>> Content-Type: multipart/mixed;
boundary="00000000000061369a06263566c3"
>>>
>>> --00000000000061369a06263566c3
>>> Content-Type: multipart/alternative;
boundary="00000000000061369906263566c1"
>>>
>>> --00000000000061369906263566c1
>>> Content-Type: text/plain; charset="UTF-8"
>>>
>>> Hi Lianbo, Tao
>>>
>>> Let gdb fetch_registers include cpu context x19~x28,
>>> This may not mean for already scheduled tasks, but
>>> gdb stack unwind show more args.
>>>
>>> Before:
>>> crash> gdb bt
>>> #0 __switch_to (prev=<unavailable>,
prev@entry=0xffffff80025f0000,
>>> next=next@entry=<unavailable>) at arch/arm64/kernel/process.c:566
>>> #1 0xffffffc008f820b8 in context_switch (rq=0xffffff81fcf419c0,
>>> prev=0xffffff80025f0000, next=<unavailable>, rf=<optimized out>)
at
>>> kernel/sched/core.c:5471
>>> #2 __schedule (sched_mode=<optimized out>,
sched_mode@entry=168999904)
>>> at kernel/sched/core.c:6857
>>> #3 0xffffffc008f82514 in schedule () at kernel/sched/core.c:6933
>>> ...
>>>
>>> After:
>>> crash> gdb bt
>>> #0 __switch_to (prev=prev@entry=0xffffff80025f0000,
>>> next=next@entry=0xffffff80026092c0)
>>> at arch/arm64/kernel/process.c:566
>>> #1 0xffffffc008f820b8 in context_switch (rq=0xffffff81fcf419c0,
>>> prev=0xffffff80025f0000, next=0xffffff80026092c0, rf=<optimized out>)
at
>>> kernel/sched/core.c:5471
>>> #2 __schedule (sched_mode=<optimized out>,
sched_mode@entry=168999904)
>>> at kernel/sched/core.c:6857
>>> #3 0xffffffc008f82514 in schedule () at kernel/sched/core.c:6933
>>> ...
>>>
>>> Signed-off-by: Guanyou.Chen <chenguanyou(a)xiaomi.com>
>>> ---
>>> arm64.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>>> defs.h | 20 +++++++++++++++++
>>> symbols.c | 32 ++++++++++++++++++++++-----
>>> 3 files changed, 110 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/arm64.c b/arm64.c
>>> index 4521b45..86dc341 100644
>>> --- a/arm64.c
>>> +++ b/arm64.c
>>> @@ -2731,6 +2731,9 @@ arm64_stackframe_init(void)
>>> long thread_struct_cpu_context;
>>> long context_sp, context_pc, context_fp;
>>> struct syment *sp1, *sp1n, *sp2, *sp2n, *sp3, *sp3n;
>>> + long context_x19, context_x20, context_x21, context_x22;
>>> + long context_x23, context_x24, context_x25, context_x26;
>>> + long context_x27, context_x28;
>>>
>>
>> I would suggest placing these variables context_x19-28 behind the local variables
context_sp,pc and fp, and putting them together.
>>
>>>
>>> STRUCT_SIZE_INIT(note_buf, "note_buf_t");
>>> STRUCT_SIZE_INIT(elf_prstatus, "elf_prstatus");
>>> @@ -2814,6 +2817,16 @@ arm64_stackframe_init(void)
>>> context_sp = MEMBER_OFFSET("cpu_context", "sp");
>>> context_fp = MEMBER_OFFSET("cpu_context", "fp");
>>> context_pc = MEMBER_OFFSET("cpu_context", "pc");
>>> + context_x19 = MEMBER_OFFSET("cpu_context", "x19");
>>> + context_x20 = MEMBER_OFFSET("cpu_context", "x20");
>>> + context_x21 = MEMBER_OFFSET("cpu_context", "x21");
>>> + context_x22 = MEMBER_OFFSET("cpu_context", "x22");
>>> + context_x23 = MEMBER_OFFSET("cpu_context", "x23");
>>> + context_x24 = MEMBER_OFFSET("cpu_context", "x24");
>>> + context_x25 = MEMBER_OFFSET("cpu_context", "x25");
>>> + context_x26 = MEMBER_OFFSET("cpu_context", "x26");
>>> + context_x27 = MEMBER_OFFSET("cpu_context", "x27");
>>> + context_x28 = MEMBER_OFFSET("cpu_context", "x28");
>>> if (context_sp == INVALID_OFFSET) {
>>> error(INFO, "cannot determine cpu_context.sp offset\n");
>>> return;
>>> @@ -2832,6 +2845,26 @@ arm64_stackframe_init(void)
>>> task_struct_thread + thread_struct_cpu_context + context_fp;
>>> ASSIGN_OFFSET(task_struct_thread_context_pc) =
>>> task_struct_thread + thread_struct_cpu_context + context_pc;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x19) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x19;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x20) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x20;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x21) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x21;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x22) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x22;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x23) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x23;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x24) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x24;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x25) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x25;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x26) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x26;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x27) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x27;
>>> + ASSIGN_OFFSET(task_struct_thread_context_x28) =
>>> + task_struct_thread + thread_struct_cpu_context + context_x28;
>>> }
>>>
>>> #define KERNEL_MODE (1)
>>> @@ -4256,6 +4289,16 @@ arm64_get_stackframe(struct bt_info *bt, struct
>>> arm64_stackframe *frame)
>>> frame->sp = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_sp));
>>> frame->pc = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_pc));
>>> frame->fp = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_fp));
>>> + frame->x19 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x19));
>>> + frame->x20 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x20));
>>> + frame->x21 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x21));
>>> + frame->x22 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x22));
>>> + frame->x23 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x23));
>>> + frame->x24 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x24));
>>> + frame->x25 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x25));
>>> + frame->x26 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x26));
>>> + frame->x27 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x27));
>>> + frame->x28 = ULONG(tt->task_struct +
>>> OFFSET(task_struct_thread_context_x28));
>>>
>>> return TRUE;
>>> }
>>> @@ -4280,10 +4323,29 @@ arm64_get_stack_frame(struct bt_info *bt, ulong
>>> *pcp, ulong *spp)
>>> ur_bitmap->ur.pc = stackframe.pc;
>>> ur_bitmap->ur.sp = stackframe.sp;
>>> ur_bitmap->ur.regs[29] = stackframe.fp;
>>> + ur_bitmap->ur.regs[28] = stackframe.x28;
>>> + ur_bitmap->ur.regs[27] = stackframe.x27;
>>> + ur_bitmap->ur.regs[26] = stackframe.x26;
>>> + ur_bitmap->ur.regs[25] = stackframe.x25;
>>> + ur_bitmap->ur.regs[24] = stackframe.x24;
>>> + ur_bitmap->ur.regs[23] = stackframe.x23;
>>> + ur_bitmap->ur.regs[22] = stackframe.x22;
>>> + ur_bitmap->ur.regs[21] = stackframe.x21;
>>> + ur_bitmap->ur.regs[20] = stackframe.x20;
>>> + ur_bitmap->ur.regs[19] = stackframe.x19;
>>> SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, pc));
>>> SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, sp));
>>> - SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0])
>>> - + X29_REGNUM - X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X29_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X28_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X27_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X26_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X25_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X24_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X23_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X22_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X21_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X20_REGNUM
-
>>> X0_REGNUM);
>>> + SET_BIT(ur_bitmap->bitmap, REG_SEQ(arm64_pt_regs, regs[0]) + X19_REGNUM
-
>>> X0_REGNUM);
>>> bt->machdep = ur_bitmap;
>>> bt->need_free = TRUE;
>>> }
>>> diff --git a/defs.h b/defs.h
>>> index 0f70827..191b394 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -2010,6 +2010,16 @@ struct offset_table { /* stash of
>>> commonly-used offsets */
>>> long tnt_bit;
>>> long tnt_true;
>>> long tnt_false;
>>> + long task_struct_thread_context_x19;
>>> + long task_struct_thread_context_x20;
>>> + long task_struct_thread_context_x21;
>>> + long task_struct_thread_context_x22;
>>> + long task_struct_thread_context_x23;
>>> + long task_struct_thread_context_x24;
>>> + long task_struct_thread_context_x25;
>>> + long task_struct_thread_context_x26;
>>> + long task_struct_thread_context_x27;
>>> + long task_struct_thread_context_x28;
>>
>>
>> Can you add the above member variables at the end of this offset_table?
>>
>>>
>>> long task_struct_thread_context_fp;
>>> long task_struct_thread_context_sp;
>>> long task_struct_thread_context_pc;
>>> @@ -3593,6 +3603,16 @@ struct machine_specific {
>>> };
>>>
>>> struct arm64_stackframe {
>>> + unsigned long x19;
>>> + unsigned long x20;
>>> + unsigned long x21;
>>> + unsigned long x22;
>>> + unsigned long x23;
>>> + unsigned long x24;
>>> + unsigned long x25;
>>> + unsigned long x26;
>>> + unsigned long x27;
>>> + unsigned long x28;
>>> unsigned long fp;
>>> unsigned long sp;
>>> unsigned long pc;
>>> diff --git a/symbols.c b/symbols.c
>>> index f68cf0b..93ddf5a 100644
>>> --- a/symbols.c
>>> +++ b/symbols.c
>>> @@ -9829,12 +9829,32 @@ dump_offset_table(char *spec, ulong makestruct)
>>> OFFSET(task_struct_thread_reg29));
>>> fprintf(fp, " task_struct_thread_reg31: %ld\n",
>>> OFFSET(task_struct_thread_reg31));
>>> - fprintf(fp, " task_struct_thread_context_fp: %ld\n",
>>> - OFFSET(task_struct_thread_context_fp));
>>> - fprintf(fp, " task_struct_thread_context_sp: %ld\n",
>>> - OFFSET(task_struct_thread_context_sp));
>>> - fprintf(fp, " task_struct_thread_context_pc: %ld\n",
>>> - OFFSET(task_struct_thread_context_pc));
>>> + fprintf(fp, " task_struct_thread_context_x19: %ld\n",
>>> + OFFSET(task_struct_thread_context_x19));
>>> + fprintf(fp, " task_struct_thread_context_x20: %ld\n",
>>> + OFFSET(task_struct_thread_context_x20));
>>> + fprintf(fp, " task_struct_thread_context_x21: %ld\n",
>>> + OFFSET(task_struct_thread_context_x21));
>>> + fprintf(fp, " task_struct_thread_context_x22: %ld\n",
>>> + OFFSET(task_struct_thread_context_x22));
>>> + fprintf(fp, " task_struct_thread_context_x23: %ld\n",
>>> + OFFSET(task_struct_thread_context_x23));
>>> + fprintf(fp, " task_struct_thread_context_x24: %ld\n",
>>> + OFFSET(task_struct_thread_context_x24));
>>> + fprintf(fp, " task_struct_thread_context_x25: %ld\n",
>>> + OFFSET(task_struct_thread_context_x25));
>>> + fprintf(fp, " task_struct_thread_context_x26: %ld\n",
>>> + OFFSET(task_struct_thread_context_x26));
>>> + fprintf(fp, " task_struct_thread_context_x27: %ld\n",
>>> + OFFSET(task_struct_thread_context_x27));
>>> + fprintf(fp, " task_struct_thread_context_x28: %ld\n",
>>> + OFFSET(task_struct_thread_context_x28));
>>> + fprintf(fp, " task_struct_thread_context_fp: %ld\n",
>>> + OFFSET(task_struct_thread_context_fp));
>>> + fprintf(fp, " task_struct_thread_context_sp: %ld\n",
>>> + OFFSET(task_struct_thread_context_sp));
>>> + fprintf(fp, " task_struct_thread_context_pc: %ld\n",
>>> + OFFSET(task_struct_thread_context_pc));
>>
>>
>> Looks like some variable outputs are not aligned. Can you help double check with
the "help -o" command?
>>
>>
>> Thanks
>> Lianbo
>>
>>> fprintf(fp, " task_struct_processor: %ld\n",
>>> OFFSET(task_struct_processor));
>>> fprintf(fp, " task_struct_p_pptr: %ld\n",
>>> --
>>> 2.34.1
>>>
>>> Thanks
>>> Guanyou
--
Crash-utility mailing list -- devel(a)lists.crash-utility.osci.io
To unsubscribe send an email to devel-leave(a)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