>From de6809819c06cf8c294a03ad79207b3ac9c2dca8 Mon Sep 17 00:00:00 2001 From: Hu Tao Date: Tue, 19 Oct 2010 13:10:12 +0800 Subject: [PATCH 3/3] Use cpu sp/ip to backtrace active task --- defs.h | 8 ++++++++ global_data.c | 3 +++ kvmdump.c | 7 ++++++- qemu-load.c | 8 ++++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/defs.h b/defs.h index a26150e..f84f9d4 100755 --- a/defs.h +++ b/defs.h @@ -4992,4 +4992,12 @@ extern int have_full_symbols(void); #define XEN_HYPERVISOR_ARCH #endif +struct cpu_info { + uint64_t esp; + uint64_t eip; +}; + +extern struct cpu_info cpu_infos[]; +extern unsigned int n_cpu; + #endif /* !GDB_COMMON */ diff --git a/global_data.c b/global_data.c index 98a5a79..e936ca5 100755 --- a/global_data.c +++ b/global_data.c @@ -134,3 +134,6 @@ struct extension_table *extension_table = NULL; struct offset_table offset_table = { 0 }; struct size_table size_table = { 0 }; struct array_table array_table = { 0 }; + +struct cpu_info cpu_infos[NR_CPUS] = {}; +unsigned int n_cpu = 0; diff --git a/kvmdump.c b/kvmdump.c index 1bf0d9e..4b60551 100644 --- a/kvmdump.c +++ b/kvmdump.c @@ -310,7 +310,12 @@ kvmdump_memory_dump(FILE *ofp) void get_kvmdump_regs(struct bt_info *bt, ulong *pc, ulong *sp) { - machdep->get_stack_frame(bt, pc, sp); + if (is_task_active(bt->task)) { + assert(bt->tc->processor < n_cpu); + *sp = cpu_infos[bt->tc->processor].esp; + *pc = cpu_infos[bt->tc->processor].eip; + } else + machdep->get_stack_frame(bt, pc, sp); } ulong diff --git a/qemu-load.c b/qemu-load.c index 95eaf97..a7beb0b 100644 --- a/qemu-load.c +++ b/qemu-load.c @@ -18,6 +18,7 @@ */ #define _GNU_SOURCE +#include "defs.h" #include "qemu-load.h" #include #include @@ -609,6 +610,11 @@ cpu_load (struct qemu_device *d, FILE *fp, int size) dx86->kvm.wall_clock_msr = get_be64 (fp); } + assert(d->instance_id == n_cpu); + cpu_infos[n_cpu].eip = dx86->eip; + cpu_infos[n_cpu].esp = dx86->regs[R_ESP]; + n_cpu++; + return QEMU_FEATURE_CPU; } @@ -924,8 +930,6 @@ fail: * crash utility adaptation. */ -#include "defs.h" - int is_qemu_vm_file(char *filename) { -- 1.7.3