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

📄 imon.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: bsps/imon.c * Purpose: IMON part of serialice interface * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	980310	Created */#include <fcntl.h>#include "iceif.h"#define TMODE_RUN  1#define TMODE_STEP 2#define TMODE_SRUN 3#define TMODE_DC   4#define TMODE_DS   5char *tmodes[] = {"none","run","step","srun","dc","ds"};int trace_count;int trace_mode;int ice_port;#include "defs.h"/**************************************************************  run_target(mode,flags,count)*	run_target(0,flags,clientcmd)	  -- go*	run_target(1,0)		          -- continue*	run_target(2,flags,count)         -- sstep*/void run_target(mode,flags,count) int mode,flags,count;{int i,type,wasbda;Uchar ch;Ulong cause,epc;char prnbuf[100];#if 0printf("run_target(%d,%d,%d)\n",mode,flags,count);#endifif (!ice_port) iceInit();switch (mode) {   case 0 :#if 0	cmdstr = (char *)count;	ac = argvize(client_av,cmdstr);	putGpr(4,ac);	putGpr(5,client_av);	if (!(flags&1)) putGpr(29,clienttos());#endif	/* fall thru */   case 1 :	trace_mode = TMODE_RUN;	if (force_getsap) { /* 980706 */	        deleteOcmRec((Ulong)savearea.sap);	        savearea.sap = 0;		}	break;   case 2 :	trace_mode = TMODE_STEP;	trace_count = count;	break;   case 3 : /* gdb continue */	trace_mode = TMODE_DC;	break;   case 4 : /* gdb sstep */	trace_mode = TMODE_DS;	trace_count = count;	break;   	}wasbda = 0;epc = getPc();for (;;) {	nobrkRemove = 1;	if (trace_mode == TMODE_STEP || trace_mode == TMODE_DS ||  	   (trace_mode == TMODE_RUN && (is_bpt(epc) || wasbda))) {		if (trace_mode == TMODE_RUN) trace_mode = TMODE_SRUN;		if (setTrcbp(epc,flags&T_O)) brkInstall(2);  /* TRACE */		else {			printf("Unable to set breakpoint(s) needed ");			printf("for this operation.\n");			printf("Please delete some breakpoints and ");			printf("try again.\n");			return;			}		}	else brkInstall(1); /* REG+TEMP */	send_buffer(); /* 970310 */	/* 960226 */	flush_target(ICACHE);	flush_target(DCACHE);	/* in verbose mode, disassemble as we go */	if (flags&T_V && trace_mode == TMODE_STEP) {		disasm(prnbuf,epc,read_target(XT_MEM,epc,4));		printf("%s\n",prnbuf);		}	printDiag(1,"\nRUN MODE..");	send_instr(RUN_MODE);	target_stopped = 0;	wasbda = 0;	current_r8 = current_r9 = 0;	nobrkRemove = 0;	if (flags&T_W) return;        for (;;) {                read(ice_port,&ch,1); /* can ^C out of here */                if (ch == ACK) break;                printf("%02x ",ch);                }	target_stopped = 1;	printDiag(1,"stopped\n");	nobrkRemove = 1;	/* if (force_getsap) resync(); */	epc = getPc();	cause = read_target(XT_CP0,C0_CAUSE,0);	nobrkRemove = 0;        type = brkRemove(epc);	if (is_xvwmode() && type != BPTYPE_TRACE && type != BPTYPE_ITMP) {		/* This exact string is expected by xvw - do not edit! */		printf("!503!undefined breakpoint at %08x\n",epc);		brkDelete(3); /* itemp */		stop(0);		}	else if (trace_mode == TMODE_DC) gdbstop(1);	else if (trace_mode == TMODE_DS) gdbstop(2);	else if (type == BPTYPE_PC && getBpid() != -1) {		brkDelete(3); /* itemp */		stop(0);		}	else if (trace_mode == TMODE_STEP) {		if (trace_count && --trace_count == 0) stop(0);		}	else if (trace_mode == TMODE_SRUN) trace_mode = TMODE_RUN;	else if (type == BPTYPE_ITMP) {		brkDelete(3); /* itemp */		stop(0);		}	else if ((cause&CAUSE_EXCMASK) == EXC_DBE) { /* bda bpt */		if (getBpid() != -1) stop(0);		wasbda = 1;		}	else if ((cause&CAUSE_EXCMASK) == EXC_IBE) { /* bpc bpt */		if (getBpid() != -1) stop(0);		}	else if (is_bpt(epc)) ;	else if ((cause&CAUSE_EXCMASK) != EXC_BP) {		printf("Exception! CAUSE=%08x (%s)\n",			cause,excodes[(cause&CAUSE_EXCMASK)>>2]);		brkDelete(3); /* itemp */		stop(0);		}	else {		printf("%08x: unknown breakpoint\n",epc);		brkDelete(3); /* itemp */		stop(0);		}	}}/**************************************************************/Optdesc sync_opts[] = {	{"","resync the comm link"},	{0}};sync_cmd(ac,av)int ac;char *av[];{target_stopped = 0;resync();if (force_getsap && !checkSAP()) {	savearea.sap = 0;	getSAP();	}printf("SAP=%08x\n",savearea.sap);}/**************************************************************/Optdesc tx_opts[] = {	{"bytes..","transmit bytes"},	{0}};tx_cmd(ac,av)int ac;char *av[];{int n,i;Uchar ch;i = 0;for (i++;i<ac;i++) {	atob(&n,av[i],16);	ch = n;	PUT_BYTES(&ch,1);	}}/**************************************************************/Optdesc rx_opts[] = {	{"","receive bytes"},	{0}};rx_cmd(ac,av)int ac;char *av[];{int n;Uchar ch;for (n=0;;n++) {	if (!GET_BYTE(&ch,1)) break;	printf("%02x ",ch);	}if (n) printf("\n");else printf("0 bytes waiting\n");}/**************************************************************/Optdesc tstate_opts[] = {	{"[running|stopped]","target state"},	{0}};tstate_cmd(ac,av)int ac;char *av[];{if (ac == 1) {	printf("target state=%s\n",(target_stopped)?"stopped":"running");	return;	}if (strequ(av[1],"stopped")) target_stopped = 1;else if (strequ(av[1],"running")) target_stopped = 0;else printf("%s: bad switch\n",av[1]);}/**************************************************************/do_verbose(name,value)char *name,*value;{if (strequ(value,"on")) diagCntrl("1");else if (strequ(value,"off")) diagCntrl("0");else if (isdigit(*value)) diagCntrl(value);else printf("%s: bad value\n",value);}CmdRec icecmds[] = {	{"sync",sync_opts,sync_cmd},	{"tx",tx_opts,tx_cmd},	{"rx",rx_opts,rx_cmd},	{"tstate",tstate_opts,tstate_cmd},	{0}};int do_verbose();EnvRec envlist[] = {	{"verbose","off","off on N",do_verbose},	{0}};addicecmds(){int i;for (i=0;icecmds[i].name;i++) addCmdRec(&icecmds[i]);for (i=0;envlist[i].name;i++) addEnvRec(&envlist[i]);}/**************************************************************  void iceInit()*/void iceInit(){struct termio tbuf;ice_port = open(ice_device,O_RDWR);if (ice_port == -1) {	printf("can't open %s\n",ice_device);	ice_port = 0; /* 971216 */	return;	}if (ioctl(ice_port,TCGETA,&tbuf) == -1) {	printf("ioctl TCGETA failure\n");	return;	}tbuf.c_lflag &= ~(ECHO|ICANON|ECHOE);tbuf.c_iflag &= ~(ICRNL|ISTRIP|IXON);tbuf.c_cflag &= ~CBAUD;tbuf.c_cflag |= ice_baud;tbuf.c_oflag &= ~(ONLCR);if (ioctl(ice_port,TCSETAW,&tbuf) == -1) {	printf("ioctl TCSETAF failure\n");	return;	}}void PUT_BYTES(Uchar *buf,int len) {int i;for (i=0;i<len;i++) printDiag(3,"%02x ",buf[i]);printDiag(3,"\n");if (!ice_port) iceInit();write(ice_port,buf,len);}int GET_BYTE(Uchar *buf, int timeout){int i,j,n;if (!ice_port) iceInit();for (i=j=0;;) {	ioctl(ice_port,FIONREAD,&n);	if (n) break;	if (slow_target) {		i++;		if ((i%100000)==0) {			printDiag(3,".");			j++;			}		}	else j++;	if (j > timeout) return(0);	}read(ice_port,buf,1);printDiag(3,"%02x ",*buf);return(1);}

⌨️ 快捷键说明

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