/************************************************************* * File: bsps/imon.c * Purpose: IMON part of serialice interface * Author: Phil Bunce (pjb@carmel.com) * Revision History: * 980310 Created */ #include #include "iceif.h" #define TMODE_RUN 1 #define TMODE_STEP 2 #define TMODE_SRUN 3 #define TMODE_DC 4 #define TMODE_DS 5 char *tmodes[] = {"none","run","step","srun","dc","ds"}; int trace_count; int trace_mode; int ice_port; int mode_64bit; /************************************************************* * run_target(mode,flags,count) * run_target(0,flags,clientcmd) -- go * run_target(1,0) -- continue * run_target(2,flags,count) -- sstep */ int run_target(mode,flags,count) int mode,flags,count; { int i,type,wasbda; Uchar ch; Ulong cause,epc; char prnbuf[100]; #if 0 printf("run_target(%d,%d,%d)\n",mode,flags,count); #endif if (!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(0); } } 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_target32(epc)); printf("%s\n",prnbuf); } printDiag(1,"\nRUN MODE.."); send_instr(RUN_MODE); target_stopped = 0; wasbda = 0; current_r8 = current_r9 = mkRV(0); nobrkRemove = 0; if (flags&T_W) return(1); 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).lo; 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); } } return(1); } /************************************************************* */ 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 timeout) return(0); } read(ice_port,buf,1); printDiag(3,"%02x ",*buf); return(1); }