int mon_backtrace(int argc, char **argv, struct Trapframe *tf) { // Your code here. uint32_t *addr = 0; char format[FORMAT_LENGTH] = {0}; char formatName[FORMAT_LENGTH] = { 0 }; struct Eipdebuginfo info; strcpy(format, " ebp %08x eip %08x args %08x %08x %08x %08x %08x"); strcpy(formatName, " %s:%d: %.*s+%d\n"); addr = (uint32_t *)read_ebp(); cprintf("Stack backtrace\n"); for (; NULL != addr;) { cprintf(format, EBP(addr), EIP(addr), ARG(addr, 0), ARG(addr, 1), ARG(addr, 2), ARG(addr, 3), ARG(addr, 4)); debuginfo_eip(EIP(addr), &info); cprintf(formatName, info.eip_file, info.eip_line, info.eip_fn_namelen, info.eip_fn_name, EIP(addr)-info.eip_fn_addr); addr = (uint32_t*)*addr; } return 0; }
// TODO: taskswitch handling static void save_state_to_tss32(CPUState *cpu, struct x86_tss_segment32 *tss) { X86CPU *x86_cpu = X86_CPU(cpu); CPUX86State *env = &x86_cpu->env; /* CR3 and ldt selector are not saved intentionally */ tss->eip = EIP(env); tss->eflags = EFLAGS(env); tss->eax = EAX(env); tss->ecx = ECX(env); tss->edx = EDX(env); tss->ebx = EBX(env); tss->esp = ESP(env); tss->ebp = EBP(env); tss->esi = ESI(env); tss->edi = EDI(env); tss->es = vmx_read_segment_selector(cpu, R_ES).sel; tss->cs = vmx_read_segment_selector(cpu, R_CS).sel; tss->ss = vmx_read_segment_selector(cpu, R_SS).sel; tss->ds = vmx_read_segment_selector(cpu, R_DS).sel; tss->fs = vmx_read_segment_selector(cpu, R_FS).sel; tss->gs = vmx_read_segment_selector(cpu, R_GS).sel; }