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

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0_rc2/] [or1ksim/] [toplevel.c] - Blame information for rev 304

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 cvs
/* toplevel.c -- Top level simulator source file
2
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
3
 
4
This file is part of OpenRISC 1000 Architectural Simulator.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
 
20
/* Simulator commands. Help and version output. SIGINT processing.
21
Stdout redirection is specific to linux (I need to fix this). */
22
 
23 16 jrydberg
#include "config.h"
24
 
25 2 cvs
#include <stdio.h>
26
#include <ctype.h>
27
#include <string.h>
28
#include <stdlib.h>
29 46 lampret
#include <unistd.h>
30 2 cvs
#include <signal.h>
31
#include <stdarg.h>
32 123 markom
#include <fcntl.h>
33 2 cvs
 
34 16 jrydberg
#ifdef HAVE_LIBREADLINE
35 7 jrydberg
#include <readline/readline.h>
36
#include <readline/history.h>
37 16 jrydberg
#endif /* HAVE_LIBREADLINE */
38 7 jrydberg
 
39 2 cvs
#include "arch.h"
40
#include "parse.h"
41
#include "abstract.h"
42 261 markom
#include "labels.h"
43 2 cvs
#include "trace.h"
44
#include "execute.h"
45 69 lampret
#include "sim-config.h"
46 103 lampret
#include "spr_defs.h"
47 212 erez
#include "dma.h"
48 304 markom
#include "vapi.h"
49 2 cvs
 
50 28 lampret
#include "coff.h"
51
 
52 304 markom
#include "gdbcomm.h"
53 127 chris
 
54 2 cvs
/* CVS revision number. */
55 304 markom
const char rcsrev[] = "$Revision: 1.38 $";
56 2 cvs
 
57
/* Continuos run versus single step tracing switch. */
58
int cont_run;
59
 
60
/* History of execution */
61
int histexec[HISTEXEC_LEN];
62
 
63 7 jrydberg
char *sim_commands [] = {
64
  "q",
65
  "t",
66
  "help",
67 21 cmchen
  "de",
68 7 jrydberg
  "dm",
69
  "run",
70
  "pr",
71
  "pm",
72
  "pc",
73 18 lampret
  "reset",
74
  "break",
75 7 jrydberg
  "hist",
76
  "stats",
77 181 chris
  "stall"
78 7 jrydberg
  "info",
79
  "r",
80 54 lampret
  "dv",
81 7 jrydberg
 
82
};
83
 
84 167 markom
inline void debug(const char *format, ...)
85 2 cvs
{
86 7 jrydberg
  char *p;
87
  va_list ap;
88 2 cvs
 
89 264 markom
  if (config.sim.debug) {
90 69 lampret
    if ((p = malloc(1000)) == NULL)
91
      return;
92
    va_start(ap, format);
93
    (void) vsnprintf(p, 1000, format, ap);
94
    va_end(ap);
95
    printf("%s\n", p);
96
    fflush(stdout);
97
    free(p);
98
  } else {
99
#if DEBUG
100 7 jrydberg
  if ((p = malloc(1000)) == NULL)
101
    return;
102
  va_start(ap, format);
103
  (void) vsnprintf(p, 1000, format, ap);
104
  va_end(ap);
105
  printf("%s\n", p);
106
  fflush(stdout);
107
  free(p);
108 2 cvs
#endif
109 69 lampret
  }
110 2 cvs
}
111
 
112 304 markom
void ctrl_c(signum)
113 7 jrydberg
     int signum;
114 2 cvs
{
115 181 chris
  extern int cpu_stalled;  /* CZ from debug_interface */
116
  cont_run = cpu_stalled ? 0 : 1;
117 264 markom
  config.sim.iprompt = 1;
118 181 chris
  cpu_stalled = 0;
119 7 jrydberg
  signal(SIGINT, ctrl_c);
120 2 cvs
}
121
 
122 304 markom
void version()
123 2 cvs
{
124 7 jrydberg
        printf ("\n");
125 18 lampret
        printf ("OpenRISC 1000 (OR16+OR32) Architectural Simulator, %s\n", rcsrev);
126
        printf ("Copyright (C) 1999 Damjan Lampret, lampret@opencores.org\n");
127
        printf ("Copyright (C) 2000 Damjan Lampret, lampret@opencores.org\n");
128 21 cmchen
        printf ("                   Jimmy Chen-Min Chen, jimmy@ee.nctu.edu.tw\n");
129 18 lampret
        printf ("                   Johan Rydberg, johan.rydberg@insight.se\n");
130 264 markom
        printf ("                   Marko Mlinar, markom@opencores.org\n");
131
  printf ("Copyright (C) 2001 Simon Srot, simons@opencores.org\n");
132
  printf ("                   Marko Mlinar, markom@opencores.org\n");
133 7 jrydberg
        printf ("Visit http://www.opencores.org for more information about ");
134
        printf ("OpenRISC 1000 and\nother open source cores.\n\n");
135
        printf ("This software comes with ABSOLUTELY NO WARRANTY; for ");
136
        printf ("details see COPYING.\nThis is free software, and you ");
137
        printf ("are welcome to redistribute it under certain\nconditions; ");
138
        printf ("for details see COPYING.\n");
139 2 cvs
}
140
 
141 7 jrydberg
void
142
help()
143 2 cvs
{
144
        printf("q                        - quit simulator\n");
145
        printf("r                        - display all registers\n");
146
        printf("t                        - execute next instruction\n");
147
        printf("run <cycles> [<hush>]    - execute <cycles> instructions, no reg dump if hush\n");
148
        printf("pr <r> <value>           - patch register <r> with <value>\n");
149
        printf("dm <fromaddr> [<toaddr>] - display memory from <fromaddr> to <toaddr>\n");
150 257 erez
        printf("de <fromaddr> [<toaddr>] - debug insn memory\n");
151 2 cvs
        printf("pm <addr> <value>        - patch memory location <addr> with <value>\n");
152
        printf("pc <value>               - patch PC register with <value>\n");
153 18 lampret
        printf("break <addr>             - toggle breakpoint at address <addr>\n");
154
        printf("reset                    - simulator reset\n");
155 2 cvs
        printf("hist                     - execution history\n");
156 181 chris
        printf("stall                    - stalls the processor and gives control to the debugger\n");
157 6 lampret
        printf("stats <num|clear>        - execution statistics num or clear it.\n");
158
        printf("info                     - configuration info (caches etc.)\n");
159 54 lampret
        printf("dv <fromaddr> [<toaddr>] [<modname>] - dumps memory as verilog (use redirect)\n");
160 86 lampret
        printf("dh <fromaddr> [<toaddr>] - dumps memory as hex code (use redirect)\n");
161 2 cvs
        printf("<cmd> > <filename>       - redirect simulator stdout to <filename> (and not emulated printf)\n");
162 69 lampret
        printf("debug                    - toggles simulator debug mode\n");
163 2 cvs
        printf("help                     - available commands (this list)\n");
164
}
165
 
166 257 erez
void debugmem( unsigned long from, unsigned long to );
167 21 cmchen
 
168 304 markom
/* Initalizes all devices and sim */
169
void sim_init ()
170 2 cvs
{
171 269 markom
  init_labels();
172
  init_breakpoints();
173
        initstats();
174
        build_automata();
175
 
176
  if(GDB_ENABLED) {
177
    serverPort = config.debug.server_port;
178
    if(server_fd = GetServerSocket("or1ksim","tcp",serverPort))
179
            printf("JTAG Proxy server started on port %d\n",serverPort);
180
  }
181 123 markom
 
182 264 markom
  if(config.sim.profile) {
183 294 markom
    config.sim.fprof = fopen(config.sim.prof_fn, "wt+");
184 264 markom
    if(!config.sim.fprof) {
185
      config.sim.profile = 0;
186 294 markom
      fprintf(stderr, "WARNING: Problems opening profile file. Profiling disabled. \n");
187 173 markom
    } else
188 264 markom
      fprintf(config.sim.fprof, "+00000000 FFFFFFFF FFFFFFFF main\n");
189 173 markom
  }
190 294 markom
 
191
  if (config.sim.exe_log) {
192
    config.sim.fexe_log = fopen(config.sim.exe_log_fn, "wt+");
193
    if(!config.sim.fexe_log) {
194
      config.sim.exe_log = 0;
195
      printf("WARNING: Problems opening exe_log file. Execution logging disabled. \n");
196
    }
197
  }
198 263 markom
 
199 262 markom
  /* Initialize memory */
200
  {
201 221 markom
          extern struct dev_memarea *dev_list;
202
          int i;
203 269 markom
          if (config.memory.type == MT_RANDOM) {
204 221 markom
                  unsigned int val = 0;
205 123 markom
 
206 262 markom
      if (config.memory.random_seed == -1) {
207
        config.memory.random_seed = time(NULL);
208
        /* Print out the seed just in case we ever need to debug */
209
                    printf("Seeding random generator with value %d\n", config.memory.random_seed);
210
                  }
211
                  srandom(config.memory.random_seed);
212
 
213 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
214
        for(i = 0; i < cur_area->size; i++) {
215
          val = random();
216 262 markom
          setsim_mem8(i + cur_area->addr_compare, val & 0xFF);
217 221 markom
        }
218 262 markom
    } else if(config.memory.type == MT_PATTERN) {
219 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
220
        for(i = 0; i < cur_area->size; i++)
221 262 markom
          setsim_mem8(i + cur_area->addr_compare, config.memory.pattern);
222 269 markom
    } else if (config.memory.type != MT_UNKNOWN) {
223 262 markom
      fprintf(stderr, "Invalid memory configuration type.\n");
224
            exit(1);
225 221 markom
    }
226 242 markom
  }
227 262 markom
 
228
        if(config.filename) {
229 304 markom
          unsigned long endaddr = 0xFFFFFFFF;
230 262 markom
          endaddr = loadcode(config.filename, 0, 0); /* MM170901 always load at address zero.  */
231
          if (endaddr == -1) {
232
            fprintf(stderr, "Problems loading boot code.\n");
233
            exit(1);
234
          }
235
        }
236 269 markom
 
237
        /* Disable gdb debugging, if debug module is not available.  */
238
        if (!config.debug.enabled)
239
          config.debug.gdb_enabled = 0;
240 221 markom
 
241 30 lampret
        uart_reset();
242 212 erez
        dma_reset();
243 257 erez
        eth_reset();
244 92 lampret
        tick_reset();
245 103 lampret
        pm_reset();
246 242 markom
        pic_reset();
247 261 markom
        mc_reset();
248 2 cvs
        reset();
249 304 markom
}
250 7 jrydberg
 
251 304 markom
/* Display info about various modules */
252
void sim_info () {
253
  itlb_status(-1);
254
        dtlb_status(-1);
255
        ic_info();
256
        dc_info();
257
        sprs_status();
258
 
259
        if (config.cpu.bpb) bpb_info();
260
        if (config.cpu.btic) btic_info();
261
        if (config.uarts_enabled) uart_status();
262
        if (config.dmas_enabled) dma_status();
263
        if (config.ethernets_enabled) eth_status();
264
}
265
 
266
/* Cleanup */
267
void sim_done ()
268
{
269
  if (config.sim.profile) {
270
    extern int cycles;
271
    fprintf(config.sim.fprof,"-%08X FFFFFFFF\n", cycles);
272
    fclose(config.sim.fprof);
273
  }
274
  if (config.sim.exe_log)   fclose(config.sim.fexe_log);
275
  if (config.vapi.enabled)  vapi_done ();
276
  exit(0);
277
}
278
 
279
int main(argc, argv)
280
     int argc;
281
     char *argv[];
282
{
283
        char *linestr;
284
        char item1[500], b2[500], prev_str[500] = "";
285
        char *redirstr;
286
        int hush = 0;
287
        int first_prompt = 1;
288
        int trace_fd = 0;
289
 
290
        srand(getpid());
291
        init_defconfig();
292
        if (parse_args(argc, argv)) {
293
                printf("Usage: %s [options] <filename>\n", argv[0]);
294
                printf("Options:\n");
295
                printf(" -v                 version and copyright note\n");
296
                printf(" -i                 enable interactive command prompt\n");
297
                printf(" -f or --file       change script file [sim.cfg]\n");
298
                printf(" --nosrv            do not launch JTAG proxy server\n"); /* (CZ) */
299
                printf(" --srv <n>          launch JTAG proxy server on port <n>; [random]\n"); /* (CZ) */
300
                printf(" --profile          enable profiling\n");
301
                exit(-1);
302
        }
303
 
304
#ifdef HAVE_LIBREADLINE
305
  initialize_readline ();       /* Bind our completer. */
306
#endif
307
 
308
  /* Read configuration file.  */
309
  read_script_file(config.script_file);
310
  print_config();
311
  signal(SIGINT, ctrl_c);
312
  sim_init ();
313
 
314 103 lampret
        while(1) {
315 264 markom
                if (config.sim.iprompt) {
316 304 markom
                  if (GDB_ENABLED && server_fd)
317 123 markom
                    {
318
                      printf ("(sim) ");
319
                      fflush(stdout);
320
                      HandleServerSocket(true);  /* block & check_stdin = true */
321
                    }
322 16 jrydberg
#ifdef HAVE_LIBREADLINE
323 123 markom
                  /* Must disable readline in new mode. It isn't compatible
324
                     with non blocking environments */
325
                  if(!server_fd)
326
                    linestr = readline("(sim) ");
327
                  else
328
                    linestr = fgets(b2, sizeof b2, stdin);
329 16 jrydberg
#else
330 123 markom
                  if(!server_fd)
331
                    printf ("(sim) ");
332
                  linestr = fgets(b2, sizeof b2, stdin);
333 16 jrydberg
#endif
334 103 lampret
                } else
335 173 markom
                        strcpy(linestr = b2, "run -1 hush");
336 7 jrydberg
 
337 103 lampret
                if (!linestr)
338
                        break;
339
                linestr = stripwhite (linestr);
340 7 jrydberg
 
341 16 jrydberg
#ifdef HAVE_LIBREADLINE
342 123 markom
                /* Readline only works in the old mode */
343
                if(!server_fd)
344
                  {
345
                    if (strlen(linestr) == 0) {
346
                      char *l = repeat_last_command ();
347
 
348
                      if (l) {
349
                        free (linestr);
350
                        linestr = l;
351
                      }
352
                    }
353
 
354
                    if (*linestr) {
355
                      add_history (linestr);
356
                    }
357
                  }
358 16 jrydberg
#endif /* HAVE_LIBREADLINE */
359 2 cvs
 
360 103 lampret
                if (redirstr = strstr(linestr, ">")) {
361
                        *redirstr = '\0';
362
                        strtoken(&redirstr[1], item1, 1);
363
                        freopen(item1, "w+", stdout);
364
                }
365 2 cvs
 
366 167 markom
                if (linestr[0] == '\n')
367
                  strcpy (linestr, &prev_str[0]);
368
                else
369
                  strcpy (&prev_str[0], linestr);
370
 
371 2 cvs
                strtoken(linestr, item1, 1);
372 167 markom
                if (strcmp(item1, "q") == 0) {   /* quit */
373
                  printf ("\n");
374 304 markom
                  sim_done ();
375 167 markom
                } else
376 2 cvs
                if (strcmp(item1, "help") == 0)  /* help */
377
                        help();
378
                else
379
                if (strcmp(item1, "t") == 0) {   /* trace */
380
                        cont_run = 1;
381
                } else
382
                if (strcmp(item1, "dm") == 0) {  /* dump memory */
383
                        char item2[20];
384
                        char item3[20];
385
                        static int from = 0, to = 0;
386
 
387
                        strtoken(linestr, item2, 2);
388
                        strtoken(linestr, item3, 3);
389
 
390
                        if (strlen(item2)) {
391
                                if (item2[0] == '_')
392
                                        from = eval_label(item2);
393
                                else
394
                                        from = strtoul(item2, NULL, 0);
395
                                to = from + 0x40;
396
                        }
397
                        if (strlen(item3))
398
                                to = strtoul(item3, NULL, 0);
399 167 markom
                        dumpmemory(from, to, 0);
400 54 lampret
                        printf("\n");
401 2 cvs
                } else
402 54 lampret
                if (strcmp(item1, "dv") == 0) {/* dump memory as verilog*/
403
                        char item2[20];
404
                        char item3[20];
405
                        char item4[20];
406
                        static int from = 0, to = 0;
407
 
408
                        strtoken(linestr, item2, 2);
409
                        strtoken(linestr, item3, 3);
410
                        strtoken(linestr, item4, 4);
411
 
412
                        if (strlen(item2)) {
413
                                if (item2[0] == '_')
414
                                        from = eval_label(item2);
415
                                else
416
                                        from = strtoul(item2, NULL, 0);
417
                                to = from + 0x40;
418
                        }
419
                        if (strlen(item3))
420
                                to = strtoul(item3, NULL, 0);
421
                        if (!strlen(item4))
422
                                strcpy(item4, "or1k_mem");
423
                        dumpverilog(item4, from, to);
424
                        printf("\n");
425
                } else
426 86 lampret
                if (strcmp(item1, "dh") == 0) {/* dump memory as hex*/
427
                        char item2[20];
428
                        char item3[20];
429
                        static int from = 0, to = 0;
430
 
431
                        strtoken(linestr, item2, 2);
432
                        strtoken(linestr, item3, 3);
433
 
434
                        if (strlen(item2)) {
435
                                if (item2[0] == '_')
436
                                        from = eval_label(item2);
437
                                else
438
                                        from = strtoul(item2, NULL, 0);
439
                                to = from + 0x40;
440
                        }
441
                        if (strlen(item3))
442
                                to = strtoul(item3, NULL, 0);
443
                        dumphex(from, to);
444
                        printf("\n");
445
                } else
446 2 cvs
                if (strcmp(item1, "pm") == 0) {  /* patch memory */
447
                        char item2[20];
448
                        char item3[20];
449
                        static int addr = 0;
450 123 markom
                        int breakpoint = 0;
451
 
452 2 cvs
                        strtoken(linestr, item2, 2);
453
                        strtoken(linestr, item3, 3);
454
                        if (strlen(item2))
455
                                if (item2[0] == '_')
456
                                        addr = eval_label(item2);
457
                                else
458
                                        addr = strtoul(item2, NULL, 0);
459 123 markom
                        set_mem32(addr, strtoul(item3, NULL, 0), &breakpoint);
460 2 cvs
                } else
461
                if (strcmp(item1, "pr") == 0) {  /* patch regs */
462
                        char item2[20];
463
                        char item3[20];
464
 
465
                        strtoken(linestr, item2, 2);
466
                        strtoken(linestr, item3, 3);
467 138 markom
                        set_reg32(strtoul(item2, NULL,0), strtoul(item3, NULL, 0));
468 2 cvs
                } else
469
                if (strcmp(item1, "pc") == 0) {  /* patch PC */
470
                        char item2[20];
471
 
472
                        strtoken(linestr, item2, 2);
473 86 lampret
                        pcnext = strtoul(item2, NULL, 0);
474 2 cvs
                } else
475 7 jrydberg
                if (strcmp(item1, "break") == 0) {       /* set/clear breakpoint */
476 2 cvs
                        char item2[20];
477
 
478
                        strtoken(linestr, item2, 2);
479
                        set_insnbrkpoint(strtoul(item2, NULL, 0));
480
                } else
481
                if (strcmp(item1, "r") == 0) {   /* dump regs */
482
                        dumpreg();
483
                } else
484 21 cmchen
                if (strcmp(item1, "de") == 0) {  /* reset simulator */
485 257 erez
                        char item2[20];
486
                        char item3[20];
487
                        static int from = 0, to = 0;
488
 
489
                        strtoken(linestr, item2, 2);
490
                        strtoken(linestr, item3, 3);
491
 
492
                        if (strlen(item2)) {
493
                                if (item2[0] == '_')
494
                                        from = eval_label(item2);
495
                                else
496
                                        from = strtoul(item2, NULL, 0);
497
                                to = from + 0x40;
498
                        }
499
                        if (strlen(item3))
500
                                to = strtoul(item3, NULL, 0);
501
                        debugmem(from, to);
502
                        printf("\n");
503 21 cmchen
                } else
504 18 lampret
                if (strcmp(item1, "reset") == 0) {       /* reset simulator */
505 30 lampret
                        uart_reset();
506 212 erez
                        dma_reset();
507 257 erez
                        eth_reset();
508 92 lampret
                        tick_reset();
509 103 lampret
                        pm_reset();
510
                        pic_reset();
511 123 markom
                        reset(); /* Old or new mode */
512 18 lampret
                } else
513 69 lampret
                if (strcmp(item1, "debug") == 0) {       /* debug mode */
514 264 markom
                        config.sim.debug ^= 1;
515 69 lampret
                } else
516 2 cvs
                if (strcmp(item1, "hist") == 0) {        /* dump history */
517
                        int i;
518
                        for(i = HISTEXEC_LEN; i; i--)
519 167 markom
                                dumpmemory(histexec[i - 1], histexec[i - 1] + 4, 1);
520 46 lampret
                        printf("\n");
521 2 cvs
                } else
522
                if (strcmp(item1, "run") == 0) { /* run */
523
                        char item2[20];
524
                        char item3[20];
525
 
526
                        strtoken(linestr, item2, 2);
527
                        strtoken(linestr, item3, 3);
528
                        if (strcmp(item3, "hush") == 0)
529
                                hush = 1;
530
                        else
531
                                hush = 0;
532 173 markom
                        cont_run = strtol(item2, NULL, 0);
533 2 cvs
                } else
534 181 chris
                if(!strcmp(item1, "stall")) { /* Added by CZ 210801 */
535
                  extern int cpu_stalled;  /* CZ from debug_interface */
536
                  cpu_stalled = 1;
537 264 markom
                  config.sim.iprompt = 0;
538 181 chris
                  cont_run = -1;
539
                  hush = 1;
540
                } else
541
                if (!strcmp(item1, "trace")) { /* Added by CZ 210801 */
542
                  char item2[256];
543 221 markom
 
544 181 chris
                  strtoken(linestr, item2, 2);
545
                  if(trace_fd)
546
                    {
547
                      close(trace_fd);
548
                      trace_fd = 0;
549
                    }
550
                  if(strcmp(item2,"off")) /* if we're not being turned off */
551
                    {
552
                      if(item2[0])
553
                        trace_fd = open(item2,O_CREAT | O_NOCTTY |
554
                                        O_TRUNC | O_WRONLY, 0644);
555
                      else
556
                        trace_fd = dup(1);
557
                      if(trace_fd < 0)
558
                        {
559
                          perror(item2[0]?item2:"stdout");
560
                          trace_fd = 0;
561
                        }
562
                    }
563
                } else
564 2 cvs
                if (strcmp(item1, "stats") == 0) { /* stats */
565 6 lampret
                        char item2[20];
566
                        int i = 0;
567
 
568
                        strtoken(linestr, item2, 2);
569
                        if (strcmp(item2, "clear") == 0) {
570
                                initstats();
571
                                printf("Cleared.\n");
572
                        } else {
573
                                i = strtoul(item2, NULL, 0);
574
                                printstats(i);
575
                        }
576
                } else
577 304 markom
                if (strcmp(item1, "info") == 0) /* configuration info */
578
                        sim_info ();
579
                else
580 103 lampret
                        printf("%s: Unknown command.\n", linestr);
581
 
582 304 markom
 
583 138 markom
                /* MM: 'run -1' means endless execution.  */
584
                while(cont_run != 0) {
585 261 markom
                  int debug_slowdown = DEBUG_SLOWDOWN;
586 123 markom
                  extern int cycle_delay;  /* Added by CZ 27/05/01. Set during exception. */
587 127 chris
                  extern int cpu_stalled;  /* CZ from debug_interface */
588 123 markom
 
589 294 markom
      if (cpu_stalled)
590
                    if(GDB_ENABLED) {
591
                BlockJTAG();
592
                HandleServerSocket(false);
593
                continue;
594
              } else
595
                fprintf (stderr, "WARNING: CPU stalled and gdb connection not enabled.");
596 127 chris
 
597 261 markom
      if (!testsprbits(SPR_PMR, SPR_PMR_DME | SPR_PMR_SME)) {
598 304 markom
        if(cycle_delay <= 0) {
599
          unsigned int addr;
600
          if (cont_run > 0) cont_run--;
601
          if(fetch()) {
602
            cont_run = 0; /* memory breakpoint encountered */
603
            break;
604
          }
605
          addr = iqueue[0].insn_addr;
606
 
607
          /* If trace_fd is non zero, we want
608
             to make sure that disassemble is called */
609 181 chris
 
610 304 markom
          decode_execute(&iqueue[0],trace_fd);
611
          if(trace_fd) {
612
            char sTemp[256];
613
            char sTemp2[256];
614
            unsigned long value;
615
            extern char *disassembled;
616
            extern unsigned long reg[];
617 181 chris
 
618 304 markom
            /* The objects passed to the
619
               trace command should not be
620
               hardcoded like this...instead
621
               what to dump should be passed
622
               on the command line.
623 181 chris
 
624 304 markom
               FIX THIS LATER...
625
            */
626
            value = (evalsim_mem8(0x306bc) << 24) +
627
              (evalsim_mem8(0x306bd) << 16) +
628
              (evalsim_mem8(0x306be) << 8)
629
              + evalsim_mem8(0x306bf);
630 221 markom
 
631 304 markom
            sprintf(sTemp,"0x%06x: %s",addr,disassembled);
632
            memset(sTemp2,' ',sizeof(sTemp2));
633
            strncpy(sTemp2,sTemp,strlen(sTemp));
634
            sprintf(&sTemp2[40],"<0x%08x,0x%08x> [0x%08x]\n",
635
                    reg[3],reg[4],value);
636
            write(trace_fd,sTemp2,strlen(sTemp2));
637 261 markom
          }
638 304 markom
          update_pc();
639
          analysis();
640
          if (!hush)
641
            dumpreg();
642
        } else
643 261 markom
          cycle_delay--;
644 123 markom
 
645 261 markom
        pic_clock();
646
        dc_clock();
647
        ic_clock();
648 304 markom
        if (!testsprbits(SPR_PMR, SPR_PMR_SME)) tick_clock();
649 261 markom
      }
650 304 markom
 
651 261 markom
      pm_clock();
652 304 markom
      if (config.uarts_enabled) uart_clock();
653
      if (config.dmas_enabled) dma_clock();
654
      if (config.ethernets_enabled) eth_clock();
655
      if (config.sim.exe_log) dump_exe_log();
656
      if (config.vapi.enabled) vapi_check();
657 269 markom
      if (GDB_ENABLED && debug_slowdown-- == 0) {
658 261 markom
        debug_slowdown = DEBUG_SLOWDOWN;
659
                          HandleServerSocket(false); /* block & check_stdin = false */
660 103 lampret
                        }
661 2 cvs
                }
662
                hush = 0;
663
                fflush(stdout);
664
                freopen("/dev/fd/0", "w+", stdout);
665
 
666 304 markom
                if (!config.sim.iprompt)        /* non-interactive quit */
667
                  sim_done();
668
 
669 16 jrydberg
#ifdef HAVE_LIBREADLINE
670 103 lampret
                if (linestr)
671
                        free (linestr);
672 16 jrydberg
#endif
673 7 jrydberg
 
674 2 cvs
        }
675 304 markom
        sim_done();
676 2 cvs
}
677 7 jrydberg
 
678 16 jrydberg
#ifdef HAVE_LIBREADLINE
679 7 jrydberg
char *command_generator ();
680
char **sim_completion ();
681
 
682
/* Tell the GNU readline library how to complete.  We want to try to complete
683
   on command names if this is the first word in the line, or on filenames
684
   if not. */
685
void initialize_readline ()
686
{
687
  /* Allow conditional parsing of the ~/.inputrc file. */
688
  rl_readline_name = "or1ksim";
689
 
690
  /* Tell the completer that we want a crack first. */
691
  rl_attempted_completion_function = (CPPFunction *)sim_completion;
692
}
693
 
694
/* Attempt to complete on the contents of TEXT.  START and END bound the
695
   region of rl_line_buffer that contains the word to complete.  TEXT is
696
   the word to complete.  We can use the entire contents of rl_line_buffer
697
   in case we want to do some simple parsing.  Return the array of matches,
698
   or NULL if there aren't any. */
699
char **
700
sim_completion (text, start, end)
701
     char *text;
702
     int start, end;
703
{
704
  char **matches;
705
 
706
  matches = (char **)NULL;
707
 
708
  /* If this word is at the start of the line, then it is a command
709
     to complete.  Otherwise it is the name of a file in the current
710
     directory. */
711
  if (start == 0)
712
    matches = completion_matches (text, command_generator);
713
 
714
  return (matches);
715
}
716
 
717
/* Generator function for command completion.  STATE lets us know whether
718
   to start from scratch; without any state (i.e. STATE == 0), then we
719
   start at the top of the list. */
720
char *
721
command_generator (text, state)
722
     char *text;
723
     int state;
724
{
725
  static int list_index, len;
726
  char *name;
727
 
728
  /* If this is a new word to complete, initialize now.  This includes
729
     saving the length of TEXT for efficiency, and initializing the index
730
     variable to 0. */
731
  if (!state)
732
    {
733
      list_index = 0;
734
      len = strlen (text);
735
    }
736
 
737
  /* Return the next name which partially matches from the command list. */
738
  while (name = sim_commands[list_index])
739
    {
740
      list_index++;
741
 
742
      if (strncmp (name, text, len) == 0)
743
        return (dupstr(name));
744
    }
745
 
746
  /* If no names matched, then return NULL. */
747
  return ((char *)NULL);
748
}
749
 
750
/* Repeats the last command.  */
751
char *
752
repeat_last_command ()
753
{
754
  int offset = where_history ();
755
  HIST_ENTRY *hist;
756
 
757
  if (hist = history_get (offset))
758
    {
759
      return dupstr (hist->line);
760
    }
761
  return 0;
762
}
763 16 jrydberg
 
764
#endif
765
 
766 138 markom
extern char *disassembled;
767 257 erez
void debugmem( unsigned long from, unsigned long to )
768
{
769 138 markom
  int i;
770
  printf("starting to dump mem...\n");
771 257 erez
  for(i=from; i<to; ) {
772 261 markom
    struct label_entry *entry;
773 221 markom
    unsigned int _insn;
774 261 markom
    printf("i=%x :: ", i);
775
 
776
    if (verify_memoryarea(i) && (entry = get_label(i)))
777
      printf("label: %s |", entry->name);
778 221 markom
 
779
    iqueue[0].insn = _insn = evalsim_mem32(i);
780
    iqueue[0].insn_index = insn_decode(_insn);
781
    disassemble_insn (_insn);
782
    printf("%08x %s\n", _insn, disassembled);
783 257 erez
                i += insn_len( iqueue[0].insn_index );
784 138 markom
  }
785 21 cmchen
}

powered by: WebSVN 2.1.0

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