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 306

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

powered by: WebSVN 2.1.0

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