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

Subversion Repositories or1k

[/] [or1k/] [tags/] [tn_m001/] [or1ksim/] [toplevel.c] - Blame information for rev 336

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

powered by: WebSVN 2.1.0

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