OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0_rc2/] [or1ksim/] [toplevel.c] - Diff between revs 181 and 206

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 181 Rev 206
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)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.