/*-------------------------------------------------------------------------
cmd.c - source file for debugger command execution
-
- Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
+ Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
V_ARG(function **,funcp);
if (*funcp)
- return 0;
+ return 0;
if (strcmp(func->sym->name,name) == 0) {
- *funcp = func;
- return 1;
+ *funcp = func;
+ return 1;
}
return 0;
next_line = line;
for ( ; next_line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ;
- next_line++ ) {
- if (srcMode == SRC_CMODE) {
- if (mod->cLines[next_line]->addr != INT_MAX) {
- setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType,
- userBpCB, mod->c_name, next_line);
- return;
-// break;
- }
- }
- else {
- if (mod->asmLines[next_line]->addr != INT_MAX) {
- setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType,
- userBpCB, mod->asm_name, next_line);
- return;
-// break;
- }
- }
- }
-
- fprintf(stderr,"No line %d or after in file \"%s\"..\n",
- line,mod->c_name);
+ next_line++ ) {
+ if (srcMode == SRC_CMODE) {
+ if (mod->cLines[next_line]->addr != INT_MAX) {
+ setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType,
+ userBpCB, mod->c_name, next_line);
+ return;
+// break;
+ }
+ }
+ else {
+ if (mod->asmLines[next_line]->addr != INT_MAX) {
+ setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType,
+ userBpCB, mod->asm_name, next_line);
+ return;
+// break;
+ }
+ }
+ }
+
+ fprintf(stderr,"No line %d or after in file \"%s\"..\n",
+ line,mod->c_name);
return;
}
/* look for the first executable line after the line
specified & get the break point there */
if (srcMode == SRC_CMODE && line > mod->ncLines) {
- fprintf(stderr,"No line %d in file \"%s\".\n",
- line,mod->c_name);
- return ;
+ fprintf(stderr,"No line %d in file \"%s\".\n",
+ line,mod->c_name);
+ return ;
}
if (srcMode == SRC_AMODE && line > mod->ncLines) {
- fprintf(stderr,"No line %d in file \"%s\".\n",
- line,mod->c_name);
- return ;
+ fprintf(stderr,"No line %d in file \"%s\".\n",
+ line,mod->c_name);
+ return ;
}
for ( ; line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ;
- line++ ) {
- if (srcMode == SRC_CMODE)
- if (mod->cLines[line]->addr) {
- clearUSERbp (mod->cLines[line]->addr);
- break;
- }
- else
- if (mod->asmLines[line]->addr) {
- clearUSERbp (mod->asmLines[line]->addr);
- break;
- }
+ line++ ) {
+ if (srcMode == SRC_CMODE)
+ if (mod->cLines[line]->addr) {
+ clearUSERbp (mod->cLines[line]->addr);
+ break;
+ }
+ else
+ if (mod->asmLines[line]->addr) {
+ clearUSERbp (mod->asmLines[line]->addr);
+ break;
+ }
}
return;
return 0;
if (strcmp(func->sym->name,fname) == 0 &&
- strcmp(func->mod->c_name,mname) == 0) {
- *funcp = func;
- return 1;
+ strcmp(func->mod->c_name,mname) == 0) {
+ *funcp = func;
+ return 1;
}
return 0;
V_ARG(function **,funcp);
if (*funcp)
- return 0;
+ return 0;
/* in the address range */
if (func->sym->addr <= addr &&
- func->sym->eaddr >= addr) {
+ func->sym->eaddr >= addr) {
- *funcp = func;
- return 1;
+ *funcp = func;
+ return 1;
}
return 0;
if (func->sym && func->sym->addr ) {
- /* set the entry break point */
- setBreakPoint (func->sym->addr , CODE , STEP ,
- stepBpCB ,func->mod->c_name , func->entryline);
+ /* set the entry break point */
+ setBreakPoint (func->sym->addr , CODE , STEP ,
+ stepBpCB ,func->mod->c_name , func->entryline);
- return 1;
+ return 1;
}
return 0;
V_ARG(char *,mname);
setBreakPoint (ep->addr, CODE, bptype,
- stepBpCB, mname, ep->line);
+ stepBpCB, mname, ep->line);
return 1;
}
V_ARG(char *,mname);
setBreakPoint (ep->addr, CODE, bptype,
- nextBpCB, mname, ep->line);
+ nextBpCB, mname, ep->line);
return 1;
}
/* address must be an exact match */
if (ep->addr == addr) {
- *line = ep->line;
- if (block)
- *block = ep->block ;
- if (level)
- *level = ep->level ;
- return 1;
+ *line = ep->line;
+ if (block)
+ *block = ep->block ;
+ if (level)
+ *level = ep->level ;
+ return 1;
}
return 0;
/* the line in which the address is */
if (ep->addr <= addr) {
- *line = ep->line;
- if (block)
- *block = ep->block ;
- if (level)
- *level = ep->level ;
- return 1;
+ *line = ep->line;
+ if (block)
+ *block = ep->block ;
+ if (level)
+ *level = ep->level ;
+ return 1;
}
return 0;
/* find the asm line number */
line = 0;
if (applyToSet(func->afpoints,lineAtAddr,addr,
- &line,NULL,NULL))
+ &line,NULL,NULL))
currCtxt->asmline = line;
else
currCtxt->asmline = -1;
of the program */
if (!rv)
{
- if ( gaddr == 0 )
+ if ( gaddr == 0 )
gaddr = -1;
- if ( gaddr == -1 || doingSteps == 1 )
+ if ( gaddr == -1 || doingSteps == 1 )
goto top ;
}
*/
if (!cctxt) {
- fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
- return 0;
+ fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
+ return 0;
}
/* white space skip */
while (*s && isspace(*s)) s++;
the current execution location from the currentContext */
if (! *s ) {
- /* if current context is known */
- if (cctxt->func) {
+ /* if current context is known */
+ if (cctxt->func) {
Dprintf(D_break, ("commonSetUserBp: a) cctxtaddr:%x \n",cctxt->addr));
- if (srcMode == SRC_CMODE)
- /* set the break point */
- setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
- cctxt->func->mod->c_name, cctxt->cline);
- else
- setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
- cctxt->func->mod->asm_name, cctxt->asmline);
+ if (srcMode == SRC_CMODE)
+ /* set the break point */
+ setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
+ cctxt->func->mod->c_name, cctxt->cline);
+ else
+ setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
+ cctxt->func->mod->asm_name, cctxt->asmline);
- }
- else
- fprintf(stderr,"No default breakpoint address now.\n");
+ }
+ else
+ fprintf(stderr,"No default breakpoint address now.\n");
- goto ret ;
+ goto ret ;
}
/* case g) *addr */
if ( *s == '*' && isdigit(*(s+1)))
}
goto ret ;
}
- else
+ else
{
int line = func->exitline;
if ( !applyToSet(func->cfpoints,lineAtAddr,braddr,
setBreakPoint ( braddr , CODE , bpType , userBpCB ,
func->mod->c_name,line);
}
- goto ret ;
+ goto ret ;
}
/* case b) lineno */
/* check if line number */
if ( !strchr(s,':') && isdigit(*s)) {
- /* get the lineno */
- int line = atoi(s) -1;
+ /* get the lineno */
+ int line = atoi(s) -1;
Dprintf(D_break, ("commonSetUserBp: b) line:%d \n",line));
if ( line < 0 )
{
- fprintf(stdout,"linenumber <= 0\n");
+ fprintf(stdout,"linenumber <= 0\n");
goto ret;
}
- /* if current context not present then we must get the module
- which has main & set the break point @ line number provided
- of that module : if current context known then set the bp
- at the line number given for the current module
- */
- if (cctxt->func) {
- if (!cctxt->func->mod) {
- if (!applyToSet(functions,funcWithName,"main"))
- fprintf(stderr,"Function \"main\" not defined.\n");
- else
- setBPatModLine(func->mod,line, bpType);
- } else
- setBPatModLine(cctxt->func->mod,line, bpType);
- } else {
- if (list_mod) {
- setBPatModLine(list_mod,line, bpType);
- } else {
- fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__);
- }
- }
-
- goto ret;
+ /* if current context not present then we must get the module
+ which has main & set the break point @ line number provided
+ of that module : if current context known then set the bp
+ at the line number given for the current module
+ */
+ if (cctxt->func) {
+ if (!cctxt->func->mod) {
+ if (!applyToSet(functions,funcWithName,"main"))
+ fprintf(stderr,"Function \"main\" not defined.\n");
+ else
+ setBPatModLine(func->mod,line, bpType);
+ } else
+ setBPatModLine(cctxt->func->mod,line, bpType);
+ } else {
+ if (list_mod) {
+ setBPatModLine(list_mod,line, bpType);
+ } else {
+ fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__);
+ }
+ }
+
+ goto ret;
}
if ((bp = strchr(s,':'))) {
- module *mod = NULL;
- *bp = '\0';
-
- if (srcMode == SRC_CMODE) {
- if (!applyToSet(modules,moduleWithCName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
- } else {
- if (!applyToSet(modules,moduleWithAsmName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
- }
-
- /* case c) filename:lineno */
- if (isdigit(*(bp +1))) {
+ module *mod = NULL;
+ *bp = '\0';
+
+ if (srcMode == SRC_CMODE) {
+ if (!applyToSet(modules,moduleWithCName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
+ } else {
+ if (!applyToSet(modules,moduleWithAsmName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
+ }
+
+ /* case c) filename:lineno */
+ if (isdigit(*(bp +1))) {
Dprintf(D_break, ("commonSetUserBp: c) line:%d \n",atoi(bp+1)));
- setBPatModLine (mod,atoi(bp+1)-1,bpType);
- goto ret;
-
- }
- /* case d) filename:function */
- if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
- else
+ setBPatModLine (mod,atoi(bp+1)-1,bpType);
+ goto ret;
+
+ }
+ /* case d) filename:function */
+ if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
+ fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
+ else
Dprintf(D_break, ("commonSetUserBp: d) \n"));
- setBPatModLine (mod,
- (srcMode == SRC_CMODE ?
- func->entryline :
- func->aentryline),bpType);
+ setBPatModLine (mod,
+ (srcMode == SRC_CMODE ?
+ func->entryline :
+ func->aentryline),bpType);
- goto ret;
+ goto ret;
}
/* case e) function */
Dprintf(D_break, ("commonSetUserBp: e) \n"));
if (!applyToSet(functions,funcWithName,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
else
- setBPatModLine(func->mod,
- (srcMode == SRC_CMODE ?
- func->entryline :
- func->aentryline),bpType);
+ setBPatModLine(func->mod,
+ (srcMode == SRC_CMODE ?
+ func->entryline :
+ func->aentryline),bpType);
ret:
return 0;
int line = atoi(s) -1;
if (!cctxt || !cctxt->func || !cctxt->func->mod)
{
- fprintf(stderr,"Function not defined.\n");
+ fprintf(stderr,"Function not defined.\n");
return 0;
}
if (line >= cctxt->func->entryline &&
}
if (line >= cctxt->func->mod->ncLines )
{
- fprintf(stderr,"line not in module.\n");
+ fprintf(stderr,"line not in module.\n");
return 0;
}
fprintf(stdout,"Warning line %d outside actual function.\n",line+1);
line = atoi(bp) -1;
if (line >= mod->ncLines )
{
- fprintf(stderr,"line not in module.\n");
+ fprintf(stderr,"line not in module.\n");
return 0;
}
if ( mod != cctxt->func->mod ||
{
while (*s && isspace(*s)) s++;
if (strncmp(s,"srcmode",7) == 0 ) {
- if (srcMode == SRC_CMODE)
- srcMode = SRC_AMODE;
- else
- srcMode = SRC_CMODE;
- fprintf(stderr,"source mode set to '%s'\n",
- (srcMode == SRC_CMODE ? "C" : "asm"));
- return 0;
+ if (srcMode == SRC_CMODE)
+ srcMode = SRC_AMODE;
+ else
+ srcMode = SRC_CMODE;
+ fprintf(stderr,"source mode set to '%s'\n",
+ (srcMode == SRC_CMODE ? "C" : "asm"));
+ return 0;
}
if (strncmp(s,"listsize ",9) == 0)
int cmdContinue (char *s, context *cctxt)
{
if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"The program is not being run.\n");
- return 0;
+ fprintf(stdout,"The program is not being run.\n");
+ return 0;
}
fprintf(stdout,"Continuing.\n");
while (isspace(*s)) s++;
if (!*s ) {
- if (userBpPresent) {
- char buffer[10];
- fprintf (stdout,"Delete all breakpoints? (y or n) ");
- fflush(stdout);
- fgets(buffer,sizeof(buffer),stdin);
- if (toupper(buffer[0]) == 'Y')
- deleteUSERbp(-1);
- }
- return 0;
+ if (userBpPresent) {
+ char buffer[10];
+ fprintf (stdout,"Delete all breakpoints? (y or n) ");
+ fflush(stdout);
+ fgets(buffer,sizeof(buffer),stdin);
+ if (toupper(buffer[0]) == 'Y')
+ deleteUSERbp(-1);
+ }
+ return 0;
}
/* determine the break point number */
if (sscanf(s,"%d",&bpnum) == 1)
- deleteUSERbp(bpnum);
+ deleteUSERbp(bpnum);
return 0;
}
else
{
doingSteps = 2;
- simGo(2);
+ simGo(2);
doingSteps = 0;
showfull = 1;
}
else
{
doingSteps = 2;
- simGo(1);
+ simGo(1);
doingSteps = 0;
showfull = 1;
}
{
char buff[10];
if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"Starting program\n");
+ fprintf(stdout,"Starting program\n");
if ( ! simactive )
{
fprintf(stdout,"No executable file specified.\nUse the \"file\" command.\n");
return 0;
}
resetHitCount();
- simGo(0);
+ simGo(0);
} else {
- fprintf(stdout,
- "The program being debugged has been started already.\n");
- fprintf(stdout,"Start it from the beginning? (y or n) ");
- fflush(stdout);
+ fprintf(stdout,
+ "The program being debugged has been started already.\n");
+ fprintf(stdout,"Start it from the beginning? (y or n) ");
+ fflush(stdout);
- fgets(buff,sizeof(buff),stdin);
- if (toupper(buff[0]) == 'Y') {
- simReset();
+ fgets(buff,sizeof(buff),stdin);
+ if (toupper(buff[0]) == 'Y') {
+ simReset();
resetHitCount();
- simGo(0);
- }
+ simGo(0);
+ }
}
showfull = 1;
return 0;
while ((func = STACK_WALK(callStack))) {
Dprintf(D_break, ("break: infoStack: %s %p (%p)\n",func->sym->name, w_callStack,p_callStack));
- fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++,
- func->laddr,func->sym->name,
- func->mod->c_name,func->lline+1);
+ fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++,
+ func->laddr,func->sym->name,
+ func->mod->c_name,func->lline+1);
}
if ( !i )
fprintf(stdout,"no stack.\n");
/*-----------------------------------------------------------------*/
int cmdWhere(char *s, context *cctxt)
{
- infoStack(cctxt);
- return 0;
+ infoStack(cctxt);
+ return 0;
}
/* list all break points */
if (strncmp(s,"break",5) == 0) {
- listUSERbp();
- return 0;
+ listUSERbp();
+ return 0;
}
/* info frame same as frame */
if (strcmp(s,"frame") == 0) {
- cmdFrame (s,cctxt);
- return 0;
+ cmdFrame (s,cctxt);
+ return 0;
}
if (strncmp(s,"line",4) == 0) {
infomode=1;
- cmdListSrc (s+4,cctxt);
- return 0;
+ cmdListSrc (s+4,cctxt);
+ return 0;
}
if (strncmp(s,"source",6) == 0)
{
}
/* info stack display call stack */
if (strcmp(s,"stack") == 0) {
- infoStack(cctxt);
+ infoStack(cctxt);
showfull = 1;
- return 0;
+ return 0;
}
/* info stack display call stack */
if (strcmp(s,"registers") == 0) {
infoRegisters(0,cctxt);
- return 0;
+ return 0;
}
/* info stack display call stack */
int cmdQuit (char *s, context *cctxt)
{
if (simactive)
- closeSimulator();
+ closeSimulator();
return 1;
}
FILE:FUNCTION - function in file */
if (*s) {
- /* case a) LINE */
- if (isdigit(*s)) {
- if (!cctxt || !cctxt->func || !cctxt->func->mod) {
- if (!list_mod) {
- fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__);
- return 0;
- }
- }
- else
- list_mod = cctxt->func->mod;
+ /* case a) LINE */
+ if (isdigit(*s)) {
+ if (!cctxt || !cctxt->func || !cctxt->func->mod) {
+ if (!list_mod) {
+ fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__);
+ return 0;
+ }
+ }
+ else
+ list_mod = cctxt->func->mod;
pline = strtol(s,&s,10) - 1;
if (s && (s = strchr(s,',')))
{
else
llines = listlines;
}
- }
- else {
- char *bp;
-
- /* if ':' present then FILE:LINE || FILE:FUNCTION */
- if ((bp = strchr(s,':'))) {
- *bp = '\0';
- bp ++;
- if (isdigit(*bp)) {
- /* FILE:LINE */
- list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */
- if (srcMode == SRC_CMODE) {
- if (!applyToSet(modules,moduleWithCName,s,&list_mod)) {
- fprintf (stderr,"No c source file named %s.\n",s);
- return 0;
- }
- } else {
- if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- return 0;
- }
- }
- pline = strtol(bp,&bp,10) - 1;
+ }
+ else {
+ char *bp;
+
+ /* if ':' present then FILE:LINE || FILE:FUNCTION */
+ if ((bp = strchr(s,':'))) {
+ *bp = '\0';
+ bp ++;
+ if (isdigit(*bp)) {
+ /* FILE:LINE */
+ list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */
+ if (srcMode == SRC_CMODE) {
+ if (!applyToSet(modules,moduleWithCName,s,&list_mod)) {
+ fprintf (stderr,"No c source file named %s.\n",s);
+ return 0;
+ }
+ } else {
+ if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ return 0;
+ }
+ }
+ pline = strtol(bp,&bp,10) - 1;
if (bp && (bp = strchr(bp,',')))
{
/* FILE:LINE,LASTLINE */
else
llines = listlines;
}
- } else {
- /* FILE:FUCTION */
- if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) {
- fprintf(stdout,"Function \"%s\" not defined.\n",bp);
- return 0;
- }
- list_mod = func->mod;
- if (srcMode == SRC_CMODE) {
- pline = func->entryline;
- llines = func->exitline - func->entryline + 1;
- } else {
- pline = func->aentryline;
- llines = func->aexitline - func->aentryline + 1;
- }
- }
- }
- else {
- /* FUNCTION */
+ } else {
+ /* FILE:FUCTION */
+ if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) {
+ fprintf(stdout,"Function \"%s\" not defined.\n",bp);
+ return 0;
+ }
+ list_mod = func->mod;
+ if (srcMode == SRC_CMODE) {
+ pline = func->entryline;
+ llines = func->exitline - func->entryline + 1;
+ } else {
+ pline = func->aentryline;
+ llines = func->aexitline - func->aentryline + 1;
+ }
+ }
+ }
+ else {
+ /* FUNCTION */
if (*s == '\'')
{
/* 'FUNCTION' */
}
}
- if (!applyToSet(functions,funcWithName,s,&func)) {
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
- return 0;
- }
- else {
- list_mod = func->mod;
- if (srcMode == SRC_CMODE) {
- pline = func->entryline;
- llines = func->exitline - func->entryline + 1;
- } else {
- pline = func->aentryline;
- llines = func->aexitline - func->aentryline + 1;
- }
- }
- }
- }
+ if (!applyToSet(functions,funcWithName,s,&func)) {
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ return 0;
+ }
+ else {
+ list_mod = func->mod;
+ if (srcMode == SRC_CMODE) {
+ pline = func->entryline;
+ llines = func->exitline - func->entryline + 1;
+ } else {
+ pline = func->aentryline;
+ llines = func->aexitline - func->aentryline + 1;
+ }
+ }
+ }
+ }
} else {
- /* if no line specified & we had listed
- before then continue from that listing */
- if (currline)
- pline = currline ;
- else {
- if (!cctxt || !cctxt->func || !cctxt->func->mod) {
- fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__);
- return 0;
- }
- list_mod = cctxt->func->mod;
- if (srcMode == SRC_CMODE)
- pline = cctxt->cline;
- else
- pline = cctxt->asmline;
- }
+ /* if no line specified & we had listed
+ before then continue from that listing */
+ if (currline)
+ pline = currline ;
+ else {
+ if (!cctxt || !cctxt->func || !cctxt->func->mod) {
+ fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__);
+ return 0;
+ }
+ list_mod = cctxt->func->mod;
+ if (srcMode == SRC_CMODE)
+ pline = cctxt->cline;
+ else
+ pline = cctxt->asmline;
+ }
}
if (!list_mod) {
if ( infomode )
{
unsigned firstaddr , lastaddr ;
- if ( pline >= list_mod->ncLines )
+ if ( pline >= list_mod->ncLines )
pline = cctxt->cline;
firstaddr = lastaddr = list_mod->cLines[pline]->addr;
if (!func && cctxt && cctxt->func )
func = cctxt->func;
- fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>",
+ fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>",
pline+1,
list_mod->c_name, lastaddr,
func ? func->sym->name : "?",
return 0;
}
for ( i = 0 ; i < llines ; i++ ) {
- if (srcMode == SRC_CMODE) {
- if ( (pline + i) >= list_mod->ncLines )
- break;
- fprintf(stdout,"%d\t%s",pline + i,
- list_mod->cLines[pline +i]->src);
- } else {
- if ( (pline + i) >= list_mod->nasmLines )
- break;
- fprintf(stdout,"%d\t%s",pline + i,
- list_mod->asmLines[pline +i]->src);
- }
+ if (srcMode == SRC_CMODE) {
+ if ( (pline + i) >= list_mod->ncLines )
+ break;
+ fprintf(stdout,"%d\t%s",pline + i,
+ list_mod->cLines[pline +i]->src);
+ } else {
+ if ( (pline + i) >= list_mod->nasmLines )
+ break;
+ fprintf(stdout,"%d\t%s",pline + i,
+ list_mod->asmLines[pline +i]->src);
+ }
}
currline = pline + i ;
return 0;
if (IS_FLOAT(type))
v.f = strtod(val,NULL);
else
- if (IS_PTR(type))
- v.val = strtol(val,NULL,0);
- else
+ if (IS_PTR(type))
+ v.val = strtol(val,NULL,0);
+ else
{
- if (IS_INTEGRAL(type))
+ if (IS_INTEGRAL(type))
{
link *etype;
if ( type->next )
v.i.lo = strtol(val,NULL,0);
else
v.val = strtol(val,NULL,0);
- }
+ }
else
v.val = strtol(val,NULL,0);
}
};
static int radixOfFormat[] = { 0 , 2, 8 ,10, 16 };
static int olenOfSize[] = { 0 , 3, 6 , 8, 11 };
- char buf[40];
- char negative = 0;
- int charPos = 38;
+ char buf[40];
+ char negative = 0;
+ int charPos = 38;
int radix;
if ( fmt == FMT_NON || fmt == FMT_DEZ )
negative = 1;
*/
- if (!negative)
- val = -val;
+ if (!negative)
+ val = -val;
- buf[39] = '\0';
+ buf[39] = '\0';
while (val <= -radix)
{
- buf[charPos--] = digits[-(val % radix)];
- val = val / radix;
- }
- buf[charPos] = digits[-val];
+ buf[charPos--] = digits[-(val % radix)];
+ val = val / radix;
+ }
+ buf[charPos] = digits[-val];
switch ( fmt )
{
buf[--charPos] = '0';
break;
}
- if (negative) {
- buf[--charPos] = '-';
- }
+ if (negative) {
+ buf[--charPos] = '-';
+ }
fputs(&buf[charPos],stdout);
}
v.val = simGetValue(addr,mem,size);
/* if this a floating point number then */
if (IS_FLOAT(type))
- fprintf(stdout,"%f",v.f);
+ fprintf(stdout,"%f",v.f);
else
- if (IS_PTR(type))
- fprintf(stdout,"0x%*x",size<<1,v.val);
- else
+ if (IS_PTR(type))
+ fprintf(stdout,"0x%*x",size<<1,v.val);
+ else
if (IS_INTEGRAL(type))
{
link *etype;
fprintf(stdout,"0x%0*x",size<<1,v.val);
}
}
- } else
+ } else
fprintf(stdout,"0x%0*x",size<<1,v.val);
}
static void printArrayValue (symbol *sym, link *type,
char space, unsigned int addr, int fmt)
{
- link *elem_type = type->next;
- int i;
+ link *elem_type = type->next;
+ int i;
- fprintf(stdout,"{");
- for (i = 0 ; i < DCL_ELEM(type) ; i++) {
- if (IS_AGGREGATE(elem_type)) {
- printValAggregates(sym,elem_type,space,addr,fmt);
- } else {
- printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt);
- }
- addr += getSize(elem_type);
- if (i != DCL_ELEM(type) -1)
- fprintf(stdout,",");
- }
+ fprintf(stdout,"{");
+ for (i = 0 ; i < DCL_ELEM(type) ; i++) {
+ if (IS_AGGREGATE(elem_type)) {
+ printValAggregates(sym,elem_type,space,addr,fmt);
+ } else {
+ printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt);
+ }
+ addr += getSize(elem_type);
+ if (i != DCL_ELEM(type) -1)
+ fprintf(stdout,",");
+ }
- fprintf(stdout,"}");
+ fprintf(stdout,"}");
}
/*-----------------------------------------------------------------*/
static void printStructValue (symbol *sym, link *type,
char space, unsigned int addr, int fmt)
{
- symbol *fields = SPEC_STRUCT(type)->fields;
+ symbol *fields = SPEC_STRUCT(type)->fields;
int first = 1;
- fprintf(stdout," { ");
- while (fields) {
- fprintf(stdout,"%s%s = ",(first ? "": ", "),fields->name);
- first = 0;
+ fprintf(stdout," { ");
+ while (fields) {
+ fprintf(stdout,"%s%s = ",(first ? "": ", "),fields->name);
+ first = 0;
if (IS_AGGREGATE(fields->type)) {
- printValAggregates(fields,fields->type,space, addr, fmt);
- } else {
- printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt);
- }
- addr += getSize(fields->type);
- fields = fields->next;
- }
- fprintf(stdout,"}");
+ printValAggregates(fields,fields->type,space, addr, fmt);
+ } else {
+ printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt);
+ }
+ addr += getSize(fields->type);
+ fields = fields->next;
+ }
+ fprintf(stdout,"}");
}
/*-----------------------------------------------------------------*/
char space,unsigned int addr, int fmt)
{
- if (IS_ARRAY(type)) {
- printArrayValue(sym, type, space, addr, fmt);
- return ;
- }
+ if (IS_ARRAY(type)) {
+ printArrayValue(sym, type, space, addr, fmt);
+ return ;
+ }
- if (IS_STRUCT(type)) {
- printStructValue(sym, type, space, addr, fmt);
- return;
- }
+ if (IS_STRUCT(type)) {
+ printStructValue(sym, type, space, addr, fmt);
+ return;
+ }
}
/*-----------------------------------------------------------------*/
{
static char fmtChar[] = " todx ";
static int stack = 1;
- symbol *fields;
+ symbol *fields;
link *type;
unsigned int addr;
int size, n;
/* arrays & structures first */
if (IS_AGGREGATE(type))
{
- if ( val )
+ if ( val )
{
fprintf(stdout,"Cannot set/compare aggregate variable\n");
return 1;
printValAggregates(sym,type,sym->addrspace,addr,fmt);
}
else
- /* functions */
- if (IS_FUNC(type))
+ /* functions */
+ if (IS_FUNC(type))
{
- if ( !val )
+ if ( !val )
printValFunc(sym,fmt);
else
return 1;
}
- else
+ else
{
- if ( val )
+ if ( val )
{
unsigned long newval;
newval = getValBasic(sym,type,val);
printValBasic(sym,type,sym->addrspace,addr,size,fmt);
}
if ( flg > 0 ) fprintf(stdout,"\n");
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
int i = 0 ;
while (field) {
- i += field->offset;
- field = field->next;
+ i += field->offset;
+ field = field->next;
}
fprintf(stdout,"%s %s {\n",(i ? "struct" : "union" ), sdef->tag);
field = sdef->fields;
while (field) {
- printTypeInfo (field->type);
- fprintf(stdout," %s ;\n",field->name);
- field = field->next ;
+ printTypeInfo (field->type);
+ fprintf(stdout," %s ;\n",field->name);
+ field = field->next ;
}
fprintf(stdout,"}\n");
static void printTypeInfo(link *p)
{
if (!p)
- return ;
+ return ;
if (IS_DECL(p)) {
- switch (DCL_TYPE(p)) {
- case FUNCTION:
- printTypeInfo (p->next);
- fprintf(stdout,"()");
- break;
- case ARRAY:
- printTypeInfo (p->next);
- fprintf(stdout,"[%d]",DCL_ELEM(p));
- break;
-
- case IPOINTER:
- case PPOINTER:
- case POINTER:
- printTypeInfo (p->next);
- fprintf(stdout,"(_near *)");
- break;
-
- case FPOINTER:
- printTypeInfo (p->next);
- fprintf(stdout,"(_xdata *)");
- break;
-
- case CPOINTER:
- printTypeInfo( p->next);
- fprintf(stdout,"(_code *)");
- break;
-
- case GPOINTER:
- printTypeInfo( p->next);
- fprintf(stdout,"(_generic *)");
- break;
- }
+ switch (DCL_TYPE(p)) {
+ case FUNCTION:
+ printTypeInfo (p->next);
+ fprintf(stdout,"()");
+ break;
+ case ARRAY:
+ printTypeInfo (p->next);
+ fprintf(stdout,"[%d]",DCL_ELEM(p));
+ break;
+
+ case IPOINTER:
+ case PPOINTER:
+ case POINTER:
+ printTypeInfo (p->next);
+ fprintf(stdout,"(_near *)");
+ break;
+
+ case FPOINTER:
+ printTypeInfo (p->next);
+ fprintf(stdout,"(_xdata *)");
+ break;
+
+ case CPOINTER:
+ printTypeInfo( p->next);
+ fprintf(stdout,"(_code *)");
+ break;
+
+ case GPOINTER:
+ printTypeInfo( p->next);
+ fprintf(stdout,"(_generic *)");
+ break;
+ }
} else {
- switch (SPEC_NOUN(p)) { /* depending on the specifier type */
- case V_INT:
- (IS_LONG(p) ? fputs("long ",stdout) :
- ( IS_SHORT(p) ? fputs("short ",stdout) :
- fputs("int ",stdout))) ;
- break;
- case V_FLOAT:
- fputs("float ",stdout);
- break;
+ switch (SPEC_NOUN(p)) { /* depending on the specifier type */
+ case V_INT:
+ (IS_LONG(p) ? fputs("long ",stdout) :
+ ( IS_SHORT(p) ? fputs("short ",stdout) :
+ fputs("int ",stdout))) ;
+ break;
+ case V_FLOAT:
+ fputs("float ",stdout);
+ break;
- case V_CHAR:
- fputs ("char ",stdout);
- break;
+ case V_CHAR:
+ fputs ("char ",stdout);
+ break;
- case V_VOID:
- fputs("void ",stdout);
- break;
+ case V_VOID:
+ fputs("void ",stdout);
+ break;
- case V_STRUCT:
- printStructInfo (SPEC_STRUCT(p));
- break;
+ case V_STRUCT:
+ printStructInfo (SPEC_STRUCT(p));
+ break;
- case V_SBIT:
- fputs("sbit ",stdout);
- break;
+ case V_SBIT:
+ fputs("sbit ",stdout);
+ break;
- case V_BIT:
- fprintf(stdout,": %d" ,SPEC_BLEN(p));
- break;
- }
+ case V_BIT:
+ fprintf(stdout,": %d" ,SPEC_BLEN(p));
+ break;
+ }
}
}
*bp = '\0';
if ((sym = symLookup(s,cctxt))) {
- printTypeInfo(sym->type);
- fprintf(stdout,"\n");
+ printTypeInfo(sym->type);
+ fprintf(stdout,"\n");
} else {
- fprintf(stdout,
- "No symbol \"%s\" in current context.\n",
- s);
+ fprintf(stdout,
+ "No symbol \"%s\" in current context.\n",
+ s);
}
return 0;
}
*/
if (!cctxt) {
- fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
- return 0;
+ fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
+ return 0;
}
/* white space skip */
the current execution location from the currentContext */
if (! *s ) {
- /* if current context is known */
- if (cctxt->func)
- /* clear the break point @ current location */
- clearUSERbp (cctxt->addr);
- else
- fprintf(stderr,"No default breakpoint address now.\n");
+ /* if current context is known */
+ if (cctxt->func)
+ /* clear the break point @ current location */
+ clearUSERbp (cctxt->addr);
+ else
+ fprintf(stderr,"No default breakpoint address now.\n");
- goto ret ;
+ goto ret ;
}
/* case b) lineno */
/* check if line number */
if (isdigit(*s)) {
- /* get the lineno */
- int line = atoi(s);
-
- /* if current context not present then we must get the module
- which has main & set the break point @ line number provided
- of that module : if current context known then set the bp
- at the line number given for the current module
- */
- if (cctxt->func) {
- if (!cctxt->func->mod) {
- if (!applyToSet(functions,funcWithName,"main"))
- fprintf(stderr,"Function \"main\" not defined.\n");
- else
- clearBPatModLine(func->mod,line);
- } else
- clearBPatModLine(cctxt->func->mod,line);
- }
-
- goto ret;
+ /* get the lineno */
+ int line = atoi(s);
+
+ /* if current context not present then we must get the module
+ which has main & set the break point @ line number provided
+ of that module : if current context known then set the bp
+ at the line number given for the current module
+ */
+ if (cctxt->func) {
+ if (!cctxt->func->mod) {
+ if (!applyToSet(functions,funcWithName,"main"))
+ fprintf(stderr,"Function \"main\" not defined.\n");
+ else
+ clearBPatModLine(func->mod,line);
+ } else
+ clearBPatModLine(cctxt->func->mod,line);
+ }
+
+ goto ret;
}
if ((bp = strchr(s,':'))) {
- module *mod = NULL;
- *bp = '\0';
+ module *mod = NULL;
+ *bp = '\0';
- if (!applyToSet(modules,moduleWithCName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
+ if (!applyToSet(modules,moduleWithCName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
- /* case c) filename:lineno */
- if (isdigit(*(bp +1))) {
+ /* case c) filename:lineno */
+ if (isdigit(*(bp +1))) {
- clearBPatModLine (mod,atoi(bp+1));
- goto ret;
+ clearBPatModLine (mod,atoi(bp+1));
+ goto ret;
- }
- /* case d) filename:function */
- if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
- else
- clearBPatModLine (mod,func->entryline);
+ }
+ /* case d) filename:function */
+ if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
+ fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
+ else
+ clearBPatModLine (mod,func->entryline);
- goto ret;
+ goto ret;
}
/* case e) function */
if (!applyToSet(functions,funcWithName,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
else
- clearBPatModLine(func->mod,func->entryline);
+ clearBPatModLine(func->mod,func->entryline);
ret:
return 0;
currentFrame++ ;
printFrame();
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
currentFrame-- ;
printFrame();
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
/* cmdFrame - Frame command */
int cmdFinish (char *s, context *ctxt)
{
if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"The program is not running.\n");
- return 0;
+ fprintf(stdout,"The program is not running.\n");
+ return 0;
}
if (srcMode == SRC_CMODE) {
- setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
- stepBpCB, ctxt->func->mod->c_name,
- ctxt->func->exitline);
+ setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
+ stepBpCB, ctxt->func->mod->c_name,
+ ctxt->func->exitline);
} else {
- setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
- stepBpCB, ctxt->func->mod->asm_name,
- ctxt->func->aexitline);
+ setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
+ stepBpCB, ctxt->func->mod->asm_name,
+ ctxt->func->aexitline);
}
simGo(-1);
while (*s && isspace(*s)) s++ ;
if (strcmp(s,"copying") == 0) {
- fputs(copying,stdout);
- return 0;
+ fputs(copying,stdout);
+ return 0;
}
if (strcmp(s,"warranty") == 0) {
- fputs(warranty,stdout);
- return 0;
+ fputs(warranty,stdout);
+ return 0;
}
return 0;
/*-------------------------------------------------------------------------
simi.c - source file for simulator interaction
-
- Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
+ Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
+
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding!
+ what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
#include "sdcdb.h"
#include "simi.h"
+#include "newalloc.h"
+#ifdef _WIN32
+#include <windows.h>
+#include <winsock2.h>
+#include <signal.h>
+#include <io.h>
+#include <fcntl.h>
+#else
#ifdef HAVE_SYS_SOCKET_H
#include <sys/types.h>
#include <sys/socket.h>
#else
#error "Cannot build debugger without socket support"
#endif
+#endif
+
FILE *simin ; /* stream for simulator input */
FILE *simout; /* stream for simulator output */
+#ifdef _WIN32
+SOCKET sock = INVALID_SOCKET;
+PROCESS_INFORMATION *simPid = NULL;
+#else
int sock = -1; /* socket descriptor to comm with simulator */
pid_t simPid = -1;
+#endif
static char simibuff[MAX_SIM_BUFF]; /* sim buffer */
static char regBuff[MAX_SIM_BUFF];
static char *sbp = simibuff; /* simulator buffer pointer */
/*-----------------------------------------------------------------*/
static void invalidateCache( int cachenum )
{
- memCache[cachenum].size = 0;
+ memCache[cachenum].size = 0;
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
/* openSimulator - create a pipe to talk to simulator */
/*-----------------------------------------------------------------*/
+#ifdef _WIN32
+char *argsToCmdLine(char **args, int nargs)
+{
+#define CHUNCK 256
+ int i;
+ int cmdPos = 0;
+ char *cmd = Safe_malloc(CHUNCK);
+ int cmdLen = CHUNCK;
+
+ for (i = 0; i < nargs; i++)
+ {
+ int quote = 0;
+ int argLen = strlen(args[i]);
+
+ if (NULL != strchr(args[i], ' '))
+ {
+ quote = 1;
+ argLen += 2;
+ }
+
+ if (0 < nargs)
+ ++argLen;
+
+ if (argLen >= cmdLen)
+ {
+ do
+ {
+ cmdLen += cmdLen;
+ }
+ while (argLen >= cmdLen);
+ cmd = Safe_realloc(cmd, cmdLen);
+ }
+
+ if (0 < nargs)
+ {
+ cmd[cmdPos++] = ' ';
+ --argLen;
+ }
+
+ if (quote)
+ {
+ cmd[cmdPos++] = '"';
+ --argLen;
+ }
+
+ memcpy(&cmd[cmdPos], args[i], argLen);
+ cmdPos += argLen;
+
+ if (quote)
+ cmd[cmdPos++] = '"';
+ }
+
+ return cmd;
+}
+
+PROCESS_INFORMATION *execSimulator(char **args, int nargs)
+{
+ STARTUPINFO si;
+ static PROCESS_INFORMATION pi;
+ char *cmdLine = argsToCmdLine(args, nargs);
+
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ memset(&pi, 0, sizeof(pi));
+
+ // Start the child process.
+ if (!CreateProcess(NULL, // No module name (use command line)
+ cmdLine, // Command line
+ NULL, // Process handle not inheritable
+ NULL, // Thread handle not inheritable
+ FALSE, // Set handle inheritance to FALSE
+ 0, // No creation flags
+ NULL, // Use parent's environment block
+ NULL, // Use parent's starting directory
+ &si, // Pointer to STARTUPINFO structure
+ &pi) // Pointer to PROCESS_INFORMATION structure
+ )
+ {
+ Safe_free(cmdLine);
+ printf( "CreateProcess failed (%d).\n", GetLastError() );
+ return NULL;
+ }
+
+ Safe_free(cmdLine);
+ return π
+}
+
+void openSimulator (char **args, int nargs)
+{
+ struct sockaddr_in sin;
+ int retry = 0;
+ int i;
+ int fh;
+ Dprintf(D_simi, ("simi: openSimulator\n"));
+#ifdef SDCDB_DEBUG
+ if (D_simi & sdcdbDebug)
+ {
+ printf("simi: openSimulator: ");
+ for (i=0; i < nargs; i++ )
+ {
+ printf("arg%d: %s ",i,args[i]);
+ }
+ printf("\n");
+ }
+#endif
+ invalidateCache(XMEM_CACHE);
+ invalidateCache(IMEM_CACHE);
+ invalidateCache(SREG_CACHE);
+
+ try_connect:
+ sock = WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+
+ memset(&sin,0,sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = inet_addr("127.0.0.1");
+ sin.sin_port = htons(9756);
+
+ /* connect to the simulator */
+ if (INVALID_SOCKET == connect(sock,(struct sockaddr *) &sin, sizeof(sin)))
+ {
+ /* if failed then wait 1 second & try again
+ do this for 10 secs only */
+ if (retry < 10)
+ {
+ if ( !retry )
+ simPid = execSimulator(args, nargs);
+ retry ++;
+ Sleep(1000);
+ goto try_connect;
+ }
+ perror("connect failed :");
+ exit(1);
+ }
+ fh = _open_osfhandle((intptr_t)socket, _O_TEXT);
+ if (-1 == fh)
+ {
+ fprintf(stderr, "cannot _open_osfhandle\n");
+ exit(1);
+ }
+
+ /* go the socket now turn it into a file handle */
+ if (!(simin = fdopen(sock,"r")))
+ {
+ fprintf(stderr,"cannot open socket for read\n");
+ exit(1);
+ }
+
+ fh = _open_osfhandle((intptr_t)socket, _O_TEXT);
+ if (-1 == fh)
+ {
+ fprintf(stderr, "cannot _open_osfhandle\n");
+ exit(1);
+ }
+
+ if (!(simout = fdopen(sock,"w")))
+ {
+ fprintf(stderr,"cannot open socket for write\n");
+ exit(1);
+ }
+ /* now that we have opened, wait for the prompt */
+ waitForSim(200,NULL);
+ simactive = 1;
+}
+#else
+int execSimulator(char **args, int nargs)
+{
+ if ((simPid = fork()))
+ {
+ Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid));
+ }
+ else
+ {
+ /* we are in the child process : start the simulator */
+ signal(SIGINT , SIG_IGN );
+ signal(SIGABRT, SIG_IGN );
+ signal(SIGHUP , SIG_IGN );
+ signal(SIGCHLD, SIG_IGN );
+
+ if (execvp(args[0],args) < 0)
+ {
+ perror("cannot exec simulator");
+ exit(1);
+ }
+ }
+}
+
void openSimulator (char **args, int nargs)
{
- struct sockaddr_in sin;
+ struct sockaddr_in sin;
int retry = 0;
- int i ;
+ int i;
Dprintf(D_simi, ("simi: openSimulator\n"));
#ifdef SDCDB_DEBUG
if (D_simi & sdcdbDebug)
invalidateCache(XMEM_CACHE);
invalidateCache(IMEM_CACHE);
invalidateCache(SREG_CACHE);
-
+
try_connect:
sock = socket(AF_INET,SOCK_STREAM,0);
-
+
memset(&sin,0,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_port = htons(9756);
-
+
/* connect to the simulator */
- if (connect(sock,(struct sockaddr *) &sin, sizeof(sin)) < 0) {
- /* if failed then wait 1 second & try again
- do this for 10 secs only */
- if (retry < 10) {
- if ( !retry )
+ if (connect(sock,(struct sockaddr *) &sin, sizeof(sin)) < 0)
+ {
+ /* if failed then wait 1 second & try again
+ do this for 10 secs only */
+ if (retry < 10)
{
- /* fork and start the simulator as a subprocess */
- if ((simPid = fork())) {
- Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid));
- }
- else {
- /* we are in the child process : start the simulator */
- signal(SIGHUP , SIG_IGN );
- signal(SIGINT , SIG_IGN );
- signal(SIGABRT, SIG_IGN );
- signal(SIGCHLD, SIG_IGN );
-
- if (execvp(args[0],args) < 0) {
- perror("cannot exec simulator");
- exit(1);
- }
+ if ( !retry )
+ {
+ simPid = execSimulator(args, nargs);
}
+ retry ++;
+ sleep (1);
+ goto try_connect;
}
- retry ++;
- sleep (1);
- goto try_connect;
- }
- perror("connect failed :");
- exit(1);
+ perror("connect failed :");
+ exit(1);
}
/* go the socket now turn it into a file handle */
- if (!(simin = fdopen(sock,"r"))) {
- fprintf(stderr,"cannot open socket for read\n");
- exit(1);
+ if (!(simin = fdopen(sock,"r")))
+ {
+ fprintf(stderr,"cannot open socket for read\n");
+ exit(1);
}
- if (!(simout = fdopen(sock,"w"))) {
- fprintf(stderr,"cannot open socket for write\n");
- exit(1);
+ if (!(simout = fdopen(sock,"w")))
+ {
+ fprintf(stderr,"cannot open socket for write\n");
+ exit(1);
}
-
/* now that we have opened, wait for the prompt */
waitForSim(200,NULL);
simactive = 1;
}
+#endif
+
/*-----------------------------------------------------------------*/
/* simResponse - returns buffer to simulator's response */
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
void sendSim(char *s)
{
- if ( ! simout )
+ if ( ! simout )
return;
Dprintf(D_simi, ("simi: sendSim-->%s", s)); // s has LF at end already
}
-static int getMemString(char *buffer, char wrflag,
+static int getMemString(char *buffer, char wrflag,
unsigned int *addr, char mem, int size )
{
int cachenr = NMEM_CACHE;
cmd = "dump";
buffer[0] = '\0' ;
- switch (mem)
+ switch (mem)
{
case 'A': /* External stack */
case 'F': /* External ram */
case 'D': /* Code / static segment */
prefix = "rom";
break;
- case 'B': /* Internal stack */
+ case 'B': /* Internal stack */
case 'E': /* Internal ram (lower 128) bytes */
case 'G': /* Internal ram */
prefix = "iram";
prefix = "sfr" ;
cachenr = SREG_CACHE;
break;
- case 'R': /* Register space */
+ case 'R': /* Register space */
prefix = "iram";
/* get register bank */
- cachenr = simGetValue (0xd0,'I',1);
+ cachenr = simGetValue (0xd0,'I',1);
*addr += cachenr & 0x18 ;
cachenr = IMEM_CACHE;
break;
- default:
+ default:
case 'Z': /* undefined space code */
return cachenr;
}
sprintf(buffer,"pc %d\n", addr);
sendSim(buffer);
waitForSim(100,NULL);
- simResponse();
+ simResponse();
}
int simSetValue (unsigned int addr,char mem, int size, unsigned long val)
sprintf(s,"\n");
sendSim(buffer);
waitForSim(100,NULL);
- simResponse();
+ simResponse();
return 0;
}
resp = simResponse();
/* got the response we need to parse it the response
- is of the form
+ is of the form
[address] [v] [v] [v] ... special case in
case of bit variables which case it becomes
[address] [assembler bit address] [v] */
/* skip thru the address part */
while (isxdigit(*resp)) resp++;
- }
+ }
/* make the branch for bit variables */
- if ( cachenr == BIT_CACHE)
+ if ( cachenr == BIT_CACHE)
{
/* skip until newline */
while (*resp && *resp != '\n' ) resp++ ;
if ( *--resp != '0' )
b[0] = 1;
}
- else
- {
- for (i = 0 ; i < size ; i++ )
+ else
+ {
+ for (i = 0 ; i < size ; i++ )
{
/* skip white space */
while (isspace(*resp)) resp++ ;
-
+
b[i] = strtol(resp,&resp,16);
}
}
return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24 ;
-
+
}
/*-----------------------------------------------------------------*/
unsigned int simGoTillBp ( unsigned int gaddr)
{
char *sr;
- unsigned addr ;
+ unsigned addr ;
char *sfmt;
int wait_ms = 1000;
sendSim("reset\n");
waitForSim(wait_ms, NULL);
sendSim("run 0x0\n");
- } else if (gaddr == -1) { /* resume */
+ } else if (gaddr == -1) { /* resume */
sendSim ("run\n");
wait_ms = 100;
}
- else if (gaddr == 1 ) { /* nexti or next */
+ else if (gaddr == 1 ) { /* nexti or next */
sendSim ("next\n");
wait_ms = 100;
}
- else if (gaddr == 2 ) { /* stepi or step */
+ else if (gaddr == 2 ) { /* stepi or step */
sendSim ("step\n");
wait_ms = 100;
}
- else {
+ else {
printf("Error, simGoTillBp > 0!\n");
exit(1);
}
waitForSim(wait_ms, NULL);
-
+
/* get the simulator response */
sr = simResponse();
/* check for errors */
/*-----------------------------------------------------------------*/
void closeSimulator ()
{
+#ifdef _WIN32
+ if ( ! simin || ! simout || INVALID_SOCKET == sock )
+#else
if ( ! simin || ! simout || sock == -1 )
+#endif
{
simactive = 0;
return;
sendSim("quit\n");
fclose (simin);
fclose (simout);
- shutdown(sock,2);
- close(sock);
+ shutdown(sock,2);
+#ifdef _WIN32
+ closesocket(sock);
+ sock = -1;
+ if (NULL != simPid)
+ TerminateProcess(simPid->hProcess, 0);
+ // Close process and thread handles.
+ CloseHandle(simPid->hProcess);
+ CloseHandle(simPid->hThread);
+#else
+ close(sock);
sock = -1;
if ( simPid > 0 )
kill (simPid,SIGKILL);
+#endif
}
-
-