📄 main.c
字号:
/************************************************************* * 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 + -