Esempio n. 1
0
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;
}
Esempio n. 2
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;
}