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 331

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 331 markom
const char rcsrev[] = "$Revision: 1.41 $";
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 306 markom
  if (GDB_ENABLED)
177
    gdbcomm_init ();
178
 
179 305 markom
  if (config.sim.profile) {
180 294 markom
    config.sim.fprof = fopen(config.sim.prof_fn, "wt+");
181 264 markom
    if(!config.sim.fprof) {
182
      config.sim.profile = 0;
183 294 markom
      fprintf(stderr, "WARNING: Problems opening profile file. Profiling disabled. \n");
184 173 markom
    } else
185 264 markom
      fprintf(config.sim.fprof, "+00000000 FFFFFFFF FFFFFFFF main\n");
186 173 markom
  }
187 294 markom
 
188
  if (config.sim.exe_log) {
189
    config.sim.fexe_log = fopen(config.sim.exe_log_fn, "wt+");
190
    if(!config.sim.fexe_log) {
191
      config.sim.exe_log = 0;
192
      printf("WARNING: Problems opening exe_log file. Execution logging disabled. \n");
193
    }
194
  }
195 263 markom
 
196 262 markom
  /* Initialize memory */
197
  {
198 221 markom
          extern struct dev_memarea *dev_list;
199
          int i;
200 269 markom
          if (config.memory.type == MT_RANDOM) {
201 221 markom
                  unsigned int val = 0;
202 123 markom
 
203 262 markom
      if (config.memory.random_seed == -1) {
204
        config.memory.random_seed = time(NULL);
205
        /* Print out the seed just in case we ever need to debug */
206
                    printf("Seeding random generator with value %d\n", config.memory.random_seed);
207
                  }
208
                  srandom(config.memory.random_seed);
209
 
210 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
211
        for(i = 0; i < cur_area->size; i++) {
212
          val = random();
213 262 markom
          setsim_mem8(i + cur_area->addr_compare, val & 0xFF);
214 221 markom
        }
215 262 markom
    } else if(config.memory.type == MT_PATTERN) {
216 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
217
        for(i = 0; i < cur_area->size; i++)
218 262 markom
          setsim_mem8(i + cur_area->addr_compare, config.memory.pattern);
219 269 markom
    } else if (config.memory.type != MT_UNKNOWN) {
220 262 markom
      fprintf(stderr, "Invalid memory configuration type.\n");
221
            exit(1);
222 221 markom
    }
223 242 markom
  }
224 262 markom
 
225
        if(config.filename) {
226 304 markom
          unsigned long endaddr = 0xFFFFFFFF;
227 262 markom
          endaddr = loadcode(config.filename, 0, 0); /* MM170901 always load at address zero.  */
228
          if (endaddr == -1) {
229
            fprintf(stderr, "Problems loading boot code.\n");
230
            exit(1);
231
          }
232
        }
233 269 markom
 
234
        /* Disable gdb debugging, if debug module is not available.  */
235 331 markom
        if (!config.debug.enabled) {
236 269 markom
          config.debug.gdb_enabled = 0;
237 331 markom
          if (config.sim.verbose)
238
            fprintf (stderr, "WARNING: Debug module not enabled, cannot start gdb.\n");
239
        }
240 305 markom
 
241 331 markom
        /* Enable dependency stats, if we want to do history analisis */
242
        if (config.cpu.history && !config.cpu.dependency) {
243
          config.cpu.dependency = 1;
244
          if (config.sim.verbose)
245
            fprintf (stderr, "WARNING: dependency stats must be enabled to do history analisis.\n");
246
        }
247
 
248 305 markom
        /* Start VAPI before device initialization.  */
249
        if (config.vapi.enabled) {
250
          vapi_init ();
251
          if (config.sim.verbose)
252
            printf ("VAPI started, waiting for clients.\n");
253
        }
254
 
255 30 lampret
        uart_reset();
256 212 erez
        dma_reset();
257 257 erez
        eth_reset();
258 92 lampret
        tick_reset();
259 103 lampret
        pm_reset();
260 242 markom
        pic_reset();
261 261 markom
        mc_reset();
262 2 cvs
        reset();
263 305 markom
 
264
        /* Wait till all test are connected.  */
265
        if (config.vapi.enabled) {
266
          int numu = vapi_num_unconnected ();
267
          if (numu) {
268
            printf ("\n");
269
            while (numu = vapi_num_unconnected ()) {
270
            printf ("\rWaiting for %i VAPI tests to connect.     ", numu);
271
            usleep (100);
272
            }
273
          }
274
          printf ("All devices connected                         \n");
275
        }
276 304 markom
}
277 7 jrydberg
 
278 304 markom
/* Display info about various modules */
279
void sim_info () {
280
  itlb_status(-1);
281
        dtlb_status(-1);
282
        ic_info();
283
        dc_info();
284
        sprs_status();
285
 
286
        if (config.cpu.bpb) bpb_info();
287
        if (config.cpu.btic) btic_info();
288
        if (config.uarts_enabled) uart_status();
289
        if (config.dmas_enabled) dma_status();
290
        if (config.ethernets_enabled) eth_status();
291
}
292
 
293
/* Cleanup */
294
void sim_done ()
295
{
296
  if (config.sim.profile) {
297
    extern int cycles;
298
    fprintf(config.sim.fprof,"-%08X FFFFFFFF\n", cycles);
299
    fclose(config.sim.fprof);
300
  }
301
  if (config.sim.exe_log)   fclose(config.sim.fexe_log);
302
  if (config.vapi.enabled)  vapi_done ();
303
  exit(0);
304
}
305
 
306
int main(argc, argv)
307
     int argc;
308
     char *argv[];
309
{
310
        char *linestr;
311
        char item1[500], b2[500], prev_str[500] = "";
312
        char *redirstr;
313
        int hush = 0;
314
        int first_prompt = 1;
315
        int trace_fd = 0;
316
 
317
        srand(getpid());
318
        init_defconfig();
319
        if (parse_args(argc, argv)) {
320
                printf("Usage: %s [options] <filename>\n", argv[0]);
321
                printf("Options:\n");
322
                printf(" -v                 version and copyright note\n");
323
                printf(" -i                 enable interactive command prompt\n");
324
                printf(" -f or --file       change script file [sim.cfg]\n");
325
                printf(" --nosrv            do not launch JTAG proxy server\n"); /* (CZ) */
326
                printf(" --srv <n>          launch JTAG proxy server on port <n>; [random]\n"); /* (CZ) */
327
                printf(" --profile          enable profiling\n");
328
                exit(-1);
329
        }
330
 
331
#ifdef HAVE_LIBREADLINE
332
  initialize_readline ();       /* Bind our completer. */
333
#endif
334
 
335
  /* Read configuration file.  */
336
  read_script_file(config.script_file);
337
  print_config();
338
  signal(SIGINT, ctrl_c);
339
  sim_init ();
340
 
341 103 lampret
        while(1) {
342 264 markom
                if (config.sim.iprompt) {
343 306 markom
                  if (GDB_ENABLED)
344 123 markom
                    {
345
                      printf ("(sim) ");
346
                      fflush(stdout);
347
                      HandleServerSocket(true);  /* block & check_stdin = true */
348
                    }
349 16 jrydberg
#ifdef HAVE_LIBREADLINE
350 123 markom
                  /* Must disable readline in new mode. It isn't compatible
351
                     with non blocking environments */
352 306 markom
                  if(!GDB_ENABLED)
353 123 markom
                    linestr = readline("(sim) ");
354
                  else
355
                    linestr = fgets(b2, sizeof b2, stdin);
356 16 jrydberg
#else
357 306 markom
                  if(!GDB_ENABLED)
358 123 markom
                    printf ("(sim) ");
359
                  linestr = fgets(b2, sizeof b2, stdin);
360 16 jrydberg
#endif
361 103 lampret
                } else
362 173 markom
                        strcpy(linestr = b2, "run -1 hush");
363 7 jrydberg
 
364 103 lampret
                if (!linestr)
365
                        break;
366
                linestr = stripwhite (linestr);
367 7 jrydberg
 
368 16 jrydberg
#ifdef HAVE_LIBREADLINE
369 123 markom
                /* Readline only works in the old mode */
370
                if(!server_fd)
371
                  {
372
                    if (strlen(linestr) == 0) {
373
                      char *l = repeat_last_command ();
374
 
375
                      if (l) {
376
                        free (linestr);
377
                        linestr = l;
378
                      }
379
                    }
380
 
381
                    if (*linestr) {
382
                      add_history (linestr);
383
                    }
384
                  }
385 16 jrydberg
#endif /* HAVE_LIBREADLINE */
386 2 cvs
 
387 103 lampret
                if (redirstr = strstr(linestr, ">")) {
388
                        *redirstr = '\0';
389
                        strtoken(&redirstr[1], item1, 1);
390
                        freopen(item1, "w+", stdout);
391
                }
392 2 cvs
 
393 167 markom
                if (linestr[0] == '\n')
394
                  strcpy (linestr, &prev_str[0]);
395
                else
396
                  strcpy (&prev_str[0], linestr);
397
 
398 2 cvs
                strtoken(linestr, item1, 1);
399 167 markom
                if (strcmp(item1, "q") == 0) {   /* quit */
400
                  printf ("\n");
401 304 markom
                  sim_done ();
402 167 markom
                } else
403 2 cvs
                if (strcmp(item1, "help") == 0)  /* help */
404
                        help();
405
                else
406
                if (strcmp(item1, "t") == 0) {   /* trace */
407
                        cont_run = 1;
408
                } else
409
                if (strcmp(item1, "dm") == 0) {  /* dump memory */
410
                        char item2[20];
411
                        char item3[20];
412
                        static int from = 0, to = 0;
413
 
414
                        strtoken(linestr, item2, 2);
415
                        strtoken(linestr, item3, 3);
416
 
417
                        if (strlen(item2)) {
418
                                if (item2[0] == '_')
419
                                        from = eval_label(item2);
420
                                else
421
                                        from = strtoul(item2, NULL, 0);
422
                                to = from + 0x40;
423
                        }
424
                        if (strlen(item3))
425
                                to = strtoul(item3, NULL, 0);
426 306 markom
                        dumpmemory(from, to, 0, 1);
427 54 lampret
                        printf("\n");
428 2 cvs
                } else
429 54 lampret
                if (strcmp(item1, "dv") == 0) {/* dump memory as verilog*/
430
                        char item2[20];
431
                        char item3[20];
432
                        char item4[20];
433
                        static int from = 0, to = 0;
434
 
435
                        strtoken(linestr, item2, 2);
436
                        strtoken(linestr, item3, 3);
437
                        strtoken(linestr, item4, 4);
438
 
439
                        if (strlen(item2)) {
440
                                if (item2[0] == '_')
441
                                        from = eval_label(item2);
442
                                else
443
                                        from = strtoul(item2, NULL, 0);
444
                                to = from + 0x40;
445
                        }
446
                        if (strlen(item3))
447
                                to = strtoul(item3, NULL, 0);
448
                        if (!strlen(item4))
449
                                strcpy(item4, "or1k_mem");
450
                        dumpverilog(item4, from, to);
451
                        printf("\n");
452
                } else
453 86 lampret
                if (strcmp(item1, "dh") == 0) {/* dump memory as hex*/
454
                        char item2[20];
455
                        char item3[20];
456
                        static int from = 0, to = 0;
457
 
458
                        strtoken(linestr, item2, 2);
459
                        strtoken(linestr, item3, 3);
460
 
461
                        if (strlen(item2)) {
462
                                if (item2[0] == '_')
463
                                        from = eval_label(item2);
464
                                else
465
                                        from = strtoul(item2, NULL, 0);
466
                                to = from + 0x40;
467
                        }
468
                        if (strlen(item3))
469
                                to = strtoul(item3, NULL, 0);
470
                        dumphex(from, to);
471
                        printf("\n");
472
                } else
473 2 cvs
                if (strcmp(item1, "pm") == 0) {  /* patch memory */
474
                        char item2[20];
475
                        char item3[20];
476
                        static int addr = 0;
477 123 markom
                        int breakpoint = 0;
478
 
479 2 cvs
                        strtoken(linestr, item2, 2);
480
                        strtoken(linestr, item3, 3);
481
                        if (strlen(item2))
482
                                if (item2[0] == '_')
483
                                        addr = eval_label(item2);
484
                                else
485
                                        addr = strtoul(item2, NULL, 0);
486 123 markom
                        set_mem32(addr, strtoul(item3, NULL, 0), &breakpoint);
487 2 cvs
                } else
488
                if (strcmp(item1, "pr") == 0) {  /* patch regs */
489
                        char item2[20];
490
                        char item3[20];
491
 
492
                        strtoken(linestr, item2, 2);
493
                        strtoken(linestr, item3, 3);
494 138 markom
                        set_reg32(strtoul(item2, NULL,0), strtoul(item3, NULL, 0));
495 2 cvs
                } else
496
                if (strcmp(item1, "pc") == 0) {  /* patch PC */
497
                        char item2[20];
498
 
499
                        strtoken(linestr, item2, 2);
500 86 lampret
                        pcnext = strtoul(item2, NULL, 0);
501 2 cvs
                } else
502 7 jrydberg
                if (strcmp(item1, "break") == 0) {       /* set/clear breakpoint */
503 2 cvs
                        char item2[20];
504
 
505
                        strtoken(linestr, item2, 2);
506
                        set_insnbrkpoint(strtoul(item2, NULL, 0));
507
                } else
508
                if (strcmp(item1, "r") == 0) {   /* dump regs */
509
                        dumpreg();
510
                } else
511 21 cmchen
                if (strcmp(item1, "de") == 0) {  /* reset simulator */
512 257 erez
                        char item2[20];
513
                        char item3[20];
514
                        static int from = 0, to = 0;
515
 
516
                        strtoken(linestr, item2, 2);
517
                        strtoken(linestr, item3, 3);
518
 
519
                        if (strlen(item2)) {
520
                                if (item2[0] == '_')
521
                                        from = eval_label(item2);
522
                                else
523
                                        from = strtoul(item2, NULL, 0);
524
                                to = from + 0x40;
525
                        }
526
                        if (strlen(item3))
527
                                to = strtoul(item3, NULL, 0);
528
                        debugmem(from, to);
529
                        printf("\n");
530 21 cmchen
                } else
531 18 lampret
                if (strcmp(item1, "reset") == 0) {       /* reset simulator */
532 30 lampret
                        uart_reset();
533 212 erez
                        dma_reset();
534 257 erez
                        eth_reset();
535 92 lampret
                        tick_reset();
536 103 lampret
                        pm_reset();
537
                        pic_reset();
538 123 markom
                        reset(); /* Old or new mode */
539 18 lampret
                } else
540 69 lampret
                if (strcmp(item1, "debug") == 0) {       /* debug mode */
541 264 markom
                        config.sim.debug ^= 1;
542 69 lampret
                } else
543 2 cvs
                if (strcmp(item1, "hist") == 0) {        /* dump history */
544
                        int i;
545
                        for(i = HISTEXEC_LEN; i; i--)
546 306 markom
                                dumpmemory(histexec[i - 1], histexec[i - 1] + 4, 1, 1);
547 46 lampret
                        printf("\n");
548 2 cvs
                } else
549
                if (strcmp(item1, "run") == 0) { /* run */
550
                        char item2[20];
551
                        char item3[20];
552
 
553
                        strtoken(linestr, item2, 2);
554
                        strtoken(linestr, item3, 3);
555
                        if (strcmp(item3, "hush") == 0)
556
                                hush = 1;
557
                        else
558
                                hush = 0;
559 173 markom
                        cont_run = strtol(item2, NULL, 0);
560 2 cvs
                } else
561 181 chris
                if(!strcmp(item1, "stall")) { /* Added by CZ 210801 */
562
                  extern int cpu_stalled;  /* CZ from debug_interface */
563
                  cpu_stalled = 1;
564 264 markom
                  config.sim.iprompt = 0;
565 181 chris
                  cont_run = -1;
566
                  hush = 1;
567
                } else
568
                if (!strcmp(item1, "trace")) { /* Added by CZ 210801 */
569
                  char item2[256];
570 221 markom
 
571 181 chris
                  strtoken(linestr, item2, 2);
572
                  if(trace_fd)
573
                    {
574
                      close(trace_fd);
575
                      trace_fd = 0;
576
                    }
577
                  if(strcmp(item2,"off")) /* if we're not being turned off */
578
                    {
579
                      if(item2[0])
580
                        trace_fd = open(item2,O_CREAT | O_NOCTTY |
581
                                        O_TRUNC | O_WRONLY, 0644);
582
                      else
583
                        trace_fd = dup(1);
584
                      if(trace_fd < 0)
585
                        {
586
                          perror(item2[0]?item2:"stdout");
587
                          trace_fd = 0;
588
                        }
589
                    }
590
                } else
591 2 cvs
                if (strcmp(item1, "stats") == 0) { /* stats */
592 6 lampret
                        char item2[20];
593
                        int i = 0;
594
 
595
                        strtoken(linestr, item2, 2);
596
                        if (strcmp(item2, "clear") == 0) {
597
                                initstats();
598
                                printf("Cleared.\n");
599
                        } else {
600
                                i = strtoul(item2, NULL, 0);
601
                                printstats(i);
602
                        }
603
                } else
604 304 markom
                if (strcmp(item1, "info") == 0) /* configuration info */
605
                        sim_info ();
606
                else
607 103 lampret
                        printf("%s: Unknown command.\n", linestr);
608
 
609 304 markom
 
610 138 markom
                /* MM: 'run -1' means endless execution.  */
611
                while(cont_run != 0) {
612 261 markom
                  int debug_slowdown = DEBUG_SLOWDOWN;
613 123 markom
                  extern int cycle_delay;  /* Added by CZ 27/05/01. Set during exception. */
614 127 chris
                  extern int cpu_stalled;  /* CZ from debug_interface */
615 123 markom
 
616 294 markom
      if (cpu_stalled)
617
                    if(GDB_ENABLED) {
618
                BlockJTAG();
619
                HandleServerSocket(false);
620
                continue;
621
              } else
622
                fprintf (stderr, "WARNING: CPU stalled and gdb connection not enabled.");
623 127 chris
 
624 261 markom
      if (!testsprbits(SPR_PMR, SPR_PMR_DME | SPR_PMR_SME)) {
625 304 markom
        if(cycle_delay <= 0) {
626
          unsigned int addr;
627
          if (cont_run > 0) cont_run--;
628
          if(fetch()) {
629
            cont_run = 0; /* memory breakpoint encountered */
630
            break;
631
          }
632
          addr = iqueue[0].insn_addr;
633
 
634
          /* If trace_fd is non zero, we want
635
             to make sure that disassemble is called */
636 181 chris
 
637 304 markom
          decode_execute(&iqueue[0],trace_fd);
638
          if(trace_fd) {
639
            char sTemp[256];
640
            char sTemp2[256];
641
            unsigned long value;
642
            extern char *disassembled;
643
            extern unsigned long reg[];
644 181 chris
 
645 304 markom
            /* The objects passed to the
646
               trace command should not be
647
               hardcoded like this...instead
648
               what to dump should be passed
649
               on the command line.
650 181 chris
 
651 304 markom
               FIX THIS LATER...
652
            */
653
            value = (evalsim_mem8(0x306bc) << 24) +
654
              (evalsim_mem8(0x306bd) << 16) +
655
              (evalsim_mem8(0x306be) << 8)
656
              + evalsim_mem8(0x306bf);
657 221 markom
 
658 304 markom
            sprintf(sTemp,"0x%06x: %s",addr,disassembled);
659
            memset(sTemp2,' ',sizeof(sTemp2));
660
            strncpy(sTemp2,sTemp,strlen(sTemp));
661
            sprintf(&sTemp2[40],"<0x%08x,0x%08x> [0x%08x]\n",
662
                    reg[3],reg[4],value);
663
            write(trace_fd,sTemp2,strlen(sTemp2));
664 261 markom
          }
665 304 markom
          update_pc();
666
          analysis();
667
          if (!hush)
668
            dumpreg();
669
        } else
670 261 markom
          cycle_delay--;
671 123 markom
 
672 261 markom
        pic_clock();
673
        dc_clock();
674
        ic_clock();
675 304 markom
        if (!testsprbits(SPR_PMR, SPR_PMR_SME)) tick_clock();
676 261 markom
      }
677 304 markom
 
678 261 markom
      pm_clock();
679 304 markom
      if (config.uarts_enabled) uart_clock();
680
      if (config.dmas_enabled) dma_clock();
681
      if (config.ethernets_enabled) eth_clock();
682
      if (config.sim.exe_log) dump_exe_log();
683
      if (config.vapi.enabled) vapi_check();
684 269 markom
      if (GDB_ENABLED && debug_slowdown-- == 0) {
685 261 markom
        debug_slowdown = DEBUG_SLOWDOWN;
686
                          HandleServerSocket(false); /* block & check_stdin = false */
687 103 lampret
                        }
688 2 cvs
                }
689
                hush = 0;
690
                fflush(stdout);
691
                freopen("/dev/fd/0", "w+", stdout);
692
 
693 304 markom
                if (!config.sim.iprompt)        /* non-interactive quit */
694
                  sim_done();
695
 
696 16 jrydberg
#ifdef HAVE_LIBREADLINE
697 103 lampret
                if (linestr)
698
                        free (linestr);
699 16 jrydberg
#endif
700 7 jrydberg
 
701 2 cvs
        }
702 304 markom
        sim_done();
703 2 cvs
}
704 7 jrydberg
 
705 16 jrydberg
#ifdef HAVE_LIBREADLINE
706 7 jrydberg
char *command_generator ();
707
char **sim_completion ();
708
 
709
/* Tell the GNU readline library how to complete.  We want to try to complete
710
   on command names if this is the first word in the line, or on filenames
711
   if not. */
712
void initialize_readline ()
713
{
714
  /* Allow conditional parsing of the ~/.inputrc file. */
715
  rl_readline_name = "or1ksim";
716
 
717
  /* Tell the completer that we want a crack first. */
718
  rl_attempted_completion_function = (CPPFunction *)sim_completion;
719
}
720
 
721
/* Attempt to complete on the contents of TEXT.  START and END bound the
722
   region of rl_line_buffer that contains the word to complete.  TEXT is
723
   the word to complete.  We can use the entire contents of rl_line_buffer
724
   in case we want to do some simple parsing.  Return the array of matches,
725
   or NULL if there aren't any. */
726
char **
727
sim_completion (text, start, end)
728
     char *text;
729
     int start, end;
730
{
731
  char **matches;
732
 
733
  matches = (char **)NULL;
734
 
735
  /* If this word is at the start of the line, then it is a command
736
     to complete.  Otherwise it is the name of a file in the current
737
     directory. */
738
  if (start == 0)
739
    matches = completion_matches (text, command_generator);
740
 
741
  return (matches);
742
}
743
 
744
/* Generator function for command completion.  STATE lets us know whether
745
   to start from scratch; without any state (i.e. STATE == 0), then we
746
   start at the top of the list. */
747
char *
748
command_generator (text, state)
749
     char *text;
750
     int state;
751
{
752
  static int list_index, len;
753
  char *name;
754
 
755
  /* If this is a new word to complete, initialize now.  This includes
756
     saving the length of TEXT for efficiency, and initializing the index
757
     variable to 0. */
758
  if (!state)
759
    {
760
      list_index = 0;
761
      len = strlen (text);
762
    }
763
 
764
  /* Return the next name which partially matches from the command list. */
765
  while (name = sim_commands[list_index])
766
    {
767
      list_index++;
768
 
769
      if (strncmp (name, text, len) == 0)
770
        return (dupstr(name));
771
    }
772
 
773
  /* If no names matched, then return NULL. */
774
  return ((char *)NULL);
775
}
776
 
777
/* Repeats the last command.  */
778
char *
779
repeat_last_command ()
780
{
781
  int offset = where_history ();
782
  HIST_ENTRY *hist;
783
 
784
  if (hist = history_get (offset))
785 306 markom
    return dupstr (hist->line);
786 7 jrydberg
  return 0;
787
}
788 16 jrydberg
 
789
#endif
790
 
791 138 markom
extern char *disassembled;
792 257 erez
void debugmem( unsigned long from, unsigned long to )
793
{
794 138 markom
  int i;
795
  printf("starting to dump mem...\n");
796 257 erez
  for(i=from; i<to; ) {
797 261 markom
    struct label_entry *entry;
798 221 markom
    unsigned int _insn;
799 261 markom
    printf("i=%x :: ", i);
800
 
801
    if (verify_memoryarea(i) && (entry = get_label(i)))
802
      printf("label: %s |", entry->name);
803 221 markom
 
804
    iqueue[0].insn = _insn = evalsim_mem32(i);
805
    iqueue[0].insn_index = insn_decode(_insn);
806
    disassemble_insn (_insn);
807
    printf("%08x %s\n", _insn, disassembled);
808 257 erez
                i += insn_len( iqueue[0].insn_index );
809 138 markom
  }
810 21 cmchen
}

powered by: WebSVN 2.1.0

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