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@xxxxxxxxxx>
---
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;
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;
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));
fprintf(fp, " task_struct_processor: %ld\n",
OFFSET(task_struct_processor));
fprintf(fp, " task_struct_p_pptr: %ld\n",
--
2.34.1
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@xxxxxxxxxx>
---
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;
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;
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));
fprintf(fp, " task_struct_processor: %ld\n",
OFFSET(task_struct_processor));
fprintf(fp, " task_struct_p_pptr: %ld\n",
--
2.34.1
Thanks
Guanyou
From c235b020389f078a5b7fcc9a9180b6434a839e53 Mon Sep 17 00:00:00 2001 From: "Guanyou.Chen" <chenguanyou@xxxxxxxxxx> Date: Wed, 6 Nov 2024 10:07:16 +0800 Subject: [PATCH] arm64: gdb stack unwind append more registers 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@xxxxxxxxxx> --- 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; 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; 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)); fprintf(fp, " task_struct_processor: %ld\n", OFFSET(task_struct_processor)); fprintf(fp, " task_struct_p_pptr: %ld\n", -- 2.34.1
-- Crash-utility mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki