⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 u-boot1.3.0的原码,从配了网络驱动和FLASH的驱动,并该用ESC竟如
💻 C
字号:
/******************************************************************************                       Realmode X86 Emulator Library**               Copyright (C) 1991-2004 SciTech Software, Inc.*                    Copyright (C) David Mosberger-Tang*                      Copyright (C) 1999 Egbert Eich**  ========================================================================**  Permission to use, copy, modify, distribute, and sell this software and*  its documentation for any purpose is hereby granted without fee,*  provided that the above copyright notice appear in all copies and that*  both that copyright notice and this permission notice appear in*  supporting documentation, and that the name of the authors not be used*  in advertising or publicity pertaining to distribution of the software*  without specific, written prior permission.  The authors makes no*  representations about the suitability of this software for any purpose.*  It is provided "as is" without express or implied warranty.**  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR*  PERFORMANCE OF THIS SOFTWARE.**  ========================================================================** Language:     ANSI C* Environment:  Any* Developer:    Kendall Bennett** Description:  This file contains the code to handle debugging of the*               emulator.*****************************************************************************/#include <stdarg.h>#include <common.h>#if defined(CONFIG_BIOSEMU)#include "x86emu/x86emui.h"/*----------------------------- Implementation ----------------------------*/#ifdef DEBUGstatic void print_encoded_bytes(u16 s, u16 o);static void print_decoded_instruction(void);static int parse_line(char *s, int *ps, int *n);/* should look something like debug's output. */void X86EMU_trace_regs(void){	if (DEBUG_TRACE()) {		x86emu_dump_regs();	}	if (DEBUG_DECODE() && !DEBUG_DECODE_NOPRINT()) {		printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip);		print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip);		print_decoded_instruction();	}}void X86EMU_trace_xregs(void){	if (DEBUG_TRACE()) {		x86emu_dump_xregs();	}}void x86emu_just_disassemble(void){	/*	 * This routine called if the flag DEBUG_DISASSEMBLE is set kind	 * of a hack!	 */	printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip);	print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip);	print_decoded_instruction();}static void disassemble_forward(u16 seg, u16 off, int n){	X86EMU_sysEnv tregs;	int i;	u8 op1;	/*	 * hack, hack, hack.  What we do is use the exact machinery set up	 * for execution, except that now there is an additional state	 * flag associated with the "execution", and we are using a copy	 * of the register struct.  All the major opcodes, once fully	 * decoded, have the following two steps: TRACE_REGS(r,m);	 * SINGLE_STEP(r,m); which disappear if DEBUG is not defined to	 * the preprocessor.  The TRACE_REGS macro expands to:	 *	 * if (debug&DEBUG_DISASSEMBLE)	 *     {just_disassemble(); goto EndOfInstruction;}	 *     if (debug&DEBUG_TRACE) trace_regs(r,m);	 *	 * ......  and at the last line of the routine.	 *	 * EndOfInstruction: end_instr();	 *	 * Up to the point where TRACE_REG is expanded, NO modifications	 * are done to any register EXCEPT the IP register, for fetch and	 * decoding purposes.	 *	 * This was done for an entirely different reason, but makes a	 * nice way to get the system to help debug codes.	 */	tregs = M;	tregs.x86.R_IP = off;	tregs.x86.R_CS = seg;	/* reset the decoding buffers */	tregs.x86.enc_str_pos = 0;	tregs.x86.enc_pos = 0;	/* turn on the "disassemble only, no execute" flag */	tregs.x86.debug |= DEBUG_DISASSEMBLE_F;	/* DUMP NEXT n instructions to screen in straight_line fashion */	/*	 * This looks like the regular instruction fetch stream, except	 * that when this occurs, each fetched opcode, upon seeing the	 * DEBUG_DISASSEMBLE flag set, exits immediately after decoding	 * the instruction.  XXX --- CHECK THAT MEM IS NOT AFFECTED!!!	 * Note the use of a copy of the register structure...	 */	for (i = 0; i < n; i++) {		op1 = (*sys_rdb) (((u32) M.x86.R_CS << 4) + (M.x86.R_IP++));		(x86emu_optab[op1]) (op1);	}	/* end major hack mode. */}void x86emu_check_ip_access(void){	/* NULL as of now */}void x86emu_check_sp_access(void){}void x86emu_check_mem_access(u32 dummy){	/*  check bounds, etc */}void x86emu_check_data_access(uint dummy1, uint dummy2){	/*  check bounds, etc */}void x86emu_inc_decoded_inst_len(int x){	M.x86.enc_pos += x;}void x86emu_decode_printf(char *x){	sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", x);	M.x86.enc_str_pos += strlen(x);}void x86emu_decode_printf2(char *x, int y){	char temp[100];	sprintf(temp, x, y);	sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", temp);	M.x86.enc_str_pos += strlen(temp);}void x86emu_end_instr(void){	M.x86.enc_str_pos = 0;	M.x86.enc_pos = 0;}static void print_encoded_bytes(u16 s, u16 o){	int i;	char buf1[64];	for (i = 0; i < M.x86.enc_pos; i++) {		sprintf(buf1 + 2 * i, "%02x", fetch_data_byte_abs(s, o + i));	}	printk("%-20s", buf1);}static void print_decoded_instruction(void){	printk("%s", M.x86.decoded_buf);}void x86emu_print_int_vect(u16 iv){	u16 seg, off;	if (iv > 256)		return;	seg = fetch_data_word_abs(0, iv * 4);	off = fetch_data_word_abs(0, iv * 4 + 2);	printk("%04x:%04x ", seg, off);}void X86EMU_dump_memory(u16 seg, u16 off, u32 amt){	u32 start = off & 0xfffffff0;	u32 end = (off + 16) & 0xfffffff0;	u32 i;	u32 current;	current = start;	while (end <= off + amt) {		printk("%04x:%04x ", seg, start);		for (i = start; i < off; i++)			printk("   ");		for (; i < end; i++)			printk("%02x ", fetch_data_byte_abs(seg, i));		printk("\n");		start = end;		end = start + 16;	}}void x86emu_single_step(void){	char s[1024];	int ps[10];	int ntok;	int cmd;	int done;	int segment;	int offset;	static int breakpoint;	static int noDecode = 1;	char *p;	if (DEBUG_BREAK()) {		if (M.x86.saved_ip != breakpoint) {			return;		} else {			M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;			M.x86.debug |= DEBUG_TRACE_F;			M.x86.debug &= ~DEBUG_BREAK_F;			print_decoded_instruction();			X86EMU_trace_regs();		}	}	done = 0;	offset = M.x86.saved_ip;	while (!done) {		printk("-");		cmd = parse_line(s, ps, &ntok);		switch (cmd) {		case 'u':			disassemble_forward(M.x86.saved_cs, (u16) offset, 10);			break;		case 'd':			if (ntok == 2) {				segment = M.x86.saved_cs;				offset = ps[1];				X86EMU_dump_memory(segment, (u16) offset, 16);				offset += 16;			} else if (ntok == 3) {				segment = ps[1];				offset = ps[2];				X86EMU_dump_memory(segment, (u16) offset, 16);				offset += 16;			} else {				segment = M.x86.saved_cs;				X86EMU_dump_memory(segment, (u16) offset, 16);				offset += 16;			}			break;		case 'c':			M.x86.debug ^= DEBUG_TRACECALL_F;			break;		case 's':			M.x86.debug ^=			    DEBUG_SVC_F | DEBUG_SYS_F | DEBUG_SYSINT_F;			break;		case 'r':			X86EMU_trace_regs();			break;		case 'x':			X86EMU_trace_xregs();			break;		case 'g':			if (ntok == 2) {				breakpoint = ps[1];				if (noDecode) {					M.x86.debug |= DEBUG_DECODE_NOPRINT_F;				} else {					M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;				}				M.x86.debug &= ~DEBUG_TRACE_F;				M.x86.debug |= DEBUG_BREAK_F;				done = 1;			}			break;		case 'q':			M.x86.debug |= DEBUG_EXIT;			return;		case 'P':			noDecode = (noDecode) ? 0 : 1;			printk("Toggled decoding to %s\n",			       (noDecode) ? "FALSE" : "TRUE");			break;		case 't':		case 0:			done = 1;			break;		}	}}int X86EMU_trace_on(void){	return M.x86.debug |= DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F;}int X86EMU_trace_off(void){	return M.x86.debug &= ~(DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F);}static int parse_line(char *s, int *ps, int *n){	int cmd;	*n = 0;	while (*s == ' ' || *s == '\t')		s++;	ps[*n] = *s;	switch (*s) {	case '\n':		*n += 1;		return 0;	default:		cmd = *s;		*n += 1;	}	while (1) {		while (*s != ' ' && *s != '\t' && *s != '\n')			s++;		if (*s == '\n')			return cmd;		while (*s == ' ' || *s == '\t')			s++;		*n += 1;	}}#endif				/* DEBUG */void x86emu_dump_regs(void){	printk("\tAX=%04x  ", M.x86.R_AX);	printk("BX=%04x  ", M.x86.R_BX);	printk("CX=%04x  ", M.x86.R_CX);	printk("DX=%04x  ", M.x86.R_DX);	printk("SP=%04x  ", M.x86.R_SP);	printk("BP=%04x  ", M.x86.R_BP);	printk("SI=%04x  ", M.x86.R_SI);	printk("DI=%04x\n", M.x86.R_DI);	printk("\tDS=%04x  ", M.x86.R_DS);	printk("ES=%04x  ", M.x86.R_ES);	printk("SS=%04x  ", M.x86.R_SS);	printk("CS=%04x  ", M.x86.R_CS);	printk("IP=%04x   ", M.x86.R_IP);	if (ACCESS_FLAG(F_OF))		printk("OV ");	/* CHECKED... */	else		printk("NV ");	if (ACCESS_FLAG(F_DF))		printk("DN ");	else		printk("UP ");	if (ACCESS_FLAG(F_IF))		printk("EI ");	else		printk("DI ");	if (ACCESS_FLAG(F_SF))		printk("NG ");	else		printk("PL ");	if (ACCESS_FLAG(F_ZF))		printk("ZR ");	else		printk("NZ ");	if (ACCESS_FLAG(F_AF))		printk("AC ");	else		printk("NA ");	if (ACCESS_FLAG(F_PF))		printk("PE ");	else		printk("PO ");	if (ACCESS_FLAG(F_CF))		printk("CY ");	else		printk("NC ");	printk("\n");}void x86emu_dump_xregs(void){	printk("\tEAX=%08x  ", M.x86.R_EAX);	printk("EBX=%08x  ", M.x86.R_EBX);	printk("ECX=%08x  ", M.x86.R_ECX);	printk("EDX=%08x  \n", M.x86.R_EDX);	printk("\tESP=%08x  ", M.x86.R_ESP);	printk("EBP=%08x  ", M.x86.R_EBP);	printk("ESI=%08x  ", M.x86.R_ESI);	printk("EDI=%08x\n", M.x86.R_EDI);	printk("\tDS=%04x  ", M.x86.R_DS);	printk("ES=%04x  ", M.x86.R_ES);	printk("SS=%04x  ", M.x86.R_SS);	printk("CS=%04x  ", M.x86.R_CS);	printk("EIP=%08x\n\t", M.x86.R_EIP);	if (ACCESS_FLAG(F_OF))		printk("OV ");	/* CHECKED... */	else		printk("NV ");	if (ACCESS_FLAG(F_DF))		printk("DN ");	else		printk("UP ");	if (ACCESS_FLAG(F_IF))		printk("EI ");	else		printk("DI ");	if (ACCESS_FLAG(F_SF))		printk("NG ");	else		printk("PL ");	if (ACCESS_FLAG(F_ZF))		printk("ZR ");	else		printk("NZ ");	if (ACCESS_FLAG(F_AF))		printk("AC ");	else		printk("NA ");	if (ACCESS_FLAG(F_PF))		printk("PE ");	else		printk("PO ");	if (ACCESS_FLAG(F_CF))		printk("CY ");	else		printk("NC ");	printk("\n");}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -