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

Subversion Repositories or1k

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

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
/* Added by CZ 24/05/01 */
33
#include <sys/stat.h>
34
#include <sys/types.h>
35
#include <sys/socket.h>
36
#include <netinet/in.h>
37
#include <sys/select.h>
38
#include <sys/poll.h>
39
#include <fcntl.h>
40
#include <netdb.h>
41
#include <netinet/tcp.h>
42 127 chris
#include <inttypes.h>
43 2 cvs
 
44 16 jrydberg
#ifdef HAVE_LIBREADLINE
45 7 jrydberg
#include <readline/readline.h>
46
#include <readline/history.h>
47 16 jrydberg
#endif /* HAVE_LIBREADLINE */
48 7 jrydberg
 
49 2 cvs
#include "arch.h"
50
#include "parse.h"
51
#include "abstract.h"
52 261 markom
#include "labels.h"
53 2 cvs
#include "trace.h"
54
#include "execute.h"
55 69 lampret
#include "sim-config.h"
56 103 lampret
#include "spr_defs.h"
57 212 erez
#include "dma.h"
58 2 cvs
 
59 28 lampret
#include "coff.h"
60
 
61 123 markom
/* Added by CZ 24/05/01 */
62 127 chris
#include "gdb.h"
63 123 markom
#include <signal.h>
64
#include <errno.h>
65
typedef enum {
66
  false = 0,
67
  true = 1,
68
} Boolean;
69
unsigned int serverIP = 0;
70
unsigned int serverPort = 0;
71
unsigned int server_fd = 0;
72
unsigned int gdb_fd = 0;
73
void HandleServerSocket(Boolean);
74
void JTAGRequest(void);
75
void GDBRequest(void);
76 127 chris
void ProtocolClean(int,int32_t);
77
static int gdb_read(void*,int);
78
static int gdb_write(void*,int);
79
void BlockJTAG(void);
80
 
81 2 cvs
/* CVS revision number. */
82 264 markom
const char rcsrev[] = "$Revision: 1.34 $";
83 2 cvs
 
84
/* Continuos run versus single step tracing switch. */
85
int cont_run;
86
 
87
/* History of execution */
88
int histexec[HISTEXEC_LEN];
89
 
90 7 jrydberg
char *sim_commands [] = {
91
  "q",
92
  "t",
93
  "help",
94 21 cmchen
  "de",
95 7 jrydberg
  "dm",
96
  "run",
97
  "pr",
98
  "pm",
99
  "pc",
100 18 lampret
  "reset",
101
  "break",
102 7 jrydberg
  "hist",
103
  "stats",
104 181 chris
  "stall"
105 7 jrydberg
  "info",
106
  "r",
107 54 lampret
  "dv",
108 7 jrydberg
 
109
};
110
 
111 167 markom
inline void debug(const char *format, ...)
112 2 cvs
{
113 167 markom
#ifndef DEBUGMOD_OFF
114 7 jrydberg
  char *p;
115
  va_list ap;
116 2 cvs
 
117 264 markom
  if (config.sim.debug) {
118 69 lampret
    if ((p = malloc(1000)) == NULL)
119
      return;
120
    va_start(ap, format);
121
    (void) vsnprintf(p, 1000, format, ap);
122
    va_end(ap);
123
    printf("%s\n", p);
124
    fflush(stdout);
125
    free(p);
126
  } else {
127
#if DEBUG
128 7 jrydberg
  if ((p = malloc(1000)) == NULL)
129
    return;
130
  va_start(ap, format);
131
  (void) vsnprintf(p, 1000, format, ap);
132
  va_end(ap);
133
  printf("%s\n", p);
134
  fflush(stdout);
135
  free(p);
136 2 cvs
#endif
137 69 lampret
  }
138 167 markom
#endif /* no DEBUGMOD_OFF */
139 2 cvs
}
140
 
141 30 lampret
/* Strip whitespace from the start and end of STRING.  Return a pointer
142
   into STRING. */
143
#ifndef whitespace
144
#define whitespace(a)   ((a) == '\t' ? 1 : ((a) == ' '? 1 : 0))
145
#endif
146
 
147
char *
148
stripwhite (string)
149
     char *string;
150
{
151
  register char *s, *t;
152
 
153
  for (s = string; whitespace (*s); s++)
154
    ;
155
 
156
  if (*s == 0)
157
    return (s);
158
 
159
  t = s + strlen (s) - 1;
160
  while (t > s && whitespace (*t))
161
    t--;
162
  *++t = '\0';
163
 
164
  return s;
165
}
166
 
167 7 jrydberg
void
168
ctrl_c(signum)
169
     int signum;
170 2 cvs
{
171 181 chris
  extern int cpu_stalled;  /* CZ from debug_interface */
172
  cont_run = cpu_stalled ? 0 : 1;
173 264 markom
  config.sim.iprompt = 1;
174 181 chris
  cpu_stalled = 0;
175 7 jrydberg
  signal(SIGINT, ctrl_c);
176 2 cvs
}
177
 
178 7 jrydberg
void
179
version()
180 2 cvs
{
181 7 jrydberg
        printf ("\n");
182 18 lampret
        printf ("OpenRISC 1000 (OR16+OR32) Architectural Simulator, %s\n", rcsrev);
183
        printf ("Copyright (C) 1999 Damjan Lampret, lampret@opencores.org\n");
184
        printf ("Copyright (C) 2000 Damjan Lampret, lampret@opencores.org\n");
185 21 cmchen
        printf ("                   Jimmy Chen-Min Chen, jimmy@ee.nctu.edu.tw\n");
186 18 lampret
        printf ("                   Johan Rydberg, johan.rydberg@insight.se\n");
187 264 markom
        printf ("                   Marko Mlinar, markom@opencores.org\n");
188
  printf ("Copyright (C) 2001 Simon Srot, simons@opencores.org\n");
189
  printf ("                   Marko Mlinar, markom@opencores.org\n");
190 7 jrydberg
        printf ("Visit http://www.opencores.org for more information about ");
191
        printf ("OpenRISC 1000 and\nother open source cores.\n\n");
192
        printf ("This software comes with ABSOLUTELY NO WARRANTY; for ");
193
        printf ("details see COPYING.\nThis is free software, and you ");
194
        printf ("are welcome to redistribute it under certain\nconditions; ");
195
        printf ("for details see COPYING.\n");
196 2 cvs
}
197
 
198 7 jrydberg
void
199
help()
200 2 cvs
{
201
        printf("q                        - quit simulator\n");
202
        printf("r                        - display all registers\n");
203
        printf("t                        - execute next instruction\n");
204
        printf("run <cycles> [<hush>]    - execute <cycles> instructions, no reg dump if hush\n");
205
        printf("pr <r> <value>           - patch register <r> with <value>\n");
206
        printf("dm <fromaddr> [<toaddr>] - display memory from <fromaddr> to <toaddr>\n");
207 257 erez
        printf("de <fromaddr> [<toaddr>] - debug insn memory\n");
208 2 cvs
        printf("pm <addr> <value>        - patch memory location <addr> with <value>\n");
209
        printf("pc <value>               - patch PC register with <value>\n");
210 18 lampret
        printf("break <addr>             - toggle breakpoint at address <addr>\n");
211
        printf("reset                    - simulator reset\n");
212 2 cvs
        printf("hist                     - execution history\n");
213 181 chris
        printf("stall                    - stalls the processor and gives control to the debugger\n");
214 6 lampret
        printf("stats <num|clear>        - execution statistics num or clear it.\n");
215
        printf("info                     - configuration info (caches etc.)\n");
216 54 lampret
        printf("dv <fromaddr> [<toaddr>] [<modname>] - dumps memory as verilog (use redirect)\n");
217 86 lampret
        printf("dh <fromaddr> [<toaddr>] - dumps memory as hex code (use redirect)\n");
218 2 cvs
        printf("<cmd> > <filename>       - redirect simulator stdout to <filename> (and not emulated printf)\n");
219 69 lampret
        printf("debug                    - toggles simulator debug mode\n");
220 2 cvs
        printf("help                     - available commands (this list)\n");
221
}
222
 
223 257 erez
void debugmem( unsigned long from, unsigned long to );
224 21 cmchen
 
225 7 jrydberg
main(argc, argv)
226
     int argc;
227
     char *argv[];
228 2 cvs
{
229 7 jrydberg
        char *linestr;
230 167 markom
        char item1[500], b2[500], prev_str[500] = "";
231 2 cvs
        char *redirstr;
232 261 markom
        int hush = 0;
233 123 markom
        unsigned long endaddr = 0xFFFFFFFF;
234
        int first_prompt = 1;
235 181 chris
        int trace_fd = 0;
236 123 markom
 
237 103 lampret
        srand(getpid());
238
        init_defconfig();
239 123 markom
        if (parse_args(argc, argv)) {
240 221 markom
                printf("Usage: %s [options] <filename>\n", argv[0]);
241 103 lampret
                printf("Options:\n");
242 264 markom
                printf(" -v                 version and copyright note\n");
243
                printf(" -i                 enable interactive command prompt\n");
244
                printf(" -f or --file       change script file [sim.cfg]\n");
245
                printf(" --nosrv            do not launch JTAG proxy server\n"); /* (CZ) */
246
                printf(" --srv <n>          launch JTAG proxy server on port <n>; [random]\n"); /* (CZ) */
247
                printf(" --profile          enable profiling\n");
248 103 lampret
                exit(-1);
249
        }
250 7 jrydberg
 
251 16 jrydberg
#ifdef HAVE_LIBREADLINE
252 7 jrydberg
  initialize_readline ();       /* Bind our completer. */
253 264 markom
#endif
254 123 markom
 
255
  if(!config.inhibit_server)
256
    {
257
      serverPort = config.server_port;
258
      if(server_fd = GetServerSocket("or1ksim","tcp",serverPort))
259 221 markom
              printf("JTAG Proxy server started on port %d\n",serverPort);
260 123 markom
    }
261 16 jrydberg
 
262 264 markom
  if(config.sim.profile) {
263
    config.sim.fprof = fopen("sim.profile","wt+");
264
    if(!config.sim.fprof) {
265
      config.sim.profile = 0;
266 173 markom
      printf("Problems opening profile file. Profiling disabled. \n");
267
    } else
268 264 markom
      fprintf(config.sim.fprof, "+00000000 FFFFFFFF FFFFFFFF main\n");
269 173 markom
  }
270 263 markom
 
271 242 markom
  /* Read configuration file.  */
272 263 markom
  read_script_file(config.script_file);
273 264 markom
  print_config();
274 261 markom
  init_labels();
275
  init_breakpoints();
276 2 cvs
        signal(SIGINT, ctrl_c);
277
        initstats();
278 138 markom
        build_automata();
279 123 markom
 
280 262 markom
  /* Initialize memory */
281
  {
282 221 markom
          extern struct dev_memarea *dev_list;
283
          int i;
284 262 markom
          if(config.memory.type == MT_RANDOM) {
285 221 markom
                  unsigned int val = 0;
286 123 markom
 
287 262 markom
      if (config.memory.random_seed == -1) {
288
        config.memory.random_seed = time(NULL);
289
        /* Print out the seed just in case we ever need to debug */
290
                    printf("Seeding random generator with value %d\n", config.memory.random_seed);
291
                  }
292
                  srandom(config.memory.random_seed);
293
 
294 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
295
        for(i = 0; i < cur_area->size; i++) {
296
          val = random();
297 262 markom
          setsim_mem8(i + cur_area->addr_compare, val & 0xFF);
298 221 markom
        }
299 262 markom
    } else if(config.memory.type == MT_PATTERN) {
300 221 markom
                  for (cur_area = dev_list; cur_area; cur_area = cur_area->next)
301
        for(i = 0; i < cur_area->size; i++)
302 262 markom
          setsim_mem8(i + cur_area->addr_compare, config.memory.pattern);
303 221 markom
    } else {
304 262 markom
      fprintf(stderr, "Invalid memory configuration type.\n");
305
            exit(1);
306 221 markom
    }
307 242 markom
  }
308 262 markom
 
309
        if(config.filename) {
310
          endaddr = loadcode(config.filename, 0, 0); /* MM170901 always load at address zero.  */
311
          if (endaddr == -1) {
312
            fprintf(stderr, "Problems loading boot code.\n");
313
            exit(1);
314
          }
315
        }
316 221 markom
 
317 30 lampret
        uart_reset();
318 212 erez
        dma_reset();
319 257 erez
        eth_reset();
320 92 lampret
        tick_reset();
321 103 lampret
        pm_reset();
322 242 markom
        pic_reset();
323 261 markom
        mc_reset();
324 2 cvs
        reset();
325 7 jrydberg
 
326 103 lampret
        while(1) {
327 264 markom
                if (config.sim.iprompt) {
328 123 markom
                  if(server_fd)
329
                    {
330
                      printf ("(sim) ");
331
                      fflush(stdout);
332
                      HandleServerSocket(true);  /* block & check_stdin = true */
333
                    }
334 16 jrydberg
#ifdef HAVE_LIBREADLINE
335 123 markom
                  /* Must disable readline in new mode. It isn't compatible
336
                     with non blocking environments */
337
                  if(!server_fd)
338
                    linestr = readline("(sim) ");
339
                  else
340
                    linestr = fgets(b2, sizeof b2, stdin);
341 16 jrydberg
#else
342 123 markom
                  if(!server_fd)
343
                    printf ("(sim) ");
344
                  linestr = fgets(b2, sizeof b2, stdin);
345 16 jrydberg
#endif
346 103 lampret
                } else
347 173 markom
                        strcpy(linestr = b2, "run -1 hush");
348 7 jrydberg
 
349 103 lampret
                if (!linestr)
350
                        break;
351
                linestr = stripwhite (linestr);
352 7 jrydberg
 
353 16 jrydberg
#ifdef HAVE_LIBREADLINE
354 123 markom
                /* Readline only works in the old mode */
355
                if(!server_fd)
356
                  {
357
                    if (strlen(linestr) == 0) {
358
                      char *l = repeat_last_command ();
359
 
360
                      if (l) {
361
                        free (linestr);
362
                        linestr = l;
363
                      }
364
                    }
365
 
366
                    if (*linestr) {
367
                      add_history (linestr);
368
                    }
369
                  }
370 16 jrydberg
#endif /* HAVE_LIBREADLINE */
371 2 cvs
 
372 103 lampret
                if (redirstr = strstr(linestr, ">")) {
373
                        *redirstr = '\0';
374
                        strtoken(&redirstr[1], item1, 1);
375
                        freopen(item1, "w+", stdout);
376
                }
377 2 cvs
 
378 167 markom
                if (linestr[0] == '\n')
379
                  strcpy (linestr, &prev_str[0]);
380
                else
381
                  strcpy (&prev_str[0], linestr);
382
 
383 2 cvs
                strtoken(linestr, item1, 1);
384 167 markom
                if (strcmp(item1, "q") == 0) {   /* quit */
385
                  printf ("\n");
386 264 markom
                  if (config.sim.profile) {
387 173 markom
                    extern int cycles;
388 264 markom
                    fprintf(config.sim.fprof,"-%08X FFFFFFFF\n", cycles);
389
                    fclose(config.sim.fprof);
390 173 markom
                  }
391 167 markom
                  exit(0);
392
                } 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 167 markom
                        dumpmemory(from, to, 0);
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 167 markom
                                dumpmemory(histexec[i - 1], histexec[i - 1] + 4, 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
                if (strcmp(item1, "info") == 0) { /* configuration info */
595 78 lampret
                        itlb_status(-1);
596
                        dtlb_status(-1);
597 6 lampret
                        bpb_info();
598
                        btic_info();
599
                        ic_info();
600
                        dc_info();
601 30 lampret
                        uart_status();
602
                        sprs_status();
603 221 markom
                        dma_status();
604 257 erez
                        eth_status();
605 7 jrydberg
                } else {
606 103 lampret
                        printf("%s: Unknown command.\n", linestr);
607
                }
608
 
609 138 markom
                /* MM: 'run -1' means endless execution.  */
610
                while(cont_run != 0) {
611 261 markom
                  int debug_slowdown = DEBUG_SLOWDOWN;
612 123 markom
                  extern int cycle_delay;  /* Added by CZ 27/05/01. Set during exception. */
613 127 chris
                  extern int cpu_stalled;  /* CZ from debug_interface */
614 123 markom
 
615 127 chris
                  if(cpu_stalled)
616
                    {
617
                      BlockJTAG();
618
                      HandleServerSocket(false);
619
                      continue;
620
                    }
621
 
622 261 markom
      if (!testsprbits(SPR_PMR, SPR_PMR_DME | SPR_PMR_SME)) {
623
        if(cycle_delay <= 0)
624
          {
625
            unsigned int addr;
626
            if (cont_run > 0) cont_run--;
627
            if(fetch()) {
628
              cont_run = 0; /* memory breakpoint encountered */
629
              break;
630
            }
631
            addr = iqueue[0].insn_addr;
632
 
633
            /* If trace_fd is non zero, we want
634
               to make sure that disassemble is called */
635 181 chris
 
636 261 markom
            decode_execute(&iqueue[0],trace_fd);
637
            if(trace_fd)
638
              {
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 261 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 261 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 261 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
              }
665
            update_pc();
666
            analysis();
667
            if (!hush)
668
              dumpreg();
669
          }
670
        else
671
          cycle_delay--;
672 123 markom
 
673 261 markom
        pic_clock();
674
        dc_clock();
675
        ic_clock();
676
      }
677
      if (!testsprbits(SPR_PMR, SPR_PMR_SME))
678
        tick_clock();
679
      pm_clock();
680
      uart_clock();
681
      dma_clock();
682
      eth_clock();
683
 
684
#ifndef DEBUGMOD_OFF
685
      if (debug_slowdown-- == 0) {
686
        debug_slowdown = DEBUG_SLOWDOWN;
687
                          HandleServerSocket(false); /* block & check_stdin = false */
688 103 lampret
                        }
689 167 markom
#endif
690 2 cvs
                }
691
                hush = 0;
692
                fflush(stdout);
693
                freopen("/dev/fd/0", "w+", stdout);
694
 
695 264 markom
                if (!config.sim.iprompt) {      /* non-interactive quit */
696
                  if (config.sim.profile) {
697 173 markom
                    extern int cycles;
698 264 markom
                    fprintf(config.sim.fprof,"-%08X FFFFFFFF\n", cycles);
699
                    fclose(config.sim.fprof);
700 173 markom
                  }
701
                  exit(0);
702
                }
703 16 jrydberg
#ifdef HAVE_LIBREADLINE
704 103 lampret
                if (linestr)
705
                        free (linestr);
706 16 jrydberg
#endif
707 7 jrydberg
 
708 2 cvs
        }
709
        exit(0);
710
}
711 7 jrydberg
 
712 16 jrydberg
#ifdef HAVE_LIBREADLINE
713 7 jrydberg
char *command_generator ();
714
char **sim_completion ();
715
 
716
/* Tell the GNU readline library how to complete.  We want to try to complete
717
   on command names if this is the first word in the line, or on filenames
718
   if not. */
719
void initialize_readline ()
720
{
721
  /* Allow conditional parsing of the ~/.inputrc file. */
722
  rl_readline_name = "or1ksim";
723
 
724
  /* Tell the completer that we want a crack first. */
725
  rl_attempted_completion_function = (CPPFunction *)sim_completion;
726
}
727
 
728
/* Attempt to complete on the contents of TEXT.  START and END bound the
729
   region of rl_line_buffer that contains the word to complete.  TEXT is
730
   the word to complete.  We can use the entire contents of rl_line_buffer
731
   in case we want to do some simple parsing.  Return the array of matches,
732
   or NULL if there aren't any. */
733
char **
734
sim_completion (text, start, end)
735
     char *text;
736
     int start, end;
737
{
738
  char **matches;
739
 
740
  matches = (char **)NULL;
741
 
742
  /* If this word is at the start of the line, then it is a command
743
     to complete.  Otherwise it is the name of a file in the current
744
     directory. */
745
  if (start == 0)
746
    matches = completion_matches (text, command_generator);
747
 
748
  return (matches);
749
}
750
 
751
/* Generator function for command completion.  STATE lets us know whether
752
   to start from scratch; without any state (i.e. STATE == 0), then we
753
   start at the top of the list. */
754
char *
755
command_generator (text, state)
756
     char *text;
757
     int state;
758
{
759
  static int list_index, len;
760
  char *name;
761
 
762
  /* If this is a new word to complete, initialize now.  This includes
763
     saving the length of TEXT for efficiency, and initializing the index
764
     variable to 0. */
765
  if (!state)
766
    {
767
      list_index = 0;
768
      len = strlen (text);
769
    }
770
 
771
  /* Return the next name which partially matches from the command list. */
772
  while (name = sim_commands[list_index])
773
    {
774
      list_index++;
775
 
776
      if (strncmp (name, text, len) == 0)
777
        return (dupstr(name));
778
    }
779
 
780
  /* If no names matched, then return NULL. */
781
  return ((char *)NULL);
782
}
783
 
784
char *
785
dupstr (s)
786
     char *s;
787
{
788
  char *r;
789
 
790
  r = xmalloc (strlen (s) + 1);
791
  strcpy (r, s);
792
  return (r);
793
}
794
 
795
/* Repeats the last command.  */
796
char *
797
repeat_last_command ()
798
{
799
  int offset = where_history ();
800
  HIST_ENTRY *hist;
801
 
802
  if (hist = history_get (offset))
803
    {
804
      return dupstr (hist->line);
805
    }
806
  return 0;
807
}
808 16 jrydberg
 
809
#endif
810
 
811 138 markom
extern char *disassembled;
812 257 erez
void debugmem( unsigned long from, unsigned long to )
813
{
814 138 markom
  int i;
815
  printf("starting to dump mem...\n");
816 257 erez
  for(i=from; i<to; ) {
817 261 markom
    struct label_entry *entry;
818 221 markom
    unsigned int _insn;
819 261 markom
    printf("i=%x :: ", i);
820
 
821
    if (verify_memoryarea(i) && (entry = get_label(i)))
822
      printf("label: %s |", entry->name);
823 221 markom
 
824
    iqueue[0].insn = _insn = evalsim_mem32(i);
825
    iqueue[0].insn_index = insn_decode(_insn);
826
    disassemble_insn (_insn);
827
    printf("%08x %s\n", _insn, disassembled);
828 257 erez
                i += insn_len( iqueue[0].insn_index );
829 138 markom
  }
830 21 cmchen
}
831 123 markom
 
832 127 chris
static int tcp_level = 0;
833
 
834 123 markom
/* Added by CZ 24/05/01 */
835
int GetServerSocket(const char* name,const char* proto,int port)
836
{
837
  struct servent *service;
838
  struct protoent *protocol;
839
  struct sockaddr_in sa;
840
  struct hostent *hp;
841
  int sockfd;
842
  char myname[256];
843
  int flags;
844
  char sTemp[256];
845
 
846
  /* First, get the protocol number of TCP */
847
  if(!(protocol = getprotobyname(proto)))
848
    {
849
      sprintf(sTemp,"Unable to load protocol \"%s\"",proto);
850
      perror(sTemp);
851
      return 0;
852
    }
853 127 chris
  tcp_level = protocol->p_proto; /* Save for later */
854
 
855 123 markom
  /* If we weren't passed a non standard port, get the port
856
     from the services directory. */
857
  if(!port)
858
    {
859
      if(service = getservbyname(name,protocol->p_name))
860
        port = ntohs(service->s_port);
861
    }
862
 
863
  /* Create the socket using the TCP protocol */
864
  if((sockfd = socket(PF_INET,SOCK_STREAM,protocol->p_proto)) < 0)
865
    {
866
      perror("Unable to create socket");
867
      return 0;
868
    }
869
 
870
  flags = 1;
871
  if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&flags,sizeof(int))
872
 < 0)
873
    {
874
      sprintf(sTemp,"Can not set SO_REUSEADDR option on socket %d",sockfd);
875
      perror(sTemp);
876
      close(sockfd);
877
      return 0;
878
    }
879
 
880
  /* The server should also be non blocking. Get the current flags. */
881
  if(fcntl(sockfd,F_GETFL,&flags) < 0)
882
    {
883
      sprintf(sTemp,"Unable to get flags for socket %d",sockfd);
884
      perror(sTemp);
885
      close(sockfd);
886
      return 0;
887
    }
888
 
889
  /* Set the nonblocking flag */
890
  if(fcntl(sockfd,F_SETFL, flags | O_NONBLOCK) < 0)
891
    {
892
      sprintf(sTemp,"Unable to set flags for socket %d to value 0x%08x",
893
              sockfd,flags | O_NONBLOCK);
894
      perror(sTemp);
895
      close(sockfd);
896
      return 0;
897
    }
898
 
899
  /* Find out what our address is */
900
  memset(&sa,0,sizeof(struct sockaddr_in));
901
  gethostname(myname,sizeof(myname));
902
  if(!(hp = gethostbyname(myname)))
903
    {
904
      perror("Unable to read hostname");
905
      close(sockfd);
906
      return 0;
907
    }
908
 
909
  /* Bind our socket to the appropriate address */
910
  sa.sin_family = hp->h_addrtype;
911
  sa.sin_port = htons(port);
912
  if(bind(sockfd,(struct sockaddr*)&sa,sizeof(struct sockaddr_in)) < 0)
913
    {
914
      sprintf(sTemp,"Unable to bind socket %d to port %d",sockfd,port);
915
      perror(sTemp);
916
      close(sockfd);
917
      return 0;
918
    }
919
  serverIP = sa.sin_addr.s_addr;
920
  flags = sizeof(struct sockaddr_in);
921
  if(getsockname(sockfd,(struct sockaddr*)&sa,&flags) < 0)
922
    {
923
      sprintf(sTemp,"Unable to get socket information for socket %d",sockfd);
924
      perror(sTemp);
925
      close(sockfd);
926
      return 0;
927
    }
928
  serverPort = ntohs(sa.sin_port);
929
 
930
  /* Set the backlog to 1 connections */
931
  if(listen(sockfd,1) < 0)
932
    {
933
      sprintf(sTemp,"Unable to set backlog on socket %d to %d",sockfd,1);
934
      perror(sTemp);
935
      close(sockfd);
936
      return 0;
937
    }
938
 
939
  return sockfd;
940
}
941
 
942 127 chris
void BlockJTAG()
943 123 markom
{
944
  struct pollfd fds[2];
945
  int n = 0;
946 127 chris
 
947
  fds[n].fd = server_fd;
948
  fds[n].events = POLLIN;
949
  fds[n++].revents = 0;
950
  if(gdb_fd)
951
    {
952
      fds[n].fd = gdb_fd;
953
      fds[n].events = POLLIN;
954
      fds[n++].revents = 0;
955
    }
956
  poll(fds,n,-1);
957
}
958
 
959
void HandleServerSocket(Boolean block)
960
{
961
  struct pollfd fds[3];
962
  int n = 0;
963 123 markom
  int timeout = block ? -1 : 0;
964
  int server_index = -1;
965
  int gdb_index = -1;
966
  Boolean data_on_stdin = false;
967
  int o_serv_fd = server_fd;
968
 
969
  if(!o_serv_fd && !gdb_fd)
970
    return;
971
 
972
  if(o_serv_fd)
973
    {
974
      fds[n].fd = o_serv_fd;
975
      fds[n].events = POLLIN;
976
      fds[n++].revents = 0;
977
    }
978
  if(gdb_fd)
979
    {
980
      fds[n].fd = gdb_fd;
981
      fds[n].events = POLLIN;
982
      fds[n++].revents = 0;
983
    }
984
  if(block)
985
    {
986
      fds[n].fd = 0;
987
      fds[n].events = POLLIN;
988
      fds[n++].revents = 0;
989
    }
990
 
991
  while(!data_on_stdin)
992
    {
993
      switch(poll(fds,n,timeout))
994
        {
995
        case -1:
996
          if(errno == EINTR)
997
            continue;
998
          perror("poll");
999
          server_fd = 0;
1000
          break;
1001
        case 0: /* Nothing interesting going on */
1002
          data_on_stdin = true; /* Can only get here if nonblocking */
1003
          break;
1004
        default:
1005 127 chris
          /* Make sure to handle the gdb port first! */
1006 123 markom
          if((fds[0].revents && (gdb_fd && !o_serv_fd) ||
1007
              fds[1].revents && (server_fd && gdb_fd)))
1008
            {
1009
              int revents = o_serv_fd ? fds[1].revents : fds[0].revents;
1010
 
1011
              if(revents & POLLIN)
1012
                GDBRequest();
1013
              else /* Error Occurred */
1014
                {
1015
                  fprintf(stderr,"Received flags 0x%08x on gdb socket. Shutting down.\n",revents);
1016
                  close(gdb_fd);
1017
                  gdb_fd = 0;
1018
                }
1019
            }
1020 127 chris
          if(fds[0].revents && o_serv_fd)
1021
            {
1022
              if(fds[0].revents & POLLIN)
1023
                JTAGRequest();
1024
              else /* Error Occurred */
1025
                {
1026
                  fprintf(stderr,"Received flags 0x%08x on server. Shutting down.\n",fds[0].revents);
1027
                  close(o_serv_fd);
1028
                  server_fd = 0;
1029
                  serverPort = 0;
1030
                  serverIP = 0;
1031
                }
1032
            }
1033 123 markom
          if(fds[2].revents || (fds[1].revents && !gdb_fd))
1034
            data_on_stdin = true;
1035
          break;
1036
        } /* End of switch statement */
1037
    } /* End of while statement */
1038
}
1039
 
1040
void JTAGRequest()
1041
{
1042
  struct sockaddr_in sa;
1043
  struct sockaddr* addr = (struct sockaddr*)&sa;
1044
  int n = sizeof(struct sockaddr_in);
1045
  int fd = accept(server_fd,addr,&n);
1046
  int on_off = 0; /* Turn off Nagel's algorithm on the socket */
1047
  int flags;
1048
  char sTemp[256];
1049
 
1050
  if(fd < 0)
1051
    {
1052
      /* This is valid, because a connection could have started,
1053
         and then terminated due to a protocol error or user
1054
         initiation before the accept could take place. */
1055
      if(errno != EWOULDBLOCK && errno != EAGAIN)
1056
        {
1057
          perror("accept");
1058
          close(server_fd);
1059
          server_fd = 0;
1060
          serverPort = 0;
1061
          serverIP = 0;
1062
        }
1063
      return;
1064
    }
1065
 
1066
  if(gdb_fd)
1067
    {
1068
      close(fd);
1069
      return;
1070
    }
1071
 
1072
  if(fcntl(fd,F_GETFL,&flags) < 0)
1073
    {
1074
      sprintf(sTemp,"Unable to get flags for gdb socket %d",fd);
1075
      perror(sTemp);
1076
      close(fd);
1077
      return;
1078
    }
1079
 
1080
  if(fcntl(fd,F_SETFL, flags | O_NONBLOCK) < 0)
1081
    {
1082
      sprintf(sTemp,"Unable to set flags for gdb socket %d to value 0x%08x",
1083
              fd,flags | O_NONBLOCK);
1084
      perror(sTemp);
1085
      close(fd);
1086
      return;
1087
    }
1088
 
1089 127 chris
  if(setsockopt(fd,tcp_level,TCP_NODELAY,&on_off,sizeof(int)) < 0)
1090 123 markom
    {
1091
      sprintf(sTemp,"Unable to disable Nagel's algorithm for socket %d.\nsetsockopt",fd);
1092
      perror(sTemp);
1093
      close(fd);
1094
      return;
1095
    }
1096
 
1097
  gdb_fd = fd;
1098
}
1099
 
1100
void GDBRequest()
1101
{
1102 127 chris
  JTAGProxyWriteMessage msg_write;
1103
  JTAGProxyReadMessage msg_read;
1104
  JTAGProxyChainMessage msg_chain;
1105
  JTAGProxyWriteResponse resp_write;
1106
  JTAGProxyReadResponse resp_read;
1107
  JTAGProxyChainResponse resp_chain;
1108 139 chris
  JTAGProxyBlockWriteMessage *msg_bwrite;
1109
  JTAGProxyBlockReadMessage msg_bread;
1110
  JTAGProxyBlockWriteResponse resp_bwrite;
1111
  JTAGProxyBlockReadResponse *resp_bread;
1112 127 chris
  char *buf;
1113
  unsigned long long data;
1114 139 chris
  int err = 0;
1115 127 chris
  uint32_t command,length;
1116 139 chris
  int len,i;
1117 127 chris
 
1118
  /* First, we must read the incomming command */
1119
  if(gdb_read(&command,sizeof(uint32_t)) < 0)
1120
    {
1121
      if(gdb_fd)
1122
        {
1123
          perror("gdb socket - 1");
1124
          close(gdb_fd);
1125
          gdb_fd = 0;
1126
        }
1127
      return;
1128
    }
1129
  if(gdb_read(&length,sizeof(uint32_t)) < 0)
1130
    {
1131
      if(gdb_fd)
1132
        {
1133
          perror("gdb socket - 2");
1134
          close(gdb_fd);
1135
          gdb_fd = 0;
1136
        }
1137
      return;
1138
    }
1139
  length = ntohl(length);
1140
 
1141
  /* Now, verify the protocol and implement the command */
1142
  switch(ntohl(command))
1143
    {
1144
    case JTAG_COMMAND_WRITE:
1145
      if(length != sizeof(msg_write) - 8)
1146
        {
1147
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1148
          return;
1149
        }
1150
      buf = (char*)&msg_write;
1151
      if(gdb_read(&buf[8],length) < 0)
1152
        {
1153
          if(gdb_fd)
1154
            {
1155
              perror("gdb socket - 3");
1156
              close(gdb_fd);
1157
              gdb_fd = 0;
1158
            }
1159
          return;
1160
        }
1161
      msg_write.address = ntohl(msg_write.address);
1162
      msg_write.data_H = ntohl(msg_write.data_H);
1163
      msg_write.data_L = ntohl(msg_write.data_L);
1164
      err = DebugSetRegister(msg_write.address,msg_write.data_L);
1165
      resp_write.status = htonl(err);
1166
      if(gdb_write(&resp_write,sizeof(resp_write)) < 0)
1167
        {
1168
          if(gdb_fd)
1169
            {
1170
              perror("gdb socket - 4");
1171
              close(gdb_fd);
1172
              gdb_fd = 0;
1173
            }
1174
          return;
1175
        }
1176
      break;
1177
    case JTAG_COMMAND_READ:
1178
      if(length != sizeof(msg_read) - 8)
1179
        {
1180
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1181
          return;
1182
        }
1183
      buf = (char*)&msg_read;
1184
      if(gdb_read(&buf[8],length) < 0)
1185
        {
1186
          if(gdb_fd)
1187
            {
1188
              perror("gdb socket - 5");
1189
              close(gdb_fd);
1190
              gdb_fd = 0;
1191
            }
1192
          return;
1193
        }
1194
      msg_read.address = ntohl(msg_read.address);
1195
      err = DebugGetRegister(msg_read.address,&resp_read.data_L);
1196
      resp_read.status = htonl(err);
1197
      resp_read.data_H = 0;
1198
      resp_read.data_L = htonl(resp_read.data_L);
1199
      if(gdb_write(&resp_read,sizeof(resp_read)) < 0)
1200
        {
1201
          if(gdb_fd)
1202
            {
1203
              perror("gdb socket - 6");
1204
              close(gdb_fd);
1205
              gdb_fd = 0;
1206
            }
1207
          return;
1208
        }
1209
      break;
1210 139 chris
    case JTAG_COMMAND_BLOCK_WRITE:
1211
      if(length < sizeof(JTAGProxyBlockWriteMessage)-8)
1212
        {
1213
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1214
          return;
1215
        }
1216
      if(!(buf = (char*)malloc(8+length)))
1217
        {
1218
          ProtocolClean(length,JTAG_PROXY_OUT_OF_MEMORY);
1219
          return;
1220
        }
1221
      msg_bwrite = (JTAGProxyBlockWriteMessage*)buf;
1222
      if(gdb_read(&buf[8],length) < 0)
1223
        {
1224
          if(gdb_fd)
1225
            {
1226
              perror("gdb socket - 5");
1227
              close(gdb_fd);
1228
              gdb_fd = 0;
1229
            }
1230
          free(buf);
1231
          return;
1232
        }
1233
      msg_bwrite->address = ntohl(msg_bwrite->address);
1234
      msg_bwrite->nRegisters = ntohl(msg_bwrite->nRegisters);
1235
      for(i=0;i<msg_bwrite->nRegisters;i++)
1236
        {
1237 221 markom
          int t_err = 0;
1238 139 chris
 
1239
          msg_bwrite->data[i] = ntohl(msg_bwrite->data[i]);
1240
          t_err = DebugSetRegister(msg_bwrite->address+i,msg_bwrite->data[i]);
1241
          err = err ? err : t_err;
1242
        }
1243
      resp_bwrite.status = htonl(err);
1244
      free(buf);
1245 212 erez
      buf = NULL;
1246
      msg_bwrite = NULL;
1247 139 chris
      if(gdb_write(&resp_bwrite,sizeof(resp_bwrite)) < 0)
1248
        {
1249
          if(gdb_fd)
1250
            {
1251
              perror("gdb socket - 4");
1252
              close(gdb_fd);
1253
              gdb_fd = 0;
1254
            }
1255
          return;
1256
        }
1257
      break;
1258
    case JTAG_COMMAND_BLOCK_READ:
1259
      if(length != sizeof(msg_bread) - 8)
1260
        {
1261
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1262
          return;
1263
        }
1264
      buf = (char*)&msg_bread;
1265
      if(gdb_read(&buf[8],length) < 0)
1266
        {
1267
          if(gdb_fd)
1268
            {
1269
              perror("gdb socket - 5");
1270
              close(gdb_fd);
1271
              gdb_fd = 0;
1272
            }
1273
          return;
1274
        }
1275
      msg_bread.address = ntohl(msg_bread.address);
1276
      msg_bread.nRegisters = ntohl(msg_bread.nRegisters);
1277
      len = sizeof(JTAGProxyBlockReadResponse) + 4*(msg_bread.nRegisters-1);
1278
      if(!(buf = (char*)malloc(len)))
1279
        {
1280
          ProtocolClean(0,JTAG_PROXY_OUT_OF_MEMORY);
1281
          return;
1282
        }
1283
      resp_bread = (JTAGProxyBlockReadResponse*)buf;
1284
      for(i=0;i<msg_bread.nRegisters;i++)
1285
        {
1286
          int t_err;
1287
 
1288
          t_err = DebugGetRegister(msg_bread.address+i,&resp_bread->data[i]);
1289
          resp_bread->data[i] = htonl(resp_bread->data[i]);
1290
          err = err ? err : t_err;
1291
        }
1292
      resp_bread->status = htonl(err);
1293
      resp_bread->nRegisters = htonl(msg_bread.nRegisters);
1294
      if(gdb_write(resp_bread,len) < 0)
1295
        {
1296
          if(gdb_fd)
1297
            {
1298
              perror("gdb socket - 6");
1299
              close(gdb_fd);
1300
              gdb_fd = 0;
1301
            }
1302
          free(buf);
1303
          return;
1304
        }
1305
      free(buf);
1306 212 erez
      buf = NULL;
1307 221 markom
      resp_bread = NULL;
1308 139 chris
      break;
1309 127 chris
    case JTAG_COMMAND_CHAIN:
1310
      if(length != sizeof(msg_chain) - 8)
1311
        {
1312
          ProtocolClean(length,JTAG_PROXY_PROTOCOL_ERROR);
1313
          return;
1314
        }
1315
      buf = (char*)&msg_chain;
1316
      if(gdb_read(&buf[8],sizeof(msg_chain)-8) < 0)
1317
        {
1318
          if(gdb_fd)
1319
            {
1320
              perror("gdb socket - 7");
1321
              close(gdb_fd);
1322
              gdb_fd = 0;
1323
            }
1324
          return;
1325
        }
1326
      msg_chain.chain = htonl(msg_chain.chain);
1327
      err = DebugSetChain(msg_chain.chain);
1328
      resp_chain.status = htonl(err);
1329
      if(gdb_write(&resp_chain,sizeof(resp_chain)) < 0)
1330
        {
1331
          if(gdb_fd)
1332
            {
1333
              perror("gdb socket - 8");
1334
              close(gdb_fd);
1335
              gdb_fd = 0;
1336
            }
1337
          return;
1338
        }
1339
      break;
1340
    default:
1341
      ProtocolClean(length,JTAG_PROXY_COMMAND_NOT_IMPLEMENTED);
1342
      break;
1343
    }
1344 123 markom
}
1345 127 chris
 
1346
void ProtocolClean(int length,int32_t err)
1347
{
1348
  char buf[4096];
1349
 
1350
  err = htonl(err);
1351
  if((gdb_read(buf,length) < 0) ||
1352
      (gdb_write(&err,sizeof(err)) < 0) && gdb_fd)
1353
    {
1354
      perror("gdb socket - 9");
1355
      close(gdb_fd);
1356
      gdb_fd = 0;
1357
    }
1358
}
1359
 
1360
static int gdb_write(void* buf,int len)
1361
{
1362
  int n;
1363
  char* w_buf = (char*)buf;
1364
  struct pollfd block;
1365
 
1366
  while(len)
1367
    {
1368
      if((n = write(gdb_fd,w_buf,len)) < 0)
1369
        {
1370
          switch(errno)
1371
            {
1372
            case EWOULDBLOCK: /* or EAGAIN */
1373
              /* We've been called on a descriptor marked
1374
                 for nonblocking I/O. We better simulate
1375
                 blocking behavior. */
1376
              block.fd = gdb_fd;
1377
              block.events = POLLOUT;
1378
              block.revents = 0;
1379
              poll(&block,1,-1);
1380
              continue;
1381
            case EINTR:
1382
              continue;
1383
            case EPIPE:
1384
              close(gdb_fd);
1385
              gdb_fd = 0;
1386
              return -1;
1387
            default:
1388
              return -1;
1389
            }
1390
        }
1391
      else
1392
        {
1393
          len -= n;
1394
          w_buf += n;
1395
        }
1396
    }
1397
  return 0;
1398
}
1399
 
1400
static int gdb_read(void* buf,int len)
1401
{
1402
  int n;
1403
  char* r_buf = (char*)buf;
1404
  struct pollfd block;
1405
 
1406
  while(len)
1407
    {
1408
      if((n = read(gdb_fd,r_buf,len)) < 0)
1409
        {
1410
          switch(errno)
1411
            {
1412
            case EWOULDBLOCK: /* or EAGAIN */
1413
              /* We've been called on a descriptor marked
1414
                 for nonblocking I/O. We better simulate
1415
                 blocking behavior. */
1416
              block.fd = gdb_fd;
1417
              block.events = POLLIN;
1418
              block.revents = 0;
1419
              poll(&block,1,-1);
1420
              continue;
1421
            case EINTR:
1422
              continue;
1423
            default:
1424
              return -1;
1425
            }
1426
        }
1427
      else if(n == 0)
1428
        {
1429
          close(gdb_fd);
1430
          gdb_fd = 0;
1431
          return -1;
1432
        }
1433
      else
1434
        {
1435
          len -= n;
1436
          r_buf += n;
1437
        }
1438
    }
1439
  return 0;
1440
}

powered by: WebSVN 2.1.0

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