From: yuandong <yuan.dong1(a)zte.com.cn>
The common virtual address search code relies on the architecture-specific
get_kvaddr_ranges callback to identify kernel virtual address regions.
RISC-V does not currently provide this callback, so commands using the
kernel virtual address range table cannot classify these regions correctly.
Implement riscv64_get_kvaddr_ranges() to report the linear mapping, kernel
mapping, vmalloc, module, and vmemmap ranges. Sort the ranges by their
starting virtual addresses before returning them to the common code.
This enables kernel virtual address range based operations to work
correctly on RISC-V.
Signed-off-by: yuandong <yuan.dong1(a)zte.com.cn>
---
riscv64.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/riscv64.c b/riscv64.c
index f0783d5..77a7bb6 100644
--- a/riscv64.c
+++ b/riscv64.c
@@ -38,6 +38,7 @@ static void riscv64_overflow_stack_init(void);
static void riscv64_stackframe_init(void);
static void riscv64_back_trace_cmd(struct bt_info *bt);
static int riscv64_eframe_search(struct bt_info *bt);
+static int riscv64_get_kvaddr_ranges(struct vaddr_range *);
static int riscv64_get_dumpfile_stack_frame(struct bt_info *bt,
ulong *nip, ulong *ksp);
static void riscv64_get_stack_frame(struct bt_info *bt, ulong *pcp,
@@ -262,6 +263,7 @@ riscv64_dump_machdep_table(ulong arg)
fprintf(fp, " bits: %d\n", machdep->bits);
fprintf(fp, " back_trace: riscv64_back_trace_cmd()\n");
fprintf(fp, " eframe_search: riscv64_eframe_search()\n");
+ fprintf(fp, " get_kvaddr_ranges: riscv64_get_kvaddr_ranges\n");
fprintf(fp, " processor_speed: riscv64_processor_speed()\n");
fprintf(fp, " uvtop: riscv64_uvtop()\n");
fprintf(fp, " kvtop: riscv64_kvtop()\n");
@@ -1734,6 +1736,7 @@ riscv64_init(int when)
machdep->get_stack_frame = riscv64_get_stack_frame;
machdep->back_trace = riscv64_back_trace_cmd;
machdep->eframe_search = riscv64_eframe_search;
+ machdep->get_kvaddr_ranges = riscv64_get_kvaddr_ranges;
machdep->vmalloc_start = riscv64_vmalloc_start;
machdep->processor_speed = riscv64_processor_speed;
@@ -2010,6 +2013,52 @@ riscv64_eframe_search(struct bt_info *bt)
return count;
}
+static int
+compare_kvaddr(const void *v1, const void *v2)
+{
+ struct vaddr_range *r1, *r2;
+
+ r1 = (struct vaddr_range *)v1;
+ r2 = (struct vaddr_range *)v2;
+
+ return (r1->start < r2->start ? -1 :
+ r1->start == r2->start ? 0 : 1);
+}
+
+static int
+riscv64_get_kvaddr_ranges(struct vaddr_range *vrp)
+{
+ struct machine_specific *ms;
+ int cnt;
+
+ ms = machdep->machspec;
+ cnt = 0;
+
+ vrp[cnt].type = KVADDR_UNITY_MAP;
+ vrp[cnt].start = ms->page_offset;
+ vrp[cnt++].end = vt->high_memory;
+
+ vrp[cnt].type = KVADDR_START_MAP;
+ vrp[cnt].start = ms->kernel_link_addr;
+ vrp[cnt++].end = kt->end;
+
+ vrp[cnt].type = KVADDR_VMALLOC;
+ vrp[cnt].start = ms->vmalloc_start_addr;
+ vrp[cnt++].end = ms->vmalloc_end;
+
+ vrp[cnt].type = KVADDR_MODULES;
+ vrp[cnt].start = ms->modules_vaddr;
+ vrp[cnt++].end = ms->modules_end;
+
+ vrp[cnt].type = KVADDR_VMEMMAP;
+ vrp[cnt].start = ms->vmemmap_vaddr;
+ vrp[cnt++].end = ms->vmemmap_end;
+
+ qsort(vrp, cnt, sizeof(struct vaddr_range), compare_kvaddr);
+
+ return cnt;
+}
+
#else /* !RISCV64 */
void
--
2.27.0
Show replies by date
Hi all,
I noticed that the issue this patch addresses has already been fixed and merged by in
commit <18d6e9f4852f19fddcd17fe14b7dfadae92fbc70>
Therefore, this patch is now obsolete. Please ignore it.
Thanks,
Yechao