mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-24 06:29:19 +00:00
dump: refine dump.c with copy_from_gva
using copy_from_gva to do dump_guest_stack & show_guest_call_trace Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
48de7efa26
commit
4176042982
@ -96,80 +96,33 @@ static void dump_guest_reg(struct vcpu *vcpu)
|
|||||||
|
|
||||||
static void dump_guest_stack(struct vcpu *vcpu)
|
static void dump_guest_stack(struct vcpu *vcpu)
|
||||||
{
|
{
|
||||||
uint64_t gpa;
|
|
||||||
uint64_t hpa;
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint64_t *tmp;
|
uint64_t tmp[DUMP_STACK_SIZE];
|
||||||
uint64_t page1_size;
|
|
||||||
uint64_t page2_size;
|
|
||||||
struct run_context *cur_context =
|
struct run_context *cur_context =
|
||||||
&vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context];
|
&vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context];
|
||||||
uint32_t err_code;
|
uint32_t err_code = 0;
|
||||||
int err;
|
|
||||||
|
|
||||||
err_code = 0;
|
if (copy_from_gva(vcpu, tmp, cur_context->rsp, DUMP_STACK_SIZE,
|
||||||
err = gva2gpa(vcpu, cur_context->rsp, &gpa, &err_code);
|
&err_code) < 0) {
|
||||||
if (err) {
|
printf("\r\nUnabled to Copy Guest Stack:\r\n");
|
||||||
printf("gva2gpa failed for guest rsp 0x%016llx\r\n",
|
|
||||||
cur_context->rsp);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hpa = gpa2hpa(vcpu->vm, gpa);
|
|
||||||
printf("\r\nGuest Stack:\r\n");
|
printf("\r\nGuest Stack:\r\n");
|
||||||
printf("Dump stack for vcpu %d, from gva 0x%016llx ->"
|
printf("Dump stack for vcpu %d, from gva 0x%016llx\r\n",
|
||||||
"gpa 0x%016llx -> hpa 0x%016llx \r\n",
|
vcpu->vcpu_id, cur_context->rsp);
|
||||||
vcpu->vcpu_id, cur_context->rsp, gpa, hpa);
|
|
||||||
/* Need check if cross 2 pages*/
|
|
||||||
if (((cur_context->rsp % CPU_PAGE_SIZE) + DUMP_STACK_SIZE)
|
|
||||||
<= CPU_PAGE_SIZE) {
|
|
||||||
tmp = HPA2HVA(hpa);
|
|
||||||
for (i = 0; i < DUMP_STACK_SIZE/32; i++) {
|
for (i = 0; i < DUMP_STACK_SIZE/32; i++) {
|
||||||
printf("addr(0x%llx): 0x%016llx 0x%016llx "
|
printf("guest_rsp(0x%llx): 0x%016llx 0x%016llx "
|
||||||
"0x%016llx 0x%016llx\r\n", (hpa+i*32),
|
"0x%016llx 0x%016llx\r\n",
|
||||||
|
(cur_context->rsp+i*32),
|
||||||
tmp[i*4], tmp[i*4+1],
|
tmp[i*4], tmp[i*4+1],
|
||||||
tmp[i*4+2], tmp[i*4+3]);
|
tmp[i*4+2], tmp[i*4+3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
tmp = HPA2HVA(hpa);
|
|
||||||
page1_size = CPU_PAGE_SIZE
|
|
||||||
- (cur_context->rsp % CPU_PAGE_SIZE);
|
|
||||||
for (i = 0; i < page1_size/32; i++) {
|
|
||||||
printf("addr(0x%llx): 0x%016llx 0x%016llx 0x%016llx "
|
|
||||||
"0x%016llx\r\n", (hpa+i*32), tmp[i*4],
|
|
||||||
tmp[i*4+1], tmp[i*4+2], tmp[i*4+3]);
|
|
||||||
}
|
|
||||||
err_code = 0;
|
|
||||||
err = gva2gpa(vcpu, cur_context->rsp + page1_size, &gpa,
|
|
||||||
&err_code);
|
|
||||||
if (err) {
|
|
||||||
printf("gva2gpa failed for guest rsp 0x%016llx\r\n",
|
|
||||||
cur_context->rsp + page1_size);
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
hpa = gpa2hpa(vcpu->vm, gpa);
|
|
||||||
printf("Dump stack for vcpu %d, from gva 0x%016llx ->"
|
|
||||||
"gpa 0x%016llx -> hpa 0x%016llx \r\n",
|
|
||||||
vcpu->vcpu_id, cur_context->rsp + page1_size,
|
|
||||||
gpa, hpa);
|
|
||||||
tmp = HPA2HVA(hpa);
|
|
||||||
page2_size = DUMP_STACK_SIZE - page1_size;
|
|
||||||
for (i = 0; i < page2_size/32; i++) {
|
|
||||||
printf("addr(0x%llx): 0x%016llx 0x%016llx 0x%016llx "
|
|
||||||
"0x%016llx\r\n", (hpa+i*32), tmp[i*4],
|
|
||||||
tmp[i*4+1], tmp[i*4+2], tmp[i*4+3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_guest_call_trace(struct vcpu *vcpu)
|
static void show_guest_call_trace(struct vcpu *vcpu)
|
||||||
{
|
{
|
||||||
uint64_t gpa;
|
|
||||||
uint64_t hpa;
|
|
||||||
uint64_t *hva;
|
|
||||||
uint64_t bp;
|
uint64_t bp;
|
||||||
uint64_t count = 0;
|
uint64_t count = 0;
|
||||||
struct run_context *cur_context =
|
struct run_context *cur_context =
|
||||||
@ -194,18 +147,19 @@ static void show_guest_call_trace(struct vcpu *vcpu)
|
|||||||
* if the address is invalid, it will cause hv page fault
|
* if the address is invalid, it will cause hv page fault
|
||||||
* then halt system */
|
* then halt system */
|
||||||
while ((count++ < CALL_TRACE_HIERARCHY_MAX) && (bp != 0)) {
|
while ((count++ < CALL_TRACE_HIERARCHY_MAX) && (bp != 0)) {
|
||||||
err = gva2gpa(vcpu, bp, &gpa, &err_code);
|
uint64_t parent_bp = 0;
|
||||||
if (err) {
|
|
||||||
printf("gva2gpa failed for guest bp 0x%016llx\r\n", bp);
|
err_code = 0;
|
||||||
break;
|
err = copy_from_gva(vcpu, &parent_bp, bp, sizeof(parent_bp),
|
||||||
|
&err_code);
|
||||||
|
if (err < 0) {
|
||||||
|
printf("\r\nUnabled to get Guest parent BP\r\n");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
hpa = gpa2hpa(vcpu->vm, gpa);
|
|
||||||
hva = HPA2HVA(hpa);
|
printf("BP_GVA(0x%016llx) RIP=0x%016llx\r\n", bp, parent_bp);
|
||||||
printf("BP_GVA(0x%016llx)->BP_GPA(0x%016llx)"
|
|
||||||
"->BP_HPA(0x%016llx) RIP=0x%016llx\r\n", bp, gpa, hpa,
|
|
||||||
*(uint64_t *)((uint64_t)hva + sizeof(uint64_t)));
|
|
||||||
/* Get previous rbp*/
|
/* Get previous rbp*/
|
||||||
bp = *hva;
|
bp = parent_bp;
|
||||||
}
|
}
|
||||||
printf("\r\n");
|
printf("\r\n");
|
||||||
}
|
}
|
||||||
@ -329,5 +283,4 @@ void dump_exception(struct intr_excp_ctx *ctx, uint32_t cpu_id)
|
|||||||
show_host_call_trace(ctx->rsp, ctx->rbp, cpu_id);
|
show_host_call_trace(ctx->rsp, ctx->rbp, cpu_id);
|
||||||
/* Dump guest context */
|
/* Dump guest context */
|
||||||
dump_guest_context(cpu_id);
|
dump_guest_context(cpu_id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user