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

📄 main.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************* * File: pmon/main.c * Purpose: main module for PMON * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970217	Moved stuff from cmdtable.c into this module. Deleted *		cmdtable.c. *	970303	trace_mode defined here. *	970303	Removed dup def for Bpt[] *	970307	EPI tools generates a bunch of #174 warnings - ignore *	970325	Changed def of "Pmon" to FTEXT, was FDATA. *	970401	Lots of stuff adding hwbpts *	970507	Added non-aligned word reads *	970527	Changed is_writeable to use bytes *	970910	Moved hostInit(6) to just before hostInit(4) *	970911	Fixed bug w sstep self branches. Added parens. *	971124	Changed DCACHEI in flush_cmd to DCACHE, needed for the 4011. *	971124	Don't print NVRAM: if no nvmsg. *	980320	Changed read_target and write_target CP0 C0_SR to use R_STATUS *	980320	write_target(XT_PC) fixed. v is arg3. Not arg2. *	980616	Switched from devinit to hostInit(8). *	980713	Added MIPSEB ifdef to read_target() (mips16 -EL disassembly). *	980831	Print "assumed" if CLKFREQ has been set explictly. */#include <pmon.h>#include <stdio.h>#ifdef MIPSEBchar endian[] = "EB";#elsechar endian[] = "EL";#endifint vflag;int cp1ok;Ulong DBGREG[NREGS];	/* debugger's register value holder */Ulong topClientMem;int pmlst,clilst;	/* list of files opened by: PMON & client */extern int *curlst;	/* list of files opened by: current context */unsigned long initial_sr;unsigned long _filebase;char *client_av[MAX_AC];Ulong hostType;int iflush_needed,dflush_needed;int icache_size;int dcache_size;int cache_line_size;int trace_mode;int trace_count;int trace_verbose;int trace_invalid;int trace_over;int trace_bflag;int trace_cflag;int mode_64bit;Func *c_exception_ptr, *asm_exception_ptr;extern char *regs_sw[];BrkList brkList[MAX_BPT];char *bptype_names[] = {"inv","pc","data","itmp","trace","nonrt"};#ifndef PROMPT#define PROMPT "PMON> "#endif#ifndef DLECHO#define DLECHO "off"#endif#ifndef DLPROTO#define DLPROTO "none"#endif#ifndef HOSTPORT#define HOSTPORT "tty0"#endif#ifndef ETHERHWADDR#define ETHERHWADDR "aa:bb:cc:00:00:00"#endif#ifndef ETHERIPADDR#define ETHERIPADDR "71.0.0.211"#endifint do_diagsw();EnvRec envlist[] = {	{"dlecho",DLECHO,"off on lfeed"},	{"dlproto",DLPROTO,"none XonXoff EtxAck"},	{"hostport",HOSTPORT},	{"prompt",PROMPT},#ifdef ETHERNET	{"etheraddr",ETHERHWADDR},	{"ipaddr",ETHERIPADDR},#endif	{"heaptop"},	{"diag","0","N[:dev]",do_diagsw},	{"clkfreq"},	{0}};int sdump(),transp(),memtst(),call(),stty();int flush_cmd();#if 0 /* not working yet */int hdb_cmd();extern Optdesc hdb_opts[];#endifextern Optdesc load_opts[];extern Optdesc stty_opts[];extern Optdesc mt_opts[];extern Optdesc call_opts[];extern Optdesc tr_opts[];extern Optdesc sdump_opts[];extern Optdesc flush_opts[];CmdRec cmdlist[] = {	{"stty",stty_opts,stty},	{"tr",tr_opts,transp},	{"load",load_opts,load},	{"dump",sdump_opts,sdump},	{"mt",mt_opts,memtst},	{"call",call_opts,call},	{"flush",flush_opts,flush_cmd},#if 0 /* not working yet */	{"hdb",hdb_opts,hdb_cmd},#endif	{0}};Ulong specialRead();/**************************************************************  pmoninit(adr)*	Called from mips.s after caches have been flushed*	Executed from cacheable space*	o  Identifies CPU type (inits cp2 if necessary)*	o  Sets initial SR value*	o  Inits devices, command history mechanism, and environment vars*	o  Checks for NVRAM present*	o  Prints banner*	o  Inits breakpoint variables*	Returns control to mips.s	*/pmoninit(adr)char *adr;{int i,c,n,nlcnt,memsize;char ch,buf[80],nvmsg[40];initial_sr = mfc0(C0_SR);Status = initial_sr;hostInit(8); /* install basic devices */#ifdef AUTOCONSOLE	/*  * A (so far) unsuccessful attempt to scan all devices to  * assign the console device.  */for (;;) {	nlcnt = 0;	write(1,"B",1);	ioctl(0,FIONREAD,&n);	if (n) {		for (i=0;i<1000000;i++) {			ioctl(0,FIONREAD,&n);			for (;n>0;n--) {				read(0,&ch,1);				if (ch == '\n') nlcnt++;				}			if (nlcnt >= 2) break;			}		}	if (nlcnt >= 2) break;	rotateCfgTbl();	devinit();	}#endifmoninit();for (i=0;cmdlist[i].name;i++) addCmdRec(&cmdlist[i]);for (i=0;envlist[i].name;i++) addEnvRec(&envlist[i]);sprintf(buf,"set heaptop %08x",CLIENTPC);do_cmd(buf);sprintf(buf,"set prompt \"%s\"",PROMPT);do_cmd(buf);sprintf(buf,"sym Pmon %08x",FTEXT);do_cmd(buf);addGpRegs();hostInit(2);if (cp1ok) addFpRegs();hostInit(6); /* add other devices */#ifdef NVRAM hostInit(4); /* nvInfo */if (nvCheck(nvmsg)) do_shrc();else {	hostInit(7);	if (nvCheck(nvmsg)) do_shrc();	}#endifprintf("\n");printf("PMON version %s [%s",vers,endian);sprintf(full_vers_info,"pmon:%s mon:%s lib:%s tools:%s inc:%s cc:%s",				vers,monvers,libvers,toolvers,incvers,tools);#ifdef FPEMcp1ok = 1;printf(",FP");#endifprintf("], LSI LOGIC Corp. %s\n",date);printf("This is free software, and comes with ABSOLUTELY NO WARRANTY.\n"); printf("You are welcome to redistribute it without restriction.\n");*prnbuf = 0;if (cpuType) printfb("CPU type %d.",cpuType);else printfb("CPU type UNKNOWN.");/* 980831 Print "assumed" if CLKFREQ has been set explictly */#ifdef CLKFREQprintfb("CPU clock frequency %s MHz Assumed.",getMonEnv("clkfreq"));#elseprintfb("CPU clock frequency %s MHz.",getMonEnv("clkfreq"));#endif#ifdef MEMSIZE /* dynamic memory sizing may not work on some boards */topClientMem = CLIENTPC+MEMSIZE;#elsememsize = sizemem(CLIENTPC);if (onesCount(memsize) == 1) topClientMem = (CLIENTPC&~(memsize-1))+memsize;else topClientMem = CLIENTPC+memsize;#endifprintfb("Avail RAM %d KBytes.",(topClientMem-CLIENTPC)/1024);hostInit(3); /* extra memory */#ifdef NVRAM/* the global nvmsg was set by nvCheck earlier */if (*nvmsg) printfb("NVRAM: %s.",nvmsg);#endif#if defined(CROSSVIEW) && defined(GDB_SUPPORT)printfb("Debugger support: CROSSVIEW, DBX.");#else#if defined(CROSSVIEW)printfb("Debugger support: CROSSVIEW.");#else#if defined(GDB_SUPPORT)printfb("Debugger support: DBX.");#endif#endif#endifprintfb("Visit www.carmel.com for updates.");printfb("Type 'h' for on-line help."); printfb("\n");printf("\n\n");clrbpt(-1);#ifdef FPEM#ifndef NEWFP	c1dat = (struct c1state *)malloc(_fpstatesz());	_fpinit(c1dat);#endif#endifhostInit(5);}/**************************************************************  run_target(n,flags,count)*	n=0=go   flags,cmdstr*	n=1=cont flags*	n=2=step flags,count*/run_target(n,flags,count)int n,flags,count;{int i,ac;char *cmdstr;Ulong epc;if (verbose) fprintf(dfp,"run_target(%d,%x,%d)\n",n,flags,count);epc = getPc();switch (n) {	case 0 : /* go */#if 0 /* debug aid */		printf("go ac=%d ",ac);		for (i=0;i<ac;i++) printf("\"%s\" ",client_av[i]);		printf("\n");#endif#if 0		clrhndlrs();		closelst(2);		Status = initial_sr;		Fcr &= ~CSR_EMASK; /* clear any outstanding exceptions */#endif		cmdstr = (char *)count;		ac = argvize(client_av,cmdstr);		putGpr(4,ac);		putGpr(5,client_av);		if (!(flags&1)) putGpr(29,clienttos());		/* fall thru */	case 1 : /* continue */	case 3 :		if (brkTypes(BPTYPE_NONRT) != 0) { 			/* any nonrt bpt requires sstep */			trace_mode = TRACE_SS;			trace_count = trace_over = 0;			if (!setTrcbp(epc,0)) return;			brkInstall(2); /* trace only */			}		else if (is_bpt(epc)) {			trace_mode = TRACE_SG;			if (!setTrcbp(epc,0)) return;			brkInstall(2); /* trace only */			}		else {			trace_mode = TRACE_GB;			brkInstall(1); /* regular */			}		break;	case 2 : /* step */	case 4 :		trace_count = count;		if (flags&T_O) trace_over = 1;		else trace_over = 0;		if (flags&T_V) trace_verbose = 1;		else trace_verbose = 0;		trace_mode = TRACE_SS;		if (verbose) 			fprintf(dfp,"trace epc=%08x count=%d\n",epc,count);		if (!setTrcbp(epc,trace_over)) return;		brkInstall(2); /* trace only */		break;	}flush_cache(ICACHE);_go();}char *trace_modes[] = {	"TRACE_NO",	"TRACE_TB",	"TRACE_TG",	"TRACE_GB",	"TRACE_DC",	"TRACE_DS",	"TRACE_TN",	"TRACE_SG",	"TRACE_SS"};/**************************************************************  exception()*	An exception has been generated within the client.*	Control is passed here from _exception in mips.s*/exception(){Ulong epc,cause,inst,exccode;int flag,type,wasbda;if (verbose) fprintf(dfp,"stopped trace_mode=%d(%s)\n",		trace_mode,trace_modes[trace_mode]);epc = getPc();cause = read_target(XT_CP0,C0_CAUSE,0);type = brkRemove(epc);inst = read_target(XT_MEM,epc,4);exccode = cause&CAUSE_EXCMASK;if (verbose) fprintf(dfp,"Exception Epc=%08x Cause=%08x(%s) type=%d(%s)\n",	epc,cause,getexcname(cause&CAUSE_EXCMASK),type,bptype_names[type]);if (exccode == EXC_DBE) wasbda = 1; /* bda bpt */else wasbda = 0;if ((gdbmode || xvwmode) && (type == BPTYPE_PC || wasbda)) xstop(epc,wasbda);if (type == BPTYPE_ITMP || getBpid() != -1 ||   (trace_mode == TRACE_SG && is_bpt(epc))) {	if (verbose) fprintf(dfp,"stopping... line %d\n",__LINE__);	brkDelete(3); /* itmp */	stop(0);	}if (trace_mode == TRACE_SS) {	if (gdbmode) gdbstop(2);	if (trace_count && --trace_count == 0) stop(0);	flag=1;	if (trace_bflag || trace_cflag) {		if (is_branch(epc,inst) && trace_bflag) flag=1;		else if (is_jal(epc,inst) && trace_cflag) flag=1;		else flag=0;		}	if (flag) {		addpchist(epc);		if (trace_verbose) {			disasm(prnbuf,epc,inst);			printf("%s\n",prnbuf);			}		else dotik(256,1);		}	else dotik(256,1);	if (!setTrcbp(epc,trace_over)) {		printf("ERROR: unable to set trace bpt\n");		stop(0);		}	brkInstall(2); /* trace */	flush_cache(ICACHE);	_go();	}/* make sure it really is ok to go again */if (trace_mode != TRACE_SG && (cause&CAUSE_EXCMASK) == EXC_BP && !is_bpt(epc)) 	xstop(epc,wasbda);/* now we are ready to go again */if (is_bpt(epc) || wasbda) {	trace_mode = TRACE_SG;	if (!setTrcbp(epc,0)) {		printf("ERROR: unable to set trace bpt\n");		xstop(epc,wasbda);		}	brkInstall(2); /* trace */	}else if (exccode != EXC_BP) {	printf("Exception! EPC=%08x CAUSE=%08x(%s)\n",		epc,cause,excodes[(cause&CAUSE_EXCMASK)>>2]);	xstop(epc,wasbda);	}else if (trace_mode == TRACE_SG) {	trace_mode = TRACE_GB;	brkInstall(1); /* std */	}else if (!is_bpt(epc)) xstop(epc,wasbda);else {	trace_mode = TRACE_GB;	brkInstall(1); /* std */	}flush_cache(ICACHE);_go();}/**************************************************************/xstop(epc,wasbda)Ulong epc;int wasbda;{brkDelete(3); /* itmp */if (gdbmode) gdbstop((wasbda)?3:1);if (xvwmode) {/* This exact string is expected by xvw - do not edit! */	printf("!503!undefined breakpoint at %08x\n",epc);	}stop(0);}#if 0/**************************************************************  exception()*	An exception has been generated within the client.*	Control is passed here from _exception in mips.s*/exception(){RegVal epc,cause,inst;int flag,type;if (verbose) fprintf(dfp,"stopped\n");epc = getPc();cause = read_target(XT_CP0,C0_CAUSE);type = brkRemove(epc);inst = read_target(XT_MEM,epc,4);if (verbose) printf("\nException Epc=%08x Cause=%08x(%s) type=%d(%s)\n",	epc,cause,getexcname(cause&CAUSE_EXCMASK),type,bptype_names[type]);switch (type) {	case BPTYPE_TRACE :		if (gdbmode) gdbstop(2);		printf("trace_mode=%d\n",trace_mode);		if (trace_mode == TRACE_TG) trace_mode = TRACE_GB;		else if (trace_mode == TRACE_TB) stop(0);		else if (trace_mode == TRACE_TN) {			if (trace_count && --trace_count == 0) stop(0);			flag=1;			if (trace_bflag || trace_cflag) {				if (is_branch(epc,inst) && trace_bflag) flag=1;				else if (is_jal(epc,inst) && trace_cflag) flag=1;				else flag=0;				}			if (flag) {				addpchist(epc);				if (trace_verbose) {					disasm(prnbuf,epc,inst);					printf("%s\n",prnbuf);					}				else dotik(256,1);				}			else dotik(256,1);			}		if (!setTrcbp(epc,trace_over)) stop(0);		brkInstall(2); /* trace */		_go();		break;	case BPTYPE_ITMP :		brkDelete(3); /* itemp */		stop(0);		break;	case BPTYPE_DATA : /* should never happen */	case BPTYPE_PC :		brkDelete(3); /* itemp */		if (gdbmode) gdbstop(1);		if (xvwmode) {		/* This exact string is expected by xvw - do not edit! */			printf("!503!undefined breakpoint at %08x\n",epc);			stop(0);			}		if (getBpid() == -1) break;		stop(0);		break;	default :#ifdef CROSSVIEW		/* break 0x97: a0 1=getchar 2=putchar 3=reboot */		if ((cause&CAUSE_EXCMASK) == EXC_BP 			&& (inst&0x03ffffc0)==0x970000) {			switch (Gpr[4]) {				case 1 : putGpr(2,getchar()); 					putPc(epc+4); break;				case 2 : putchar(getGpr(5)); 					putPc(epc+4); break;				case 3 : stop(0);				}			break;			}#endif		if ((cause&CAUSE_EXCMASK) == EXC_DBE) {			if (getBpid() == -1) {				if (!setTrcbp(epc,trace_over)) stop(0);				brkInstall(2); /* trace */				trace_mode = TRACE_TG;				_go();				}			}		else printf("Exception! EPC=%08x CAUSE=%08x(%s)\n",			epc,cause,excodes[(cause&CAUSE_EXCMASK)>>2]);		brkDelete(3); /* itemp */		stop(0);

⌨️ 快捷键说明

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