Line 75... |
Line 75... |
static int gdb_read(void*,int);
|
static int gdb_read(void*,int);
|
static int gdb_write(void*,int);
|
static int gdb_write(void*,int);
|
void BlockJTAG(void);
|
void BlockJTAG(void);
|
|
|
#ifndef DEBUGMOD_OFF
|
#ifndef DEBUGMOD_OFF
|
|
int NewStyleExceptions = 1; /* Start off with the new style exception handlers */
|
|
/* This means GDB will expect the PC at 0xD00 when a
|
|
a breakpoint occurs, and will intercept AFTER the
|
|
exception vector is taken. */
|
int GlobalMode = 0; /* Start off in the orginal mode */
|
int GlobalMode = 0; /* Start off in the orginal mode */
|
#else /* no DEBUGMOD_OFF */
|
#else /* no DEBUGMOD_OFF */
|
#define GlobalMode 0
|
#define GlobalMode 0
|
#endif /* no DEBUGMOD_OFF */
|
#endif /* no DEBUGMOD_OFF */
|
|
|
/* CVS revision number. */
|
/* CVS revision number. */
|
const char rcsrev[] = "$Revision: 1.23 $";
|
const char rcsrev[] = "$Revision: 1.24 $";
|
|
|
/* Continuos run versus single step tracing switch. */
|
/* Continuos run versus single step tracing switch. */
|
int cont_run;
|
int cont_run;
|
|
|
/* History of execution */
|
/* History of execution */
|
Line 232... |
Line 236... |
char *redirstr;
|
char *redirstr;
|
int hush;
|
int hush;
|
unsigned long endaddr = 0xFFFFFFFF;
|
unsigned long endaddr = 0xFFFFFFFF;
|
int first_prompt = 1;
|
int first_prompt = 1;
|
int trace_fd = 0;
|
int trace_fd = 0;
|
|
unsigned char trace_reg[32];
|
|
|
|
memset(trace_reg,'\0',sizeof(trace_reg));
|
srand(getpid());
|
srand(getpid());
|
init_defconfig();
|
init_defconfig();
|
if (parse_args(argc, argv)) {
|
if (parse_args(argc, argv)) {
|
printf("Usage: %s [options] <filename>\n", argv[0]);
|
printf("Usage: %s [options] <filename>\n", argv[0]);
|
printf("Options:\n");
|
printf("Options:\n");
|
Line 404... |
Line 410... |
|
|
uart_reset();
|
uart_reset();
|
tick_reset();
|
tick_reset();
|
pm_reset();
|
pm_reset();
|
pic_reset();
|
pic_reset();
|
|
mtspr(2,0x20); /* We are emulating a 32 bit processor/no FP */
|
reset();
|
reset();
|
if(!GlobalMode) /* Only in old mode */
|
if(!GlobalMode) /* Only in old mode */
|
set_reg32(3, endaddr);
|
set_reg32(3, endaddr);
|
|
|
while(1) {
|
while(1) {
|
Line 623... |
Line 630... |
cont_run = -1;
|
cont_run = -1;
|
hush = 1;
|
hush = 1;
|
} else
|
} else
|
if (!strcmp(item1, "trace")) { /* Added by CZ 210801 */
|
if (!strcmp(item1, "trace")) { /* Added by CZ 210801 */
|
char item2[256];
|
char item2[256];
|
|
char item3[256];
|
|
char *s,*q;
|
|
|
strtoken(linestr, item2, 2);
|
strtoken(linestr, item2, 2);
|
|
strtoken(linestr, item3, 3);
|
if(trace_fd)
|
if(trace_fd)
|
{
|
{
|
close(trace_fd);
|
close(trace_fd);
|
trace_fd = 0;
|
trace_fd = 0;
|
|
memset(trace_reg,'\0',sizeof(trace_reg));
|
}
|
}
|
if(strcmp(item2,"off")) /* if we're not being turned off */
|
if(strcmp(item2,"off")) /* if we're not being turned off */
|
{
|
{
|
if(item2[0])
|
if(item2[0])
|
trace_fd = open(item2,O_CREAT | O_NOCTTY |
|
trace_fd = open(item2,O_CREAT | O_NOCTTY |
|
Line 643... |
Line 654... |
{
|
{
|
perror(item2[0]?item2:"stdout");
|
perror(item2[0]?item2:"stdout");
|
trace_fd = 0;
|
trace_fd = 0;
|
}
|
}
|
}
|
}
|
|
if(!trace_fd && strlen(item3))
|
|
printf("Syntax error on trace: \"%s\" unexpected\n",item3);
|
|
else
|
|
for(s = item3;s && *s; s = q)
|
|
{
|
|
if(q = strchr(s,','))
|
|
*q++ = '\0';
|
|
|
|
if(strlen(s) < 4 && (s[0] == 'r' || s[0] == 'R') &&
|
|
isdigit(s[1]) && (isdigit(s[2]) || !s[2]))
|
|
trace_reg[atoi(&s[1])] = 1;
|
|
else
|
|
printf("Syntax error in format: \"%s\" not a valid register\n",s);
|
|
}
|
|
|
} else
|
} else
|
if (strcmp(item1, "stats") == 0) { /* stats */
|
if (strcmp(item1, "stats") == 0) { /* stats */
|
char item2[20];
|
char item2[20];
|
int i = 0;
|
int i = 0;
|
|
|
Line 701... |
Line 727... |
decode_execute(&iqueue[0],trace_fd);
|
decode_execute(&iqueue[0],trace_fd);
|
if(trace_fd)
|
if(trace_fd)
|
{
|
{
|
char sTemp[256];
|
char sTemp[256];
|
char sTemp2[256];
|
char sTemp2[256];
|
|
char reg_value[16];
|
unsigned long value;
|
unsigned long value;
|
|
int first_register = 1;
|
|
int i;
|
extern char *disassembled;
|
extern char *disassembled;
|
extern unsigned long reg[];
|
extern unsigned long reg[];
|
|
|
/* The objects passed to the
|
value = (mem[0x0c].data << 24) +
|
trace command should not be
|
(mem[0x0d].data << 16) +
|
hardcoded like this...instead
|
(mem[0x0e].data << 8)
|
what to dump should be passed
|
+ mem[0x0f].data;
|
on the command line.
|
|
|
|
FIX THIS LATER...
|
|
*/
|
|
value = (mem[0x306bc].data << 24) +
|
|
(mem[0x306bd].data << 16) +
|
|
(mem[0x306be].data << 8)
|
|
+ mem[0x306bf].data;
|
|
|
|
|
#if 0
|
sprintf(sTemp,"0x%06x: %s",addr,disassembled);
|
sprintf(sTemp,"0x%06x: %s",addr,disassembled);
|
memset(sTemp2,' ',sizeof(sTemp2));
|
memset(sTemp2,' ',80);
|
strncpy(sTemp2,sTemp,strlen(sTemp));
|
strncpy(sTemp2,sTemp,strlen(sTemp));
|
sprintf(&sTemp2[40],"<0x%08x,0x%08x> [0x%08x]\n",
|
|
reg[3],reg[4],value);
|
sTemp[0] = '\0';
|
|
sTemp2[78] = '\0';
|
|
for(i=0;i<32;i++)
|
|
if(trace_reg[i])
|
|
{
|
|
sprintf(reg_value,"%c0x%08x",first_register?'<':',',
|
|
reg[i]);
|
|
strcat(sTemp,reg_value);
|
|
first_register = 0;
|
|
}
|
|
if(!first_register)
|
|
sprintf(&sTemp2[40],"%s>\n",sTemp);
|
|
#endif
|
|
sprintf(sTemp2,"0x%06x: %s <0x%08x>\n",addr,disassembled,value);
|
write(trace_fd,sTemp2,strlen(sTemp2));
|
write(trace_fd,sTemp2,strlen(sTemp2));
|
}
|
}
|
update_pc();
|
update_pc();
|
analysis();
|
analysis();
|
if (!hush)
|
if (!hush)
|