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:
Jason Chen CJ 2018-05-24 10:47:54 +08:00 committed by lijinxia
parent 48de7efa26
commit 4176042982

View File

@ -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);
} }