Updated and New translations from the Translation Project.
[platform/upstream/binutils.git] / sim / mips / interp.c
1 /*> interp.c <*/
2 /* Simulator for the MIPS architecture.
3
4    This file is part of the MIPS sim
5
6                 THIS SOFTWARE IS NOT COPYRIGHTED
7
8    Cygnus offers the following for use in the public domain.  Cygnus
9    makes no warranty with regard to the software or it's performance
10    and the user accepts the software "AS IS" with all faults.
11
12    CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
13    THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
15
16 NOTEs:
17
18 The IDT monitor (found on the VR4300 board), seems to lie about
19 register contents. It seems to treat the registers as sign-extended
20 32-bit values. This cause *REAL* problems when single-stepping 64-bit
21 code on the hardware.
22
23 */
24
25 /* The TRACE manifests enable the provision of extra features. If they
26    are not defined then a simpler (quicker) simulator is constructed
27    without the required run-time checks, etc. */
28 #if 1 /* 0 to allow user build selection, 1 to force inclusion */
29 #define TRACE (1)
30 #endif
31
32 #include "config.h"
33 #include "bfd.h"
34 #include "sim-main.h"
35 #include "sim-utils.h"
36 #include "sim-options.h"
37 #include "sim-assert.h"
38 #include "sim-hw.h"
39
40 #include "itable.h"
41
42
43 #include "config.h"
44
45 #include <stdio.h>
46 #include <stdarg.h>
47 #include <ansidecl.h>
48 #include <ctype.h>
49 #include <limits.h>
50 #include <math.h>
51 #ifdef HAVE_STDLIB_H
52 #include <stdlib.h>
53 #endif
54 #ifdef HAVE_STRING_H
55 #include <string.h>
56 #else
57 #ifdef HAVE_STRINGS_H
58 #include <strings.h>
59 #endif
60 #endif
61
62 #include "getopt.h"
63 #include "libiberty.h"
64 #include "bfd.h"
65 #include "gdb/callback.h"   /* GDB simulator callback interface */
66 #include "gdb/remote-sim.h" /* GDB simulator interface */
67
68 char* pr_addr (SIM_ADDR addr);
69 char* pr_uword64 (uword64 addr);
70
71
72 /* Within interp.c we refer to the sim_state and sim_cpu directly. */
73 #define CPU cpu
74 #define SD sd
75
76
77 /* The following reserved instruction value is used when a simulator
78    trap is required. NOTE: Care must be taken, since this value may be
79    used in later revisions of the MIPS ISA. */
80
81 #define RSVD_INSTRUCTION           (0x00000005)
82 #define RSVD_INSTRUCTION_MASK      (0xFC00003F)
83
84 #define RSVD_INSTRUCTION_ARG_SHIFT 6
85 #define RSVD_INSTRUCTION_ARG_MASK  0xFFFFF  
86
87
88 /* Bits in the Debug register */
89 #define Debug_DBD 0x80000000   /* Debug Branch Delay */
90 #define Debug_DM  0x40000000   /* Debug Mode         */
91 #define Debug_DBp 0x00000002   /* Debug Breakpoint indicator */
92
93 /*---------------------------------------------------------------------------*/
94 /*-- GDB simulator interface ------------------------------------------------*/
95 /*---------------------------------------------------------------------------*/
96
97 static void ColdReset (SIM_DESC sd);
98
99 /*---------------------------------------------------------------------------*/
100
101
102
103 #define DELAYSLOT()     {\
104                           if (STATE & simDELAYSLOT)\
105                             sim_io_eprintf(sd,"Delay slot already activated (branch in delay slot?)\n");\
106                           STATE |= simDELAYSLOT;\
107                         }
108
109 #define JALDELAYSLOT()  {\
110                           DELAYSLOT ();\
111                           STATE |= simJALDELAYSLOT;\
112                         }
113
114 #define NULLIFY()       {\
115                           STATE &= ~simDELAYSLOT;\
116                           STATE |= simSKIPNEXT;\
117                         }
118
119 #define CANCELDELAYSLOT() {\
120                             DSSTATE = 0;\
121                             STATE &= ~(simDELAYSLOT | simJALDELAYSLOT);\
122                           }
123
124 #define INDELAYSLOT()   ((STATE & simDELAYSLOT) != 0)
125 #define INJALDELAYSLOT() ((STATE & simJALDELAYSLOT) != 0)
126
127 /* Note that the monitor code essentially assumes this layout of memory.
128    If you change these, change the monitor code, too.  */
129 /* FIXME Currently addresses are truncated to 32-bits, see
130    mips/sim-main.c:address_translation(). If that changes, then these
131    values will need to be extended, and tested for more carefully. */
132 #define K0BASE  (0x80000000)
133 #define K0SIZE  (0x20000000)
134 #define K1BASE  (0xA0000000)
135 #define K1SIZE  (0x20000000)
136
137 /* Simple run-time monitor support.
138    
139    We emulate the monitor by placing magic reserved instructions at
140    the monitor's entry points; when we hit these instructions, instead
141    of raising an exception (as we would normally), we look at the
142    instruction and perform the appropriate monitory operation.
143    
144    `*_monitor_base' are the physical addresses at which the corresponding 
145         monitor vectors are located.  `0' means none.  By default,
146         install all three.
147     The RSVD_INSTRUCTION... macros specify the magic instructions we
148     use at the monitor entry points.  */
149 static int firmware_option_p = 0;
150 static SIM_ADDR idt_monitor_base =     0xBFC00000;
151 static SIM_ADDR pmon_monitor_base =    0xBFC00500;
152 static SIM_ADDR lsipmon_monitor_base = 0xBFC00200;
153
154 static SIM_RC sim_firmware_command (SIM_DESC sd, char* arg);
155
156
157 #define MEM_SIZE (8 << 20)      /* 8 MBytes */
158
159
160 #if defined(TRACE)
161 static char *tracefile = "trace.din"; /* default filename for trace log */
162 FILE *tracefh = NULL;
163 static void open_trace (SIM_DESC sd);
164 #endif /* TRACE */
165
166 static const char * get_insn_name (sim_cpu *, int);
167
168 /* simulation target board.  NULL=canonical */
169 static char* board = NULL;
170
171
172 static DECLARE_OPTION_HANDLER (mips_option_handler);
173
174 enum {
175   OPTION_DINERO_TRACE = OPTION_START,
176   OPTION_DINERO_FILE,
177   OPTION_FIRMWARE,
178   OPTION_INFO_MEMORY,
179   OPTION_BOARD
180 };
181
182 static int display_mem_info = 0;
183
184 static SIM_RC
185 mips_option_handler (sd, cpu, opt, arg, is_command)
186      SIM_DESC sd;
187      sim_cpu *cpu;
188      int opt;
189      char *arg;
190      int is_command;
191 {
192   int cpu_nr;
193   switch (opt)
194     {
195     case OPTION_DINERO_TRACE: /* ??? */
196 #if defined(TRACE)
197       /* Eventually the simTRACE flag could be treated as a toggle, to
198          allow external control of the program points being traced
199          (i.e. only from main onwards, excluding the run-time setup,
200          etc.). */
201       for (cpu_nr = 0; cpu_nr < MAX_NR_PROCESSORS; cpu_nr++)
202         {
203           sim_cpu *cpu = STATE_CPU (sd, cpu_nr);
204           if (arg == NULL)
205             STATE |= simTRACE;
206           else if (strcmp (arg, "yes") == 0)
207             STATE |= simTRACE;
208           else if (strcmp (arg, "no") == 0)
209             STATE &= ~simTRACE;
210           else if (strcmp (arg, "on") == 0)
211             STATE |= simTRACE;
212           else if (strcmp (arg, "off") == 0)
213             STATE &= ~simTRACE;
214           else
215             {
216               fprintf (stderr, "Unrecognized dinero-trace option `%s'\n", arg);
217               return SIM_RC_FAIL;
218             }
219         }
220       return SIM_RC_OK;
221 #else /* !TRACE */
222       fprintf(stderr,"\
223 Simulator constructed without dinero tracing support (for performance).\n\
224 Re-compile simulator with \"-DTRACE\" to enable this option.\n");
225       return SIM_RC_FAIL;
226 #endif /* !TRACE */
227
228     case OPTION_DINERO_FILE:
229 #if defined(TRACE)
230       if (optarg != NULL) {
231         char *tmp;
232         tmp = (char *)malloc(strlen(optarg) + 1);
233         if (tmp == NULL)
234           {
235             sim_io_printf(sd,"Failed to allocate buffer for tracefile name \"%s\"\n",optarg);
236             return SIM_RC_FAIL;
237           }
238         else {
239           strcpy(tmp,optarg);
240           tracefile = tmp;
241           sim_io_printf(sd,"Placing trace information into file \"%s\"\n",tracefile);
242         }
243       }
244 #endif /* TRACE */
245       return SIM_RC_OK;
246
247     case OPTION_FIRMWARE:
248       return sim_firmware_command (sd, arg);
249
250     case OPTION_BOARD:
251       {
252         if (arg)
253           {
254             board = zalloc(strlen(arg) + 1);
255             strcpy(board, arg);
256           }
257         return SIM_RC_OK;
258       }
259
260     case OPTION_INFO_MEMORY:
261       display_mem_info = 1;
262       break;
263     }
264   
265   return SIM_RC_OK;
266 }
267
268
269 static const OPTION mips_options[] =
270 {
271   { {"dinero-trace", optional_argument, NULL, OPTION_DINERO_TRACE},
272       '\0', "on|off", "Enable dinero tracing",
273       mips_option_handler },
274   { {"dinero-file", required_argument, NULL, OPTION_DINERO_FILE},
275       '\0', "FILE", "Write dinero trace to FILE",
276       mips_option_handler },
277   { {"firmware", required_argument, NULL, OPTION_FIRMWARE},
278     '\0', "[idt|pmon|lsipmon|none][@ADDRESS]", "Emulate ROM monitor",
279     mips_option_handler },
280   { {"board", required_argument, NULL, OPTION_BOARD},
281      '\0', "none" /* rely on compile-time string concatenation for other options */
282
283 #define BOARD_JMR3904 "jmr3904"
284            "|" BOARD_JMR3904
285 #define BOARD_JMR3904_PAL "jmr3904pal"
286            "|" BOARD_JMR3904_PAL
287 #define BOARD_JMR3904_DEBUG "jmr3904debug"
288            "|" BOARD_JMR3904_DEBUG
289 #define BOARD_BSP "bsp"
290            "|" BOARD_BSP
291
292     , "Customize simulation for a particular board.", mips_option_handler },
293
294   /* These next two options have the same names as ones found in the
295      memory_options[] array in common/sim-memopt.c.  This is because
296      the intention is to provide an alternative handler for those two
297      options.  We need an alternative handler because the memory
298      regions are not set up until after the command line arguments
299      have been parsed, and so we cannot display the memory info whilst
300      processing the command line.  There is a hack in sim_open to
301      remove these handlers when we want the real --memory-info option
302      to work.  */
303   { { "info-memory", no_argument, NULL, OPTION_INFO_MEMORY },
304     '\0', NULL, "List configured memory regions", mips_option_handler },
305   { { "memory-info", no_argument, NULL, OPTION_INFO_MEMORY },
306     '\0', NULL, NULL, mips_option_handler },
307   
308   { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
309 };
310
311
312 int interrupt_pending;
313
314 void
315 interrupt_event (SIM_DESC sd, void *data)
316 {
317   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
318   address_word cia = CIA_GET (cpu);
319   if (SR & status_IE)
320     {
321       interrupt_pending = 0;
322       SignalExceptionInterrupt (1); /* interrupt "1" */
323     }
324   else if (!interrupt_pending)
325     sim_events_schedule (sd, 1, interrupt_event, data);
326 }
327
328
329 /*---------------------------------------------------------------------------*/
330 /*-- Device registration hook -----------------------------------------------*/
331 /*---------------------------------------------------------------------------*/
332 static void device_init(SIM_DESC sd) {
333 #ifdef DEVICE_INIT
334   extern void register_devices(SIM_DESC);
335   register_devices(sd);
336 #endif
337 }
338
339 /*---------------------------------------------------------------------------*/
340 /*-- GDB simulator interface ------------------------------------------------*/
341 /*---------------------------------------------------------------------------*/
342
343 SIM_DESC
344 sim_open (kind, cb, abfd, argv)
345      SIM_OPEN_KIND kind;
346      host_callback *cb;
347      struct bfd *abfd;
348      char **argv;
349 {
350   SIM_DESC sd = sim_state_alloc (kind, cb);
351   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
352
353   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
354
355   /* FIXME: watchpoints code shouldn't need this */
356   STATE_WATCHPOINTS (sd)->pc = &(PC);
357   STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC);
358   STATE_WATCHPOINTS (sd)->interrupt_handler = interrupt_event;
359
360   /* Initialize the mechanism for doing insn profiling.  */
361   CPU_INSN_NAME (cpu) = get_insn_name;
362   CPU_MAX_INSNS (cpu) = nr_itable_entries;
363
364   STATE = 0;
365   
366   if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
367     return 0;
368   sim_add_option_table (sd, NULL, mips_options);
369
370
371   /* getopt will print the error message so we just have to exit if this fails.
372      FIXME: Hmmm...  in the case of gdb we need getopt to call
373      print_filtered.  */
374   if (sim_parse_args (sd, argv) != SIM_RC_OK)
375     {
376       /* Uninstall the modules to avoid memory leaks,
377          file descriptor leaks, etc.  */
378       sim_module_uninstall (sd);
379       return 0;
380     }
381
382   /* handle board-specific memory maps */
383   if (board == NULL)
384     {
385       /* Allocate core managed memory */
386       sim_memopt *entry, *match = NULL;
387       address_word mem_size = 0;
388       int mapped = 0;
389
390       /* For compatibility with the old code - under this (at level one)
391          are the kernel spaces K0 & K1.  Both of these map to a single
392          smaller sub region */
393       sim_do_command(sd," memory region 0x7fff8000,0x8000") ; /* MTZ- 32 k stack */
394
395       /* Look for largest memory region defined on command-line at
396          phys address 0. */
397 #ifdef SIM_HAVE_FLATMEM
398       mem_size = STATE_MEM_SIZE (sd);
399 #endif
400       for (entry = STATE_MEMOPT (sd); entry != NULL; entry = entry->next)
401         {
402           /* If we find an entry at address 0, then we will end up
403              allocating a new buffer in the "memory alias" command
404              below. The region at address 0 will be deleted. */
405           address_word size = (entry->modulo != 0
406                                ? entry->modulo : entry->nr_bytes);
407           if (entry->addr == 0
408               && (!match || entry->level < match->level))
409             match = entry;
410           else if (entry->addr == K0BASE || entry->addr == K1BASE)
411             mapped = 1;
412           else
413             {
414               sim_memopt *alias;
415               for (alias = entry->alias; alias != NULL; alias = alias->next)
416                 {
417                   if (alias->addr == 0
418                       && (!match || entry->level < match->level))
419                     match = entry;
420                   else if (alias->addr == K0BASE || alias->addr == K1BASE)
421                     mapped = 1;
422                 }
423             }
424         }
425
426       if (!mapped)
427         {
428           if (match)
429             {
430               /* Get existing memory region size. */
431               mem_size = (match->modulo != 0
432                           ? match->modulo : match->nr_bytes);
433               /* Delete old region. */
434               sim_do_commandf (sd, "memory delete %d:0x%lx@%d",
435                                match->space, match->addr, match->level);
436             }         
437           else if (mem_size == 0)
438             mem_size = MEM_SIZE;
439           /* Limit to KSEG1 size (512MB) */
440           if (mem_size > K1SIZE)
441             mem_size = K1SIZE;
442           /* memory alias K1BASE@1,K1SIZE%MEMSIZE,K0BASE */
443           sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx%%0x%lx,0x%0x",
444                            K1BASE, K1SIZE, (long)mem_size, K0BASE);
445         }
446
447       device_init(sd);
448     }
449   else if (board != NULL
450            && (strcmp(board, BOARD_BSP) == 0))
451     {
452       int i;
453
454       STATE_ENVIRONMENT (sd) = OPERATING_ENVIRONMENT;
455
456       /* ROM: 0x9FC0_0000 - 0x9FFF_FFFF and 0xBFC0_0000 - 0xBFFF_FFFF */
457       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
458                        0x9FC00000, 
459                        4 * 1024 * 1024, /* 4 MB */
460                        0xBFC00000);
461
462       /* SRAM: 0x8000_0000 - 0x803F_FFFF and 0xA000_0000 - 0xA03F_FFFF */
463       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
464                        0x80000000, 
465                        4 * 1024 * 1024, /* 4 MB */
466                        0xA0000000);
467
468       /* DRAM: 0x8800_0000 - 0x89FF_FFFF and 0xA800_0000 - 0xA9FF_FFFF */
469       for (i=0; i<8; i++) /* 32 MB total */
470         {
471           unsigned size = 4 * 1024 * 1024;  /* 4 MB */
472           sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
473                            0x88000000 + (i * size), 
474                            size, 
475                            0xA8000000 + (i * size));
476         }
477     }
478 #if (WITH_HW)
479   else if (board != NULL
480            && (strcmp(board, BOARD_JMR3904) == 0 ||
481                strcmp(board, BOARD_JMR3904_PAL) == 0 ||
482                strcmp(board, BOARD_JMR3904_DEBUG) == 0))
483     {
484       /* match VIRTUAL memory layout of JMR-TX3904 board */
485       int i;
486
487       /* --- disable monitor unless forced on by user --- */
488
489       if (! firmware_option_p)
490         {
491           idt_monitor_base = 0;
492           pmon_monitor_base = 0;
493           lsipmon_monitor_base = 0;
494         }
495
496       /* --- environment --- */
497
498       STATE_ENVIRONMENT (sd) = OPERATING_ENVIRONMENT;
499
500       /* --- memory --- */
501
502       /* ROM: 0x9FC0_0000 - 0x9FFF_FFFF and 0xBFC0_0000 - 0xBFFF_FFFF */
503       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
504                        0x9FC00000, 
505                        4 * 1024 * 1024, /* 4 MB */
506                        0xBFC00000);
507
508       /* SRAM: 0x8000_0000 - 0x803F_FFFF and 0xA000_0000 - 0xA03F_FFFF */
509       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
510                        0x80000000, 
511                        4 * 1024 * 1024, /* 4 MB */
512                        0xA0000000);
513
514       /* DRAM: 0x8800_0000 - 0x89FF_FFFF and 0xA800_0000 - 0xA9FF_FFFF */
515       for (i=0; i<8; i++) /* 32 MB total */
516         {
517           unsigned size = 4 * 1024 * 1024;  /* 4 MB */
518           sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx,0x%0x",
519                            0x88000000 + (i * size), 
520                            size, 
521                            0xA8000000 + (i * size));
522         }
523
524       /* Dummy memory regions for unsimulated devices - sorted by address */
525
526       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xB1000000, 0x400); /* ISA I/O */
527       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xB2100000, 0x004); /* ISA ctl */
528       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xB2500000, 0x004); /* LED/switch */
529       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xB2700000, 0x004); /* RTC */
530       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xB3C00000, 0x004); /* RTC */
531       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xFFFF8000, 0x900); /* DRAMC */
532       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xFFFF9000, 0x200); /* EBIF */
533       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xFFFFE000, 0x01c); /* EBIF */
534       sim_do_commandf (sd, "memory alias 0x%lx@1,0x%lx", 0xFFFFF500, 0x300); /* PIO */
535
536
537       /* --- simulated devices --- */
538       sim_hw_parse (sd, "/tx3904irc@0xffffc000/reg 0xffffc000 0x20");
539       sim_hw_parse (sd, "/tx3904cpu");
540       sim_hw_parse (sd, "/tx3904tmr@0xfffff000/reg 0xfffff000 0x100");
541       sim_hw_parse (sd, "/tx3904tmr@0xfffff100/reg 0xfffff100 0x100");
542       sim_hw_parse (sd, "/tx3904tmr@0xfffff200/reg 0xfffff200 0x100");
543       sim_hw_parse (sd, "/tx3904sio@0xfffff300/reg 0xfffff300 0x100");
544       {
545         /* FIXME: poking at dv-sockser internals, use tcp backend if
546          --sockser_addr option was given.*/
547         extern char* sockser_addr;
548         if(sockser_addr == NULL)
549           sim_hw_parse (sd, "/tx3904sio@0xfffff300/backend stdio");
550         else
551           sim_hw_parse (sd, "/tx3904sio@0xfffff300/backend tcp");
552       }
553       sim_hw_parse (sd, "/tx3904sio@0xfffff400/reg 0xfffff400 0x100");
554       sim_hw_parse (sd, "/tx3904sio@0xfffff400/backend stdio");
555
556       /* -- device connections --- */
557       sim_hw_parse (sd, "/tx3904irc > ip level /tx3904cpu");
558       sim_hw_parse (sd, "/tx3904tmr@0xfffff000 > int tmr0 /tx3904irc");
559       sim_hw_parse (sd, "/tx3904tmr@0xfffff100 > int tmr1 /tx3904irc");
560       sim_hw_parse (sd, "/tx3904tmr@0xfffff200 > int tmr2 /tx3904irc");
561       sim_hw_parse (sd, "/tx3904sio@0xfffff300 > int sio0 /tx3904irc");
562       sim_hw_parse (sd, "/tx3904sio@0xfffff400 > int sio1 /tx3904irc");
563
564       /* add PAL timer & I/O module */
565       if(! strcmp(board, BOARD_JMR3904_PAL))
566         {
567          /* the device */
568          sim_hw_parse (sd, "/pal@0xffff0000");
569          sim_hw_parse (sd, "/pal@0xffff0000/reg 0xffff0000 64");
570
571          /* wire up interrupt ports to irc */
572          sim_hw_parse (sd, "/pal@0x31000000 > countdown tmr0 /tx3904irc");
573          sim_hw_parse (sd, "/pal@0x31000000 > timer tmr1 /tx3904irc");
574          sim_hw_parse (sd, "/pal@0x31000000 > int int0 /tx3904irc");
575         }
576
577       if(! strcmp(board, BOARD_JMR3904_DEBUG))
578         {
579           /* -- DEBUG: glue interrupt generators --- */
580           sim_hw_parse (sd, "/glue@0xffff0000/reg 0xffff0000 0x50");
581           sim_hw_parse (sd, "/glue@0xffff0000 > int0 int0 /tx3904irc");
582           sim_hw_parse (sd, "/glue@0xffff0000 > int1 int1 /tx3904irc");
583           sim_hw_parse (sd, "/glue@0xffff0000 > int2 int2 /tx3904irc");
584           sim_hw_parse (sd, "/glue@0xffff0000 > int3 int3 /tx3904irc");
585           sim_hw_parse (sd, "/glue@0xffff0000 > int4 int4 /tx3904irc");
586           sim_hw_parse (sd, "/glue@0xffff0000 > int5 int5 /tx3904irc");
587           sim_hw_parse (sd, "/glue@0xffff0000 > int6 int6 /tx3904irc");
588           sim_hw_parse (sd, "/glue@0xffff0000 > int7 int7 /tx3904irc");
589           sim_hw_parse (sd, "/glue@0xffff0000 > int8 dmac0 /tx3904irc");
590           sim_hw_parse (sd, "/glue@0xffff0000 > int9 dmac1 /tx3904irc");
591           sim_hw_parse (sd, "/glue@0xffff0000 > int10 dmac2 /tx3904irc");
592           sim_hw_parse (sd, "/glue@0xffff0000 > int11 dmac3 /tx3904irc");
593           sim_hw_parse (sd, "/glue@0xffff0000 > int12 sio0 /tx3904irc");
594           sim_hw_parse (sd, "/glue@0xffff0000 > int13 sio1 /tx3904irc");
595           sim_hw_parse (sd, "/glue@0xffff0000 > int14 tmr0 /tx3904irc");
596           sim_hw_parse (sd, "/glue@0xffff0000 > int15 tmr1 /tx3904irc");
597           sim_hw_parse (sd, "/glue@0xffff0000 > int16 tmr2 /tx3904irc");
598           sim_hw_parse (sd, "/glue@0xffff0000 > int17 nmi /tx3904cpu");
599         }
600
601       device_init(sd);
602     }
603 #endif
604
605   if (display_mem_info)
606     {
607       struct option_list * ol;
608       struct option_list * prev;
609
610       /* This is a hack.  We want to execute the real --memory-info command
611          line switch which is handled in common/sim-memopts.c, not the
612          override we have defined in this file.  So we remove the
613          mips_options array from the state options list.  This is safe
614          because we have now processed all of the command line.  */
615       for (ol = STATE_OPTIONS (sd), prev = NULL;
616            ol != NULL;
617            prev = ol, ol = ol->next)
618         if (ol->options == mips_options)
619           break;
620
621       SIM_ASSERT (ol != NULL);
622
623       if (prev == NULL)
624         STATE_OPTIONS (sd) = ol->next;
625       else
626         prev->next = ol->next;
627
628       sim_do_commandf (sd, "memory-info");
629     }
630
631   /* check for/establish the a reference program image */
632   if (sim_analyze_program (sd,
633                            (STATE_PROG_ARGV (sd) != NULL
634                             ? *STATE_PROG_ARGV (sd)
635                             : NULL),
636                            abfd) != SIM_RC_OK)
637     {
638       sim_module_uninstall (sd);
639       return 0;
640     }
641
642   /* Configure/verify the target byte order and other runtime
643      configuration options */
644   if (sim_config (sd) != SIM_RC_OK)
645     {
646       sim_module_uninstall (sd);
647       return 0;
648     }
649
650   if (sim_post_argv_init (sd) != SIM_RC_OK)
651     {
652       /* Uninstall the modules to avoid memory leaks,
653          file descriptor leaks, etc.  */
654       sim_module_uninstall (sd);
655       return 0;
656     }
657
658   /* verify assumptions the simulator made about the host type system.
659      This macro does not return if there is a problem */
660   SIM_ASSERT (sizeof(int) == (4 * sizeof(char)));
661   SIM_ASSERT (sizeof(word64) == (8 * sizeof(char)));
662
663   /* This is NASTY, in that we are assuming the size of specific
664      registers: */
665   {
666     int rn;
667     for (rn = 0; (rn < (LAST_EMBED_REGNUM + 1)); rn++)
668       {
669         if (rn < 32)
670           cpu->register_widths[rn] = WITH_TARGET_WORD_BITSIZE;
671         else if ((rn >= FGR_BASE) && (rn < (FGR_BASE + NR_FGR)))
672           cpu->register_widths[rn] = WITH_TARGET_FLOATING_POINT_BITSIZE;
673         else if ((rn >= 33) && (rn <= 37))
674           cpu->register_widths[rn] = WITH_TARGET_WORD_BITSIZE;
675         else if ((rn == SRIDX)
676                  || (rn == FCR0IDX)
677                  || (rn == FCR31IDX)
678                  || ((rn >= 72) && (rn <= 89)))
679           cpu->register_widths[rn] = 32;
680         else
681           cpu->register_widths[rn] = 0;
682       }
683
684
685   }
686
687 #if defined(TRACE)
688   if (STATE & simTRACE)
689     open_trace(sd);
690 #endif /* TRACE */
691
692   /*
693   sim_io_eprintf (sd, "idt@%x pmon@%x lsipmon@%x\n", 
694                   idt_monitor_base,
695                   pmon_monitor_base, 
696                   lsipmon_monitor_base);
697   */
698
699   /* Write the monitor trap address handlers into the monitor (eeprom)
700      address space.  This can only be done once the target endianness
701      has been determined. */
702   if (idt_monitor_base != 0)
703     {
704       unsigned loop;
705       unsigned idt_monitor_size = 1 << 11;
706
707       /* the default monitor region */
708       sim_do_commandf (sd, "memory region 0x%x,0x%x",
709                        idt_monitor_base, idt_monitor_size);
710
711       /* Entry into the IDT monitor is via fixed address vectors, and
712          not using machine instructions. To avoid clashing with use of
713          the MIPS TRAP system, we place our own (simulator specific)
714          "undefined" instructions into the relevant vector slots. */
715       for (loop = 0; (loop < idt_monitor_size); loop += 4)
716         {
717           address_word vaddr = (idt_monitor_base + loop);
718           unsigned32 insn = (RSVD_INSTRUCTION |
719                              (((loop >> 2) & RSVD_INSTRUCTION_ARG_MASK)
720                               << RSVD_INSTRUCTION_ARG_SHIFT));
721           H2T (insn);
722           sim_write (sd, vaddr, (char *)&insn, sizeof (insn));
723         }
724     }
725
726   if ((pmon_monitor_base != 0) || (lsipmon_monitor_base != 0))
727     {
728     /* The PMON monitor uses the same address space, but rather than
729        branching into it the address of a routine is loaded. We can
730        cheat for the moment, and direct the PMON routine to IDT style
731        instructions within the monitor space. This relies on the IDT
732        monitor not using the locations from 0xBFC00500 onwards as its
733        entry points.*/
734       unsigned loop;
735       for (loop = 0; (loop < 24); loop++)
736         {
737           unsigned32 value = ((0x500 - 8) / 8); /* default UNDEFINED reason code */
738           switch (loop)
739             {
740             case 0: /* read */
741               value = 7;
742               break;
743             case 1: /* write */
744               value = 8;
745               break;
746             case 2: /* open */
747               value = 6;
748               break;
749             case 3: /* close */
750               value = 10;
751               break;
752             case 5: /* printf */
753               value = ((0x500 - 16) / 8); /* not an IDT reason code */
754               break;
755             case 8: /* cliexit */
756               value = 17;
757               break;
758             case 11: /* flush_cache */
759               value = 28;
760               break;
761           }
762
763         SIM_ASSERT (idt_monitor_base != 0);
764         value = ((unsigned int) idt_monitor_base + (value * 8));
765         H2T (value);
766
767         if (pmon_monitor_base != 0)
768           {
769             address_word vaddr = (pmon_monitor_base + (loop * 4));
770             sim_write (sd, vaddr, (char *)&value, sizeof (value));
771           }
772
773         if (lsipmon_monitor_base != 0)
774           {
775             address_word vaddr = (lsipmon_monitor_base + (loop * 4));
776             sim_write (sd, vaddr, (char *)&value, sizeof (value));
777           }
778       }
779
780   /* Write an abort sequence into the TRAP (common) exception vector
781      addresses.  This is to catch code executing a TRAP (et.al.)
782      instruction without installing a trap handler. */
783   if ((idt_monitor_base != 0) || 
784       (pmon_monitor_base != 0) || 
785       (lsipmon_monitor_base != 0))
786     {
787       unsigned32 halt[2] = { 0x2404002f /* addiu r4, r0, 47 */,
788                              HALT_INSTRUCTION /* BREAK */ };
789       H2T (halt[0]);
790       H2T (halt[1]);
791       sim_write (sd, 0x80000000, (char *) halt, sizeof (halt));
792       sim_write (sd, 0x80000180, (char *) halt, sizeof (halt));
793       sim_write (sd, 0x80000200, (char *) halt, sizeof (halt));
794       /* XXX: Write here unconditionally? */
795       sim_write (sd, 0xBFC00200, (char *) halt, sizeof (halt));
796       sim_write (sd, 0xBFC00380, (char *) halt, sizeof (halt));
797       sim_write (sd, 0xBFC00400, (char *) halt, sizeof (halt));
798     }
799   }
800
801
802
803   return sd;
804 }
805
806 #if defined(TRACE)
807 static void
808 open_trace(sd)
809      SIM_DESC sd;
810 {
811   tracefh = fopen(tracefile,"wb+");
812   if (tracefh == NULL)
813     {
814       sim_io_eprintf(sd,"Failed to create file \"%s\", writing trace information to stderr.\n",tracefile);
815       tracefh = stderr;
816   }
817 }
818 #endif /* TRACE */
819
820 /* Return name of an insn, used by insn profiling.  */
821 static const char *
822 get_insn_name (sim_cpu *cpu, int i)
823 {
824   return itable[i].name;
825 }
826
827 void
828 sim_close (sd, quitting)
829      SIM_DESC sd;
830      int quitting;
831 {
832 #ifdef DEBUG
833   printf("DBG: sim_close: entered (quitting = %d)\n",quitting);
834 #endif
835
836
837   /* "quitting" is non-zero if we cannot hang on errors */
838
839   /* shut down modules */
840   sim_module_uninstall (sd);
841
842   /* Ensure that any resources allocated through the callback
843      mechanism are released: */
844   sim_io_shutdown (sd);
845
846 #if defined(TRACE)
847   if (tracefh != NULL && tracefh != stderr)
848    fclose(tracefh);
849   tracefh = NULL;
850 #endif /* TRACE */
851
852   /* FIXME - free SD */
853
854   return;
855 }
856
857
858 int
859 sim_write (sd,addr,buffer,size)
860      SIM_DESC sd;
861      SIM_ADDR addr;
862      const unsigned char *buffer;
863      int size;
864 {
865   int index;
866   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
867
868   /* Return the number of bytes written, or zero if error. */
869 #ifdef DEBUG
870   sim_io_printf(sd,"sim_write(0x%s,buffer,%d);\n",pr_addr(addr),size);
871 #endif
872
873   /* We use raw read and write routines, since we do not want to count
874      the GDB memory accesses in our statistics gathering. */
875
876   for (index = 0; index < size; index++)
877     {
878       address_word vaddr = (address_word)addr + index;
879       address_word paddr;
880       int cca;
881       if (!address_translation (SD, CPU, NULL_CIA, vaddr, isDATA, isSTORE, &paddr, &cca, isRAW))
882         break;
883       if (sim_core_write_buffer (SD, CPU, read_map, buffer + index, paddr, 1) != 1)
884         break;
885     }
886
887   return(index);
888 }
889
890 int
891 sim_read (sd,addr,buffer,size)
892      SIM_DESC sd;
893      SIM_ADDR addr;
894      unsigned char *buffer;
895      int size;
896 {
897   int index;
898   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
899
900   /* Return the number of bytes read, or zero if error. */
901 #ifdef DEBUG
902   sim_io_printf(sd,"sim_read(0x%s,buffer,%d);\n",pr_addr(addr),size);
903 #endif /* DEBUG */
904
905   for (index = 0; (index < size); index++)
906     {
907       address_word vaddr = (address_word)addr + index;
908       address_word paddr;
909       int cca;
910       if (!address_translation (SD, CPU, NULL_CIA, vaddr, isDATA, isLOAD, &paddr, &cca, isRAW))
911         break;
912       if (sim_core_read_buffer (SD, CPU, read_map, buffer + index, paddr, 1) != 1)
913         break;
914     }
915
916   return(index);
917 }
918
919 int
920 sim_store_register (sd,rn,memory,length)
921      SIM_DESC sd;
922      int rn;
923      unsigned char *memory;
924      int length;
925 {
926   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
927   /* NOTE: gdb (the client) stores registers in target byte order
928      while the simulator uses host byte order */
929 #ifdef DEBUG
930   sim_io_printf(sd,"sim_store_register(%d,*memory=0x%s);\n",rn,pr_addr(*((SIM_ADDR *)memory)));
931 #endif /* DEBUG */
932
933   /* Unfortunately this suffers from the same problem as the register
934      numbering one. We need to know what the width of each logical
935      register number is for the architecture being simulated. */
936
937   if (cpu->register_widths[rn] == 0)
938     {
939       sim_io_eprintf(sd,"Invalid register width for %d (register store ignored)\n",rn);
940       return 0;
941     }
942
943
944
945   if (rn >= FGR_BASE && rn < FGR_BASE + NR_FGR)
946     {
947       cpu->fpr_state[rn - FGR_BASE] = fmt_uninterpreted;
948       if (cpu->register_widths[rn] == 32)
949         {
950           if (length == 8)
951             {
952               cpu->fgr[rn - FGR_BASE] = 
953                 (unsigned32) T2H_8 (*(unsigned64*)memory);
954               return 8;
955             }
956           else
957             {
958               cpu->fgr[rn - FGR_BASE] = T2H_4 (*(unsigned32*)memory);
959               return 4;
960             }
961         }
962       else
963         {
964           if (length == 8)
965             {
966               cpu->fgr[rn - FGR_BASE] = T2H_8 (*(unsigned64*)memory);
967               return 8;
968             }
969           else
970             {
971               cpu->fgr[rn - FGR_BASE] = T2H_4 (*(unsigned32*)memory);
972               return 4;
973             }
974         }
975     }
976
977   if (cpu->register_widths[rn] == 32)
978     {
979       if (length == 8)
980         {
981           cpu->registers[rn] =
982             (unsigned32) T2H_8 (*(unsigned64*)memory);
983           return 8;
984         }
985       else
986         {
987           cpu->registers[rn] = T2H_4 (*(unsigned32*)memory);
988           return 4;
989         }
990     }
991   else
992     {
993       if (length == 8)
994         {
995           cpu->registers[rn] = T2H_8 (*(unsigned64*)memory);
996           return 8;
997         }
998       else
999         {
1000           cpu->registers[rn] = (signed32) T2H_4(*(unsigned32*)memory);
1001           return 4;
1002         }
1003     }
1004
1005   return 0;
1006 }
1007
1008 int
1009 sim_fetch_register (sd,rn,memory,length)
1010      SIM_DESC sd;
1011      int rn;
1012      unsigned char *memory;
1013      int length;
1014 {
1015   sim_cpu *cpu = STATE_CPU (sd, 0); /* FIXME */
1016   /* NOTE: gdb (the client) stores registers in target byte order
1017      while the simulator uses host byte order */
1018 #ifdef DEBUG
1019 #if 0  /* FIXME: doesn't compile */
1020   sim_io_printf(sd,"sim_fetch_register(%d=0x%s,mem) : place simulator registers into memory\n",rn,pr_addr(registers[rn]));
1021 #endif
1022 #endif /* DEBUG */
1023
1024   if (cpu->register_widths[rn] == 0)
1025     {
1026       sim_io_eprintf (sd, "Invalid register width for %d (register fetch ignored)\n",rn);
1027       return 0;
1028     }
1029
1030
1031
1032   /* Any floating point register */
1033   if (rn >= FGR_BASE && rn < FGR_BASE + NR_FGR)
1034     {
1035       if (cpu->register_widths[rn] == 32)
1036         {
1037           if (length == 8)
1038             {
1039               *(unsigned64*)memory =
1040                 H2T_8 ((unsigned32) (cpu->fgr[rn - FGR_BASE]));
1041               return 8;
1042             }
1043           else
1044             {
1045               *(unsigned32*)memory = H2T_4 (cpu->fgr[rn - FGR_BASE]);
1046               return 4;
1047             }
1048         }
1049       else
1050         {
1051           if (length == 8)
1052             {
1053               *(unsigned64*)memory = H2T_8 (cpu->fgr[rn - FGR_BASE]);
1054               return 8;
1055             }
1056           else
1057             {
1058               *(unsigned32*)memory = H2T_4 ((unsigned32)(cpu->fgr[rn - FGR_BASE]));
1059               return 4;
1060             }
1061         }
1062     }
1063
1064   if (cpu->register_widths[rn] == 32)
1065     {
1066       if (length == 8)
1067         {
1068           *(unsigned64*)memory =
1069             H2T_8 ((unsigned32) (cpu->registers[rn]));
1070           return 8;
1071         }
1072       else
1073         {
1074           *(unsigned32*)memory = H2T_4 ((unsigned32)(cpu->registers[rn]));
1075           return 4;
1076         }
1077     }
1078   else
1079     {
1080       if (length == 8)
1081         {
1082           *(unsigned64*)memory =
1083             H2T_8 ((unsigned64) (cpu->registers[rn]));
1084           return 8;
1085         }
1086       else
1087         {
1088           *(unsigned32*)memory = H2T_4 ((unsigned32)(cpu->registers[rn]));
1089           return 4;
1090         }
1091     }
1092
1093   return 0;
1094 }
1095
1096
1097 SIM_RC
1098 sim_create_inferior (sd, abfd, argv,env)
1099      SIM_DESC sd;
1100      struct bfd *abfd;
1101      char **argv;
1102      char **env;
1103 {
1104
1105 #ifdef DEBUG
1106 #if 0 /* FIXME: doesn't compile */
1107   printf("DBG: sim_create_inferior entered: start_address = 0x%s\n",
1108          pr_addr(PC));
1109 #endif
1110 #endif /* DEBUG */
1111
1112   ColdReset(sd);
1113
1114   if (abfd != NULL)
1115     {
1116       /* override PC value set by ColdReset () */
1117       int cpu_nr;
1118       for (cpu_nr = 0; cpu_nr < sim_engine_nr_cpus (sd); cpu_nr++)
1119         {
1120           sim_cpu *cpu = STATE_CPU (sd, cpu_nr);
1121           CIA_SET (cpu, (unsigned64) bfd_get_start_address (abfd));
1122         }
1123     }
1124
1125 #if 0 /* def DEBUG */
1126   if (argv || env)
1127     {
1128       /* We should really place the argv slot values into the argument
1129          registers, and onto the stack as required. However, this
1130          assumes that we have a stack defined, which is not
1131          necessarily true at the moment. */
1132       char **cptr;
1133       sim_io_printf(sd,"sim_create_inferior() : passed arguments ignored\n");
1134       for (cptr = argv; (cptr && *cptr); cptr++)
1135         printf("DBG: arg \"%s\"\n",*cptr);
1136     }
1137 #endif /* DEBUG */
1138
1139   return SIM_RC_OK;
1140 }
1141
1142 /*---------------------------------------------------------------------------*/
1143 /*-- Private simulator support interface ------------------------------------*/
1144 /*---------------------------------------------------------------------------*/
1145
1146 /* Read a null terminated string from memory, return in a buffer */
1147 static char *
1148 fetch_str (SIM_DESC sd,
1149            address_word addr)
1150 {
1151   char *buf;
1152   int nr = 0;
1153   char null;
1154   while (sim_read (sd, addr + nr, &null, 1) == 1 && null != 0)
1155     nr++;
1156   buf = NZALLOC (char, nr + 1);
1157   sim_read (sd, addr, buf, nr);
1158   return buf;
1159 }
1160
1161
1162 /* Implements the "sim firmware" command:
1163         sim firmware NAME[@ADDRESS] --- emulate ROM monitor named NAME.
1164                 NAME can be idt, pmon, or lsipmon.  If omitted, ADDRESS
1165                 defaults to the normal address for that monitor.
1166         sim firmware none --- don't emulate any ROM monitor.  Useful
1167                 if you need a clean address space.  */
1168 static SIM_RC
1169 sim_firmware_command (SIM_DESC sd, char *arg)
1170 {
1171   int address_present = 0;
1172   SIM_ADDR address;
1173
1174   /* Signal occurrence of this option. */
1175   firmware_option_p = 1;
1176
1177   /* Parse out the address, if present.  */
1178   {
1179     char *p = strchr (arg, '@');
1180     if (p)
1181       {
1182         char *q;
1183         address_present = 1;
1184         p ++; /* skip over @ */
1185
1186         address = strtoul (p, &q, 0);
1187         if (*q != '\0') 
1188           {
1189             sim_io_printf (sd, "Invalid address given to the"
1190                            "`sim firmware NAME@ADDRESS' command: %s\n",
1191                            p);
1192             return SIM_RC_FAIL;
1193           }
1194       }
1195     else
1196       {
1197         address_present = 0;
1198         address = -1; /* Dummy value.  */
1199       }
1200   }
1201
1202   if (! strncmp (arg, "idt", 3))
1203     {
1204       idt_monitor_base = address_present ? address : 0xBFC00000;
1205       pmon_monitor_base = 0;
1206       lsipmon_monitor_base = 0;
1207     }
1208   else if (! strncmp (arg, "pmon", 4))
1209     {
1210       /* pmon uses indirect calls.  Hook into implied idt. */
1211       pmon_monitor_base = address_present ? address : 0xBFC00500;
1212       idt_monitor_base = pmon_monitor_base - 0x500;
1213       lsipmon_monitor_base = 0;
1214     }
1215   else if (! strncmp (arg, "lsipmon", 7))
1216     {
1217       /* lsipmon uses indirect calls.  Hook into implied idt. */
1218       pmon_monitor_base = 0;
1219       lsipmon_monitor_base = address_present ? address : 0xBFC00200;
1220       idt_monitor_base = lsipmon_monitor_base - 0x200;
1221     }
1222   else if (! strncmp (arg, "none", 4))
1223     {
1224       if (address_present)
1225         {
1226           sim_io_printf (sd,
1227                          "The `sim firmware none' command does "
1228                          "not take an `ADDRESS' argument.\n");
1229           return SIM_RC_FAIL;
1230         }
1231       idt_monitor_base = 0;
1232       pmon_monitor_base = 0;
1233       lsipmon_monitor_base = 0;
1234     }
1235   else
1236     {
1237       sim_io_printf (sd, "\
1238 Unrecognized name given to the `sim firmware NAME' command: %s\n\
1239 Recognized firmware names are: `idt', `pmon', `lsipmon', and `none'.\n",
1240                      arg);
1241       return SIM_RC_FAIL;
1242     }
1243   
1244   return SIM_RC_OK;
1245 }
1246
1247
1248
1249 /* Simple monitor interface (currently setup for the IDT and PMON monitors) */
1250 int
1251 sim_monitor (SIM_DESC sd,
1252              sim_cpu *cpu,
1253              address_word cia,
1254              unsigned int reason)
1255 {
1256 #ifdef DEBUG
1257   printf("DBG: sim_monitor: entered (reason = %d)\n",reason);
1258 #endif /* DEBUG */
1259
1260   /* The IDT monitor actually allows two instructions per vector
1261      slot. However, the simulator currently causes a trap on each
1262      individual instruction. We cheat, and lose the bottom bit. */
1263   reason >>= 1;
1264
1265   /* The following callback functions are available, however the
1266      monitor we are simulating does not make use of them: get_errno,
1267      isatty, lseek, rename, system, time and unlink */
1268   switch (reason)
1269     {
1270
1271     case 6: /* int open(char *path,int flags) */
1272       {
1273         char *path = fetch_str (sd, A0);
1274         V0 = sim_io_open (sd, path, (int)A1);
1275         free (path);
1276         break;
1277       }
1278
1279     case 7: /* int read(int file,char *ptr,int len) */
1280       {
1281         int fd = A0;
1282         int nr = A2;
1283         char *buf = zalloc (nr);
1284         V0 = sim_io_read (sd, fd, buf, nr);
1285         sim_write (sd, A1, buf, nr);
1286         free (buf);
1287       }
1288       break;
1289
1290     case 8: /* int write(int file,char *ptr,int len) */
1291       {
1292         int fd = A0;
1293         int nr = A2;
1294         char *buf = zalloc (nr);
1295         sim_read (sd, A1, buf, nr);
1296         V0 = sim_io_write (sd, fd, buf, nr);
1297         if (fd == 1)
1298             sim_io_flush_stdout (sd);
1299         else if (fd == 2)
1300             sim_io_flush_stderr (sd);
1301         free (buf);
1302         break;
1303       }
1304
1305     case 10: /* int close(int file) */
1306       {
1307         V0 = sim_io_close (sd, (int)A0);
1308         break;
1309       }
1310
1311     case 2:  /* Densan monitor: char inbyte(int waitflag) */
1312       {
1313         if (A0 == 0)    /* waitflag == NOWAIT */
1314           V0 = (unsigned_word)-1;
1315       }
1316      /* Drop through to case 11 */
1317
1318     case 11: /* char inbyte(void) */
1319       {
1320         char tmp;
1321         /* ensure that all output has gone... */
1322         sim_io_flush_stdout (sd);
1323         if (sim_io_read_stdin (sd, &tmp, sizeof(char)) != sizeof(char))
1324           {
1325             sim_io_error(sd,"Invalid return from character read");
1326             V0 = (unsigned_word)-1;
1327           }
1328         else
1329           V0 = (unsigned_word)tmp;
1330         break;
1331       }
1332
1333     case 3:  /* Densan monitor: void co(char chr) */
1334     case 12: /* void outbyte(char chr) : write a byte to "stdout" */
1335       {
1336         char tmp = (char)(A0 & 0xFF);
1337         sim_io_write_stdout (sd, &tmp, sizeof(char));
1338         break;
1339       }
1340
1341     case 17: /* void _exit() */
1342       {
1343         sim_io_eprintf (sd, "sim_monitor(17): _exit(int reason) to be coded\n");
1344         sim_engine_halt (SD, CPU, NULL, NULL_CIA, sim_exited,
1345                          (unsigned int)(A0 & 0xFFFFFFFF));
1346         break;
1347       }
1348
1349     case 28: /* PMON flush_cache */
1350       break;
1351
1352     case 55: /* void get_mem_info(unsigned int *ptr) */
1353       /* in:  A0 = pointer to three word memory location */
1354       /* out: [A0 + 0] = size */
1355       /*      [A0 + 4] = instruction cache size */
1356       /*      [A0 + 8] = data cache size */
1357       {
1358         unsigned_4 value;
1359         unsigned_4 zero = 0;
1360         address_word mem_size;
1361         sim_memopt *entry, *match = NULL;
1362
1363         /* Search for memory region mapped to KSEG0 or KSEG1. */
1364         for (entry = STATE_MEMOPT (sd); 
1365              entry != NULL;
1366              entry = entry->next)
1367           {
1368             if ((entry->addr == K0BASE || entry->addr == K1BASE)
1369                 && (!match || entry->level < match->level))
1370               match = entry;
1371             else
1372               {
1373                 sim_memopt *alias;
1374                 for (alias = entry->alias; 
1375                      alias != NULL;
1376                      alias = alias->next)
1377                   if ((alias->addr == K0BASE || alias->addr == K1BASE)
1378                       && (!match || entry->level < match->level))
1379                     match = entry;
1380               }
1381           }
1382
1383         /* Get region size, limit to KSEG1 size (512MB). */
1384         SIM_ASSERT (match != NULL);
1385         mem_size = (match->modulo != 0
1386                     ? match->modulo : match->nr_bytes);
1387         if (mem_size > K1SIZE)
1388           mem_size = K1SIZE;
1389
1390         value = mem_size;
1391         H2T (value);
1392         sim_write (sd, A0 + 0, (char *)&value, 4);
1393         sim_write (sd, A0 + 4, (char *)&zero, 4);
1394         sim_write (sd, A0 + 8, (char *)&zero, 4);
1395         /* sim_io_eprintf (sd, "sim: get_mem_info() deprecated\n"); */
1396         break;
1397       }
1398     
1399     case 158: /* PMON printf */
1400       /* in:  A0 = pointer to format string */
1401       /*      A1 = optional argument 1 */
1402       /*      A2 = optional argument 2 */
1403       /*      A3 = optional argument 3 */
1404       /* out: void */
1405       /* The following is based on the PMON printf source */
1406       {
1407         address_word s = A0;
1408         char c;
1409         signed_word *ap = &A1; /* 1st argument */
1410         /* This isn't the quickest way, since we call the host print
1411            routine for every character almost. But it does avoid
1412            having to allocate and manage a temporary string buffer. */
1413         /* TODO: Include check that we only use three arguments (A1,
1414            A2 and A3) */
1415         while (sim_read (sd, s++, &c, 1) && c != '\0')
1416           {
1417             if (c == '%')
1418               {
1419                 char tmp[40];
1420                 enum {FMT_RJUST, FMT_LJUST, FMT_RJUST0, FMT_CENTER} fmt = FMT_RJUST;
1421                 int width = 0, trunc = 0, haddot = 0, longlong = 0;
1422                 while (sim_read (sd, s++, &c, 1) && c != '\0')
1423                   {
1424                     if (strchr ("dobxXulscefg%", c))
1425                       break;
1426                     else if (c == '-')
1427                       fmt = FMT_LJUST;
1428                     else if (c == '0')
1429                       fmt = FMT_RJUST0;
1430                     else if (c == '~')
1431                       fmt = FMT_CENTER;
1432                     else if (c == '*')
1433                       {
1434                         if (haddot)
1435                           trunc = (int)*ap++;
1436                         else
1437                           width = (int)*ap++;
1438                       }
1439                     else if (c >= '1' && c <= '9')
1440                       {
1441                         address_word t = s;
1442                         unsigned int n;
1443                         while (sim_read (sd, s++, &c, 1) == 1 && isdigit (c))
1444                           tmp[s - t] = c;
1445                         tmp[s - t] = '\0';
1446                         n = (unsigned int)strtol(tmp,NULL,10);
1447                         if (haddot)
1448                           trunc = n;
1449                         else
1450                           width = n;
1451                         s--;
1452                       }
1453                     else if (c == '.')
1454                       haddot = 1;
1455                   }
1456                 switch (c)
1457                   {
1458                   case '%':
1459                     sim_io_printf (sd, "%%");
1460                     break;
1461                   case 's':
1462                     if ((int)*ap != 0)
1463                       {
1464                         address_word p = *ap++;
1465                         char ch;
1466                         while (sim_read (sd, p++, &ch, 1) == 1 && ch != '\0')
1467                           sim_io_printf(sd, "%c", ch);
1468                       }
1469                     else
1470                       sim_io_printf(sd,"(null)");
1471                     break;
1472                   case 'c':
1473                     sim_io_printf (sd, "%c", (int)*ap++);
1474                     break;
1475                   default:
1476                     if (c == 'l')
1477                       {
1478                         sim_read (sd, s++, &c, 1);
1479                         if (c == 'l')
1480                           {
1481                             longlong = 1;
1482                             sim_read (sd, s++, &c, 1);
1483                           }
1484                       }
1485                     if (strchr ("dobxXu", c))
1486                       {
1487                         word64 lv = (word64) *ap++;
1488                         if (c == 'b')
1489                           sim_io_printf(sd,"<binary not supported>");
1490                         else
1491                           {
1492                             sprintf (tmp, "%%%s%c", longlong ? "ll" : "", c);
1493                             if (longlong)
1494                               sim_io_printf(sd, tmp, lv);
1495                             else
1496                               sim_io_printf(sd, tmp, (int)lv);
1497                           }
1498                       }
1499                     else if (strchr ("eEfgG", c))
1500                       {
1501                         double dbl = *(double*)(ap++);
1502                         sprintf (tmp, "%%%d.%d%c", width, trunc, c);
1503                         sim_io_printf (sd, tmp, dbl);
1504                         trunc = 0;
1505                       }
1506                   }
1507               }
1508             else
1509               sim_io_printf(sd, "%c", c);
1510           }
1511         break;
1512       }
1513
1514     default:
1515       /* Unknown reason.  */
1516       return 0;
1517   }
1518   return 1;
1519 }
1520
1521 /* Store a word into memory.  */
1522
1523 static void
1524 store_word (SIM_DESC sd,
1525             sim_cpu *cpu,
1526             address_word cia,
1527             uword64 vaddr,
1528             signed_word val)
1529 {
1530   address_word paddr;
1531   int uncached;
1532
1533   if ((vaddr & 3) != 0)
1534     SignalExceptionAddressStore ();
1535   else
1536     {
1537       if (AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached,
1538                               isTARGET, isREAL))
1539         {
1540           const uword64 mask = 7;
1541           uword64 memval;
1542           unsigned int byte;
1543
1544           paddr = (paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2));
1545           byte = (vaddr & mask) ^ (BigEndianCPU << 2);
1546           memval = ((uword64) val) << (8 * byte);
1547           StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr, vaddr,
1548                        isREAL);
1549         }
1550     }
1551 }
1552
1553 /* Load a word from memory.  */
1554
1555 static signed_word
1556 load_word (SIM_DESC sd,
1557            sim_cpu *cpu,
1558            address_word cia,
1559            uword64 vaddr)
1560 {
1561   if ((vaddr & 3) != 0)
1562     {
1563       SIM_CORE_SIGNAL (SD, cpu, cia, read_map, AccessLength_WORD+1, vaddr, read_transfer, sim_core_unaligned_signal);
1564     }
1565   else
1566     {
1567       address_word paddr;
1568       int uncached;
1569
1570       if (AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached,
1571                               isTARGET, isREAL))
1572         {
1573           const uword64 mask = 0x7;
1574           const unsigned int reverse = ReverseEndian ? 1 : 0;
1575           const unsigned int bigend = BigEndianCPU ? 1 : 0;
1576           uword64 memval;
1577           unsigned int byte;
1578
1579           paddr = (paddr & ~mask) | ((paddr & mask) ^ (reverse << 2));
1580           LoadMemory (&memval,NULL,uncached, AccessLength_WORD, paddr, vaddr,
1581                                isDATA, isREAL);
1582           byte = (vaddr & mask) ^ (bigend << 2);
1583           return EXTEND32 (memval >> (8 * byte));
1584         }
1585     }
1586
1587   return 0;
1588 }
1589
1590 /* Simulate the mips16 entry and exit pseudo-instructions.  These
1591    would normally be handled by the reserved instruction exception
1592    code, but for ease of simulation we just handle them directly.  */
1593
1594 static void
1595 mips16_entry (SIM_DESC sd,
1596               sim_cpu *cpu,
1597               address_word cia,
1598               unsigned int insn)
1599 {
1600   int aregs, sregs, rreg;
1601
1602 #ifdef DEBUG
1603   printf("DBG: mips16_entry: entered (insn = 0x%08X)\n",insn);
1604 #endif /* DEBUG */
1605
1606   aregs = (insn & 0x700) >> 8;
1607   sregs = (insn & 0x0c0) >> 6;
1608   rreg =  (insn & 0x020) >> 5;
1609
1610   /* This should be checked by the caller.  */
1611   if (sregs == 3)
1612     abort ();
1613
1614   if (aregs < 5)
1615     {
1616       int i;
1617       signed_word tsp;
1618
1619       /* This is the entry pseudo-instruction.  */
1620
1621       for (i = 0; i < aregs; i++)
1622         store_word (SD, CPU, cia, (uword64) (SP + 4 * i), GPR[i + 4]);
1623
1624       tsp = SP;
1625       SP -= 32;
1626
1627       if (rreg)
1628         {
1629           tsp -= 4;
1630           store_word (SD, CPU, cia, (uword64) tsp, RA);
1631         }
1632
1633       for (i = 0; i < sregs; i++)
1634         {
1635           tsp -= 4;
1636           store_word (SD, CPU, cia, (uword64) tsp, GPR[16 + i]);
1637         }
1638     }
1639   else
1640     {
1641       int i;
1642       signed_word tsp;
1643
1644       /* This is the exit pseudo-instruction.  */
1645
1646       tsp = SP + 32;
1647
1648       if (rreg)
1649         {
1650           tsp -= 4;
1651           RA = load_word (SD, CPU, cia, (uword64) tsp);
1652         }
1653
1654       for (i = 0; i < sregs; i++)
1655         {
1656           tsp -= 4;
1657           GPR[i + 16] = load_word (SD, CPU, cia, (uword64) tsp);
1658         }
1659
1660       SP += 32;
1661
1662       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
1663         {
1664           if (aregs == 5)
1665             {
1666               FGR[0] = WORD64LO (GPR[4]);
1667               FPR_STATE[0] = fmt_uninterpreted;
1668             }
1669           else if (aregs == 6)
1670             {
1671               FGR[0] = WORD64LO (GPR[5]);
1672               FGR[1] = WORD64LO (GPR[4]);
1673               FPR_STATE[0] = fmt_uninterpreted;
1674               FPR_STATE[1] = fmt_uninterpreted;
1675             }
1676         }         
1677
1678       PC = RA;
1679     }
1680   
1681 }
1682
1683 /*-- trace support ----------------------------------------------------------*/
1684
1685 /* The TRACE support is provided (if required) in the memory accessing
1686    routines. Since we are also providing the architecture specific
1687    features, the architecture simulation code can also deal with
1688    notifying the TRACE world of cache flushes, etc. Similarly we do
1689    not need to provide profiling support in the simulator engine,
1690    since we can sample in the instruction fetch control loop. By
1691    defining the TRACE manifest, we add tracing as a run-time
1692    option. */
1693
1694 #if defined(TRACE)
1695 /* Tracing by default produces "din" format (as required by
1696    dineroIII). Each line of such a trace file *MUST* have a din label
1697    and address field. The rest of the line is ignored, so comments can
1698    be included if desired. The first field is the label which must be
1699    one of the following values:
1700
1701         0       read data
1702         1       write data
1703         2       instruction fetch
1704         3       escape record (treated as unknown access type)
1705         4       escape record (causes cache flush)
1706
1707    The address field is a 32bit (lower-case) hexadecimal address
1708    value. The address should *NOT* be preceded by "0x".
1709
1710    The size of the memory transfer is not important when dealing with
1711    cache lines (as long as no more than a cache line can be
1712    transferred in a single operation :-), however more information
1713    could be given following the dineroIII requirement to allow more
1714    complete memory and cache simulators to provide better
1715    results. i.e. the University of Pisa has a cache simulator that can
1716    also take bus size and speed as (variable) inputs to calculate
1717    complete system performance (a much more useful ability when trying
1718    to construct an end product, rather than a processor). They
1719    currently have an ARM version of their tool called ChARM. */
1720
1721
1722 void
1723 dotrace (SIM_DESC sd,
1724          sim_cpu *cpu,
1725          FILE *tracefh,
1726          int type,
1727          SIM_ADDR address,
1728          int width,
1729          char *comment,...)
1730 {
1731   if (STATE & simTRACE) {
1732     va_list ap;
1733     fprintf(tracefh,"%d %s ; width %d ; ", 
1734                 type,
1735                 pr_addr(address),
1736                 width);
1737     va_start(ap,comment);
1738     vfprintf(tracefh,comment,ap);
1739     va_end(ap);
1740     fprintf(tracefh,"\n");
1741   }
1742   /* NOTE: Since the "din" format will only accept 32bit addresses, and
1743      we may be generating 64bit ones, we should put the hi-32bits of the
1744      address into the comment field. */
1745
1746   /* TODO: Provide a buffer for the trace lines. We can then avoid
1747      performing writes until the buffer is filled, or the file is
1748      being closed. */
1749
1750   /* NOTE: We could consider adding a comment field to the "din" file
1751      produced using type 3 markers (unknown access). This would then
1752      allow information about the program that the "din" is for, and
1753      the MIPs world that was being simulated, to be placed into the
1754      trace file. */
1755
1756   return;
1757 }
1758 #endif /* TRACE */
1759
1760 /*---------------------------------------------------------------------------*/
1761 /*-- simulator engine -------------------------------------------------------*/
1762 /*---------------------------------------------------------------------------*/
1763
1764 static void
1765 ColdReset (SIM_DESC sd)
1766 {
1767   int cpu_nr;
1768   for (cpu_nr = 0; cpu_nr < sim_engine_nr_cpus (sd); cpu_nr++)
1769     {
1770       sim_cpu *cpu = STATE_CPU (sd, cpu_nr);
1771       /* RESET: Fixed PC address: */
1772       PC = (unsigned_word) UNSIGNED64 (0xFFFFFFFFBFC00000);
1773       /* The reset vector address is in the unmapped, uncached memory space. */
1774       
1775       SR &= ~(status_SR | status_TS | status_RP);
1776       SR |= (status_ERL | status_BEV);
1777       
1778       /* Cheat and allow access to the complete register set immediately */
1779       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT
1780           && WITH_TARGET_WORD_BITSIZE == 64)
1781         SR |= status_FR; /* 64bit registers */
1782       
1783       /* Ensure that any instructions with pending register updates are
1784          cleared: */
1785       PENDING_INVALIDATE();
1786       
1787       /* Initialise the FPU registers to the unknown state */
1788       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
1789         {
1790           int rn;
1791           for (rn = 0; (rn < 32); rn++)
1792             FPR_STATE[rn] = fmt_uninterpreted;
1793         }
1794       
1795       /* Initialise the Config0 register. */
1796       C0_CONFIG = 0x80000000            /* Config1 present */
1797         | 2;                            /* KSEG0 uncached */
1798       if (WITH_TARGET_WORD_BITSIZE == 64)
1799         {
1800           /* FIXME Currently mips/sim-main.c:address_translation()
1801              truncates all addresses to 32-bits. */
1802           if (0 && WITH_TARGET_ADDRESS_BITSIZE == 64)
1803             C0_CONFIG |= (2 << 13);     /* MIPS64, 64-bit addresses */
1804           else
1805             C0_CONFIG |= (1 << 13);     /* MIPS64, 32-bit addresses */
1806         }
1807       if (BigEndianMem)
1808         C0_CONFIG |= 0x00008000;        /* Big Endian */
1809     }
1810 }
1811
1812
1813
1814
1815 /* Description from page A-26 of the "MIPS IV Instruction Set" manual (revision 3.1) */
1816 /* Signal an exception condition. This will result in an exception
1817    that aborts the instruction. The instruction operation pseudocode
1818    will never see a return from this function call. */
1819
1820 void
1821 signal_exception (SIM_DESC sd,
1822                   sim_cpu *cpu,
1823                   address_word cia,
1824                   int exception,...)
1825 {
1826   /* int vector; */
1827
1828 #ifdef DEBUG
1829   sim_io_printf(sd,"DBG: SignalException(%d) PC = 0x%s\n",exception,pr_addr(cia));
1830 #endif /* DEBUG */
1831
1832   /* Ensure that any active atomic read/modify/write operation will fail: */
1833   LLBIT = 0;
1834
1835   /* Save registers before interrupt dispatching */
1836 #ifdef SIM_CPU_EXCEPTION_TRIGGER
1837   SIM_CPU_EXCEPTION_TRIGGER(sd, cpu, cia);
1838 #endif
1839
1840   switch (exception) {
1841
1842     case DebugBreakPoint:
1843       if (! (Debug & Debug_DM))
1844         {
1845           if (INDELAYSLOT())
1846             {
1847               CANCELDELAYSLOT();
1848               
1849               Debug |= Debug_DBD;  /* signaled from within in delay slot */
1850               DEPC = cia - 4;      /* reference the branch instruction */
1851             }
1852           else
1853             {
1854               Debug &= ~Debug_DBD; /* not signaled from within a delay slot */
1855               DEPC = cia;
1856             }
1857         
1858           Debug |= Debug_DM;            /* in debugging mode */
1859           Debug |= Debug_DBp;           /* raising a DBp exception */
1860           PC = 0xBFC00200;
1861           sim_engine_restart (SD, CPU, NULL, NULL_CIA);
1862         }
1863       break;
1864
1865     case ReservedInstruction:
1866      {
1867        va_list ap;
1868        unsigned int instruction;
1869        va_start(ap,exception);
1870        instruction = va_arg(ap,unsigned int);
1871        va_end(ap);
1872        /* Provide simple monitor support using ReservedInstruction
1873           exceptions. The following code simulates the fixed vector
1874           entry points into the IDT monitor by causing a simulator
1875           trap, performing the monitor operation, and returning to
1876           the address held in the $ra register (standard PCS return
1877           address). This means we only need to pre-load the vector
1878           space with suitable instruction values. For systems were
1879           actual trap instructions are used, we would not need to
1880           perform this magic. */
1881        if ((instruction & RSVD_INSTRUCTION_MASK) == RSVD_INSTRUCTION)
1882          {
1883            int reason = (instruction >> RSVD_INSTRUCTION_ARG_SHIFT) & RSVD_INSTRUCTION_ARG_MASK;
1884            if (!sim_monitor (SD, CPU, cia, reason))
1885              sim_io_error (sd, "sim_monitor: unhandled reason = %d, pc = 0x%s\n", reason, pr_addr (cia));
1886
1887            /* NOTE: This assumes that a branch-and-link style
1888               instruction was used to enter the vector (which is the
1889               case with the current IDT monitor). */
1890            sim_engine_restart (SD, CPU, NULL, RA);
1891          }
1892        /* Look for the mips16 entry and exit instructions, and
1893           simulate a handler for them.  */
1894        else if ((cia & 1) != 0
1895                 && (instruction & 0xf81f) == 0xe809
1896                 && (instruction & 0x0c0) != 0x0c0)
1897          {
1898            mips16_entry (SD, CPU, cia, instruction);
1899            sim_engine_restart (sd, NULL, NULL, NULL_CIA);
1900          }
1901        /* else fall through to normal exception processing */
1902        sim_io_eprintf(sd,"ReservedInstruction at PC = 0x%s\n", pr_addr (cia));
1903      }
1904
1905     default:
1906      /* Store exception code into current exception id variable (used
1907         by exit code): */
1908
1909      /* TODO: If not simulating exceptions then stop the simulator
1910         execution. At the moment we always stop the simulation. */
1911
1912 #ifdef SUBTARGET_R3900
1913       /* update interrupt-related registers */
1914
1915       /* insert exception code in bits 6:2 */
1916       CAUSE = LSMASKED32(CAUSE, 31, 7) | LSINSERTED32(exception, 6, 2);
1917       /* shift IE/KU history bits left */
1918       SR = LSMASKED32(SR, 31, 4) | LSINSERTED32(LSEXTRACTED32(SR, 3, 0), 5, 2);
1919
1920       if (STATE & simDELAYSLOT)
1921         {
1922           STATE &= ~simDELAYSLOT;
1923           CAUSE |= cause_BD;
1924           EPC = (cia - 4); /* reference the branch instruction */
1925         }
1926       else
1927         EPC = cia;
1928
1929      if (SR & status_BEV)
1930        PC = (signed)0xBFC00000 + 0x180;
1931      else
1932        PC = (signed)0x80000000 + 0x080;
1933 #else
1934      /* See figure 5-17 for an outline of the code below */
1935      if (! (SR & status_EXL))
1936        {
1937          CAUSE = (exception << 2);
1938          if (STATE & simDELAYSLOT)
1939            {
1940              STATE &= ~simDELAYSLOT;
1941              CAUSE |= cause_BD;
1942              EPC = (cia - 4); /* reference the branch instruction */
1943            }
1944          else
1945            EPC = cia;
1946          /* FIXME: TLB et.al. */
1947          /* vector = 0x180; */
1948        }
1949      else
1950        {
1951          CAUSE = (exception << 2);
1952          /* vector = 0x180; */
1953        }
1954      SR |= status_EXL;
1955      /* Store exception code into current exception id variable (used
1956         by exit code): */
1957
1958      if (SR & status_BEV)
1959        PC = (signed)0xBFC00200 + 0x180;
1960      else
1961        PC = (signed)0x80000000 + 0x180;
1962 #endif
1963
1964      switch ((CAUSE >> 2) & 0x1F)
1965        {
1966        case Interrupt:
1967          /* Interrupts arrive during event processing, no need to
1968             restart */
1969          return;
1970
1971        case NMIReset:
1972          /* Ditto */
1973 #ifdef SUBTARGET_3900
1974          /* Exception vector: BEV=0 BFC00000 / BEF=1 BFC00000  */
1975          PC = (signed)0xBFC00000;
1976 #endif /* SUBTARGET_3900 */
1977          return;
1978
1979        case TLBModification:
1980        case TLBLoad:
1981        case TLBStore:
1982        case AddressLoad:
1983        case AddressStore:
1984        case InstructionFetch:
1985        case DataReference:
1986          /* The following is so that the simulator will continue from the
1987             exception handler address. */
1988          sim_engine_halt (SD, CPU, NULL, PC,
1989                           sim_stopped, SIM_SIGBUS);
1990
1991        case ReservedInstruction:
1992        case CoProcessorUnusable:
1993          PC = EPC;
1994          sim_engine_halt (SD, CPU, NULL, PC,
1995                           sim_stopped, SIM_SIGILL);
1996
1997        case IntegerOverflow:
1998        case FPE:
1999          sim_engine_halt (SD, CPU, NULL, PC,
2000                           sim_stopped, SIM_SIGFPE);
2001          
2002        case BreakPoint:
2003          sim_engine_halt (SD, CPU, NULL, PC, sim_stopped, SIM_SIGTRAP);
2004          break;
2005
2006        case SystemCall:
2007        case Trap:
2008          sim_engine_restart (SD, CPU, NULL, PC);
2009          break;
2010
2011        case Watch:
2012          PC = EPC;
2013          sim_engine_halt (SD, CPU, NULL, PC,
2014                           sim_stopped, SIM_SIGTRAP);
2015
2016        default: /* Unknown internal exception */
2017          PC = EPC;
2018          sim_engine_halt (SD, CPU, NULL, PC,
2019                           sim_stopped, SIM_SIGABRT);
2020
2021        }
2022
2023     case SimulatorFault:
2024      {
2025        va_list ap;
2026        char *msg;
2027        va_start(ap,exception);
2028        msg = va_arg(ap,char *);
2029        va_end(ap);
2030        sim_engine_abort (SD, CPU, NULL_CIA,
2031                          "FATAL: Simulator error \"%s\"\n",msg);
2032      }
2033    }
2034
2035   return;
2036 }
2037
2038
2039
2040 /* This function implements what the MIPS32 and MIPS64 ISAs define as
2041    "UNPREDICTABLE" behaviour.
2042
2043    About UNPREDICTABLE behaviour they say: "UNPREDICTABLE results
2044    may vary from processor implementation to processor implementation,
2045    instruction to instruction, or as a function of time on the same
2046    implementation or instruction.  Software can never depend on results
2047    that are UNPREDICTABLE. ..."  (MIPS64 Architecture for Programmers
2048    Volume II, The MIPS64 Instruction Set.  MIPS Document MD00087 revision
2049    0.95, page 2.)
2050   
2051    For UNPREDICTABLE behaviour, we print a message, if possible print
2052    the offending instructions mips.igen instruction name (provided by
2053    the caller), and stop the simulator.
2054
2055    XXX FIXME: eventually, stopping the simulator should be made conditional
2056    on a command-line option.  */
2057 void
2058 unpredictable_action(sim_cpu *cpu, address_word cia)
2059 {
2060   SIM_DESC sd = CPU_STATE(cpu);
2061
2062   sim_io_eprintf(sd, "UNPREDICTABLE: PC = 0x%s\n", pr_addr (cia));
2063   sim_engine_halt (SD, CPU, NULL, cia, sim_stopped, SIM_SIGABRT);
2064 }
2065
2066
2067 /*-- co-processor support routines ------------------------------------------*/
2068
2069 static int UNUSED
2070 CoProcPresent(unsigned int coproc_number)
2071 {
2072   /* Return TRUE if simulator provides a model for the given co-processor number */
2073   return(0);
2074 }
2075
2076 void
2077 cop_lw (SIM_DESC sd,
2078         sim_cpu *cpu,
2079         address_word cia,
2080         int coproc_num,
2081         int coproc_reg,
2082         unsigned int memword)
2083 {
2084   switch (coproc_num)
2085     {
2086     case 1:
2087       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
2088         {
2089 #ifdef DEBUG
2090           printf("DBG: COP_LW: memword = 0x%08X (uword64)memword = 0x%s\n",memword,pr_addr(memword));
2091 #endif
2092           StoreFPR(coproc_reg,fmt_uninterpreted_32,(uword64)memword);
2093           break;
2094         }
2095
2096     default:
2097 #if 0 /* this should be controlled by a configuration option */
2098       sim_io_printf(sd,"COP_LW(%d,%d,0x%08X) at PC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,memword,pr_addr(cia));
2099 #endif
2100       break;
2101     }
2102
2103   return;
2104 }
2105
2106 void
2107 cop_ld (SIM_DESC sd,
2108         sim_cpu *cpu,
2109         address_word cia,
2110         int coproc_num,
2111         int coproc_reg,
2112         uword64 memword)
2113 {
2114
2115 #ifdef DEBUG
2116   printf("DBG: COP_LD: coproc_num = %d, coproc_reg = %d, value = 0x%s : PC = 0x%s\n", coproc_num, coproc_reg, pr_uword64(memword), pr_addr(cia) );
2117 #endif
2118
2119   switch (coproc_num) {
2120     case 1:
2121       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
2122         {
2123           StoreFPR(coproc_reg,fmt_uninterpreted_64,memword);
2124           break;
2125         }
2126
2127     default:
2128 #if 0 /* this message should be controlled by a configuration option */
2129      sim_io_printf(sd,"COP_LD(%d,%d,0x%s) at PC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(memword),pr_addr(cia));
2130 #endif
2131      break;
2132   }
2133
2134   return;
2135 }
2136
2137
2138
2139
2140 unsigned int
2141 cop_sw (SIM_DESC sd,
2142         sim_cpu *cpu,
2143         address_word cia,
2144         int coproc_num,
2145         int coproc_reg)
2146 {
2147   unsigned int value = 0;
2148
2149   switch (coproc_num)
2150     {
2151     case 1:
2152       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
2153         {
2154           value = (unsigned int)ValueFPR(coproc_reg,fmt_uninterpreted_32);
2155           break;
2156         }
2157
2158     default:
2159 #if 0 /* should be controlled by configuration option */
2160       sim_io_printf(sd,"COP_SW(%d,%d) at PC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(cia));
2161 #endif
2162       break;
2163     }
2164
2165   return(value);
2166 }
2167
2168 uword64
2169 cop_sd (SIM_DESC sd,
2170         sim_cpu *cpu,
2171         address_word cia,
2172         int coproc_num,
2173         int coproc_reg)
2174 {
2175   uword64 value = 0;
2176   switch (coproc_num)
2177     {
2178     case 1:
2179       if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
2180         {
2181           value = ValueFPR(coproc_reg,fmt_uninterpreted_64);
2182           break;
2183         }
2184
2185     default:
2186 #if 0 /* should be controlled by configuration option */
2187       sim_io_printf(sd,"COP_SD(%d,%d) at PC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(cia));
2188 #endif
2189       break;
2190     }
2191
2192   return(value);
2193 }
2194
2195
2196
2197
2198 void
2199 decode_coproc (SIM_DESC sd,
2200                sim_cpu *cpu,
2201                address_word cia,
2202                unsigned int instruction)
2203 {
2204   int coprocnum = ((instruction >> 26) & 3);
2205
2206   switch (coprocnum)
2207     {
2208     case 0: /* standard CPU control and cache registers */
2209       {
2210         int code = ((instruction >> 21) & 0x1F);
2211         int rt = ((instruction >> 16) & 0x1F);
2212         int rd = ((instruction >> 11) & 0x1F);
2213         int tail = instruction & 0x3ff;
2214         /* R4000 Users Manual (second edition) lists the following CP0
2215            instructions:
2216                                                                    CODE><-RT><RD-><--TAIL--->
2217            DMFC0   Doubleword Move From CP0        (VR4100 = 01000000001tttttddddd00000000000)
2218            DMTC0   Doubleword Move To CP0          (VR4100 = 01000000101tttttddddd00000000000)
2219            MFC0    word Move From CP0              (VR4100 = 01000000000tttttddddd00000000000)
2220            MTC0    word Move To CP0                (VR4100 = 01000000100tttttddddd00000000000)
2221            TLBR    Read Indexed TLB Entry          (VR4100 = 01000010000000000000000000000001)
2222            TLBWI   Write Indexed TLB Entry         (VR4100 = 01000010000000000000000000000010)
2223            TLBWR   Write Random TLB Entry          (VR4100 = 01000010000000000000000000000110)
2224            TLBP    Probe TLB for Matching Entry    (VR4100 = 01000010000000000000000000001000)
2225            CACHE   Cache operation                 (VR4100 = 101111bbbbbpppppiiiiiiiiiiiiiiii)
2226            ERET    Exception return                (VR4100 = 01000010000000000000000000011000)
2227            */
2228         if (((code == 0x00) || (code == 0x04)      /* MFC0  /  MTC0  */        
2229              || (code == 0x01) || (code == 0x05))  /* DMFC0 / DMTC0  */        
2230             && tail == 0)
2231           {
2232             /* Clear double/single coprocessor move bit. */
2233             code &= ~1;
2234
2235             /* M[TF]C0 (32 bits) | DM[TF]C0 (64 bits) */
2236             
2237             switch (rd)  /* NOTEs: Standard CP0 registers */
2238               {
2239                 /* 0 = Index               R4000   VR4100  VR4300 */
2240                 /* 1 = Random              R4000   VR4100  VR4300 */
2241                 /* 2 = EntryLo0            R4000   VR4100  VR4300 */
2242                 /* 3 = EntryLo1            R4000   VR4100  VR4300 */
2243                 /* 4 = Context             R4000   VR4100  VR4300 */
2244                 /* 5 = PageMask            R4000   VR4100  VR4300 */
2245                 /* 6 = Wired               R4000   VR4100  VR4300 */
2246                 /* 8 = BadVAddr            R4000   VR4100  VR4300 */
2247                 /* 9 = Count               R4000   VR4100  VR4300 */
2248                 /* 10 = EntryHi            R4000   VR4100  VR4300 */
2249                 /* 11 = Compare            R4000   VR4100  VR4300 */
2250                 /* 12 = SR                 R4000   VR4100  VR4300 */
2251 #ifdef SUBTARGET_R3900
2252               case 3:
2253                 /* 3 = Config              R3900                  */
2254               case 7:
2255                 /* 7 = Cache               R3900                  */
2256               case 15:
2257                 /* 15 = PRID               R3900                  */
2258
2259                 /* ignore */
2260                 break;
2261
2262               case 8:
2263                 /* 8 = BadVAddr            R4000   VR4100  VR4300 */
2264                 if (code == 0x00)
2265                   GPR[rt] = (signed_word) (signed_address) COP0_BADVADDR;
2266                 else
2267                   COP0_BADVADDR = GPR[rt];
2268                 break;
2269
2270 #endif /* SUBTARGET_R3900 */
2271               case 12:
2272                 if (code == 0x00)
2273                   GPR[rt] = SR;
2274                 else
2275                   SR = GPR[rt];
2276                 break;
2277                 /* 13 = Cause              R4000   VR4100  VR4300 */
2278               case 13:
2279                 if (code == 0x00)
2280                   GPR[rt] = CAUSE;
2281                 else
2282                   CAUSE = GPR[rt];
2283                 break;
2284                 /* 14 = EPC                R4000   VR4100  VR4300 */
2285               case 14:
2286                 if (code == 0x00)
2287                   GPR[rt] = (signed_word) (signed_address) EPC;
2288                 else
2289                   EPC = GPR[rt];
2290                 break;
2291                 /* 15 = PRId               R4000   VR4100  VR4300 */
2292 #ifdef SUBTARGET_R3900
2293                 /* 16 = Debug */
2294               case 16:
2295                 if (code == 0x00)
2296                   GPR[rt] = Debug;
2297                 else
2298                   Debug = GPR[rt];
2299                 break;
2300 #else
2301                 /* 16 = Config             R4000   VR4100  VR4300 */
2302               case 16:
2303                 if (code == 0x00)
2304                   GPR[rt] = C0_CONFIG;
2305                 else
2306                   /* only bottom three bits are writable */
2307                   C0_CONFIG = (C0_CONFIG & ~0x7) | (GPR[rt] & 0x7);
2308                 break;
2309 #endif
2310 #ifdef SUBTARGET_R3900
2311                 /* 17 = Debug */
2312               case 17:
2313                 if (code == 0x00)
2314                   GPR[rt] = DEPC;
2315                 else
2316                   DEPC = GPR[rt];
2317                 break;
2318 #else
2319                 /* 17 = LLAddr             R4000   VR4100  VR4300 */
2320 #endif
2321                 /* 18 = WatchLo            R4000   VR4100  VR4300 */
2322                 /* 19 = WatchHi            R4000   VR4100  VR4300 */
2323                 /* 20 = XContext           R4000   VR4100  VR4300 */
2324                 /* 26 = PErr or ECC        R4000   VR4100  VR4300 */
2325                 /* 27 = CacheErr           R4000   VR4100 */
2326                 /* 28 = TagLo              R4000   VR4100  VR4300 */
2327                 /* 29 = TagHi              R4000   VR4100  VR4300 */
2328                 /* 30 = ErrorEPC           R4000   VR4100  VR4300 */
2329                 if (STATE_VERBOSE_P(SD))
2330                   sim_io_eprintf (SD, 
2331                                   "Warning: PC 0x%lx:interp.c decode_coproc DEADC0DE\n",
2332                                   (unsigned long)cia);
2333                 GPR[rt] = 0xDEADC0DE; /* CPR[0,rd] */
2334                 /* CPR[0,rd] = GPR[rt]; */
2335               default:
2336                 if (code == 0x00)
2337                   GPR[rt] = (signed_word) (signed32) COP0_GPR[rd];
2338                 else
2339                   COP0_GPR[rd] = GPR[rt];
2340 #if 0
2341                 if (code == 0x00)
2342                   sim_io_printf(sd,"Warning: MFC0 %d,%d ignored, PC=%08x (architecture specific)\n",rt,rd, (unsigned)cia);
2343                 else
2344                   sim_io_printf(sd,"Warning: MTC0 %d,%d ignored, PC=%08x (architecture specific)\n",rt,rd, (unsigned)cia);
2345 #endif
2346               }
2347           }
2348         else if ((code == 0x00 || code == 0x01)
2349                  && rd == 16)
2350           {
2351             /* [D]MFC0 RT,C0_CONFIG,SEL */
2352             signed32 cfg = 0;
2353             switch (tail & 0x07) 
2354               {
2355               case 0:
2356                 cfg = C0_CONFIG;
2357                 break;
2358               case 1:
2359                 /* MIPS32 r/o Config1: 
2360                    Config2 present */
2361                 cfg = 0x80000000;
2362                 /* MIPS16 implemented. 
2363                    XXX How to check configuration? */
2364                 cfg |= 0x0000004;
2365                 if (CURRENT_FLOATING_POINT == HARD_FLOATING_POINT)
2366                   /* MDMX & FPU implemented */
2367                   cfg |= 0x00000021;
2368                 break;
2369               case 2:
2370                 /* MIPS32 r/o Config2: 
2371                    Config3 present. */
2372                 cfg = 0x80000000;
2373                 break;
2374               case 3:
2375                 /* MIPS32 r/o Config3: 
2376                    SmartMIPS implemented. */
2377                 cfg = 0x00000002;
2378                 break;
2379               }
2380             GPR[rt] = cfg;
2381           }
2382         else if (code == 0x10 && (tail & 0x3f) == 0x18)
2383           {
2384             /* ERET */
2385             if (SR & status_ERL)
2386               {
2387                 /* Oops, not yet available */
2388                 sim_io_printf(sd,"Warning: ERET when SR[ERL] set not handled yet");
2389                 PC = EPC;
2390                 SR &= ~status_ERL;
2391               }
2392             else
2393               {
2394                 PC = EPC;
2395                 SR &= ~status_EXL;
2396               }
2397           }
2398         else if (code == 0x10 && (tail & 0x3f) == 0x10)
2399           {
2400             /* RFE */
2401 #ifdef SUBTARGET_R3900
2402             /* TX39: Copy IEp/KUp -> IEc/KUc, and IEo/KUo -> IEp/KUp */
2403
2404             /* shift IE/KU history bits right */
2405             SR = LSMASKED32(SR, 31, 4) | LSINSERTED32(LSEXTRACTED32(SR, 5, 2), 3, 0);
2406
2407             /* TODO: CACHE register */
2408 #endif /* SUBTARGET_R3900 */
2409           }
2410         else if (code == 0x10 && (tail & 0x3f) == 0x1F)
2411           {
2412             /* DERET */
2413             Debug &= ~Debug_DM;
2414             DELAYSLOT();
2415             DSPC = DEPC;
2416           }
2417         else
2418           sim_io_eprintf(sd,"Unrecognised COP0 instruction 0x%08X at PC = 0x%s : No handler present\n",instruction,pr_addr(cia));
2419         /* TODO: When executing an ERET or RFE instruction we should
2420            clear LLBIT, to ensure that any out-standing atomic
2421            read/modify/write sequence fails. */
2422       }
2423     break;
2424     
2425     case 2: /* co-processor 2 */
2426       {
2427         int handle = 0;
2428
2429
2430         if(! handle)
2431           {
2432             sim_io_eprintf(sd, "COP2 instruction 0x%08X at PC = 0x%s : No handler present\n",
2433                            instruction,pr_addr(cia));
2434           }
2435       }
2436     break;
2437     
2438     case 1: /* should not occur (FPU co-processor) */
2439     case 3: /* should not occur (FPU co-processor) */
2440       SignalException(ReservedInstruction,instruction);
2441       break;
2442     }
2443   
2444   return;
2445 }
2446
2447
2448 /* This code copied from gdb's utils.c.  Would like to share this code,
2449    but don't know of a common place where both could get to it. */
2450
2451 /* Temporary storage using circular buffer */
2452 #define NUMCELLS 16
2453 #define CELLSIZE 32
2454 static char*
2455 get_cell (void)
2456 {
2457   static char buf[NUMCELLS][CELLSIZE];
2458   static int cell=0;
2459   if (++cell>=NUMCELLS) cell=0;
2460   return buf[cell];
2461 }     
2462
2463 /* Print routines to handle variable size regs, etc */
2464
2465 /* Eliminate warning from compiler on 32-bit systems */
2466 static int thirty_two = 32;     
2467
2468 char* 
2469 pr_addr(addr)
2470   SIM_ADDR addr;
2471 {
2472   char *paddr_str=get_cell();
2473   switch (sizeof(addr))
2474     {
2475       case 8:
2476         sprintf(paddr_str,"%08lx%08lx",
2477                 (unsigned long)(addr>>thirty_two),(unsigned long)(addr&0xffffffff));
2478         break;
2479       case 4:
2480         sprintf(paddr_str,"%08lx",(unsigned long)addr);
2481         break;
2482       case 2:
2483         sprintf(paddr_str,"%04x",(unsigned short)(addr&0xffff));
2484         break;
2485       default:
2486         sprintf(paddr_str,"%x",addr);
2487     }
2488   return paddr_str;
2489 }
2490
2491 char* 
2492 pr_uword64(addr)
2493   uword64 addr;
2494 {
2495   char *paddr_str=get_cell();
2496   sprintf(paddr_str,"%08lx%08lx",
2497           (unsigned long)(addr>>thirty_two),(unsigned long)(addr&0xffffffff));
2498   return paddr_str;
2499 }
2500
2501
2502 void
2503 mips_core_signal (SIM_DESC sd,
2504                  sim_cpu *cpu,
2505                  sim_cia cia,
2506                  unsigned map,
2507                  int nr_bytes,
2508                  address_word addr,
2509                  transfer_type transfer,
2510                  sim_core_signals sig)
2511 {
2512   const char *copy = (transfer == read_transfer ? "read" : "write");
2513   address_word ip = CIA_ADDR (cia);
2514
2515   switch (sig)
2516     {
2517     case sim_core_unmapped_signal:
2518       sim_io_eprintf (sd, "mips-core: %d byte %s to unmapped address 0x%lx at 0x%lx\n",
2519                       nr_bytes, copy, 
2520                       (unsigned long) addr, (unsigned long) ip);
2521       COP0_BADVADDR = addr;
2522       SignalExceptionDataReference();
2523       break;
2524
2525     case sim_core_unaligned_signal:
2526       sim_io_eprintf (sd, "mips-core: %d byte %s to unaligned address 0x%lx at 0x%lx\n",
2527                       nr_bytes, copy, 
2528                       (unsigned long) addr, (unsigned long) ip);
2529       COP0_BADVADDR = addr;
2530       if(transfer == read_transfer) 
2531         SignalExceptionAddressLoad();
2532       else
2533         SignalExceptionAddressStore();
2534       break;
2535
2536     default:
2537       sim_engine_abort (sd, cpu, cia,
2538                         "mips_core_signal - internal error - bad switch");
2539     }
2540 }
2541
2542
2543 void
2544 mips_cpu_exception_trigger(SIM_DESC sd, sim_cpu* cpu, address_word cia)
2545 {
2546   ASSERT(cpu != NULL);
2547
2548   if(cpu->exc_suspended > 0)
2549     sim_io_eprintf(sd, "Warning, nested exception triggered (%d)\n", cpu->exc_suspended); 
2550
2551   PC = cia;
2552   memcpy(cpu->exc_trigger_registers, cpu->registers, sizeof(cpu->exc_trigger_registers));
2553   cpu->exc_suspended = 0;
2554 }
2555
2556 void
2557 mips_cpu_exception_suspend(SIM_DESC sd, sim_cpu* cpu, int exception)
2558 {
2559   ASSERT(cpu != NULL);
2560
2561   if(cpu->exc_suspended > 0)
2562     sim_io_eprintf(sd, "Warning, nested exception signal (%d then %d)\n", 
2563                    cpu->exc_suspended, exception); 
2564
2565   memcpy(cpu->exc_suspend_registers, cpu->registers, sizeof(cpu->exc_suspend_registers));
2566   memcpy(cpu->registers, cpu->exc_trigger_registers, sizeof(cpu->registers));
2567   cpu->exc_suspended = exception;
2568 }
2569
2570 void
2571 mips_cpu_exception_resume(SIM_DESC sd, sim_cpu* cpu, int exception)
2572 {
2573   ASSERT(cpu != NULL);
2574
2575   if(exception == 0 && cpu->exc_suspended > 0)
2576     {
2577       /* warn not for breakpoints */
2578       if(cpu->exc_suspended != sim_signal_to_host(sd, SIM_SIGTRAP))
2579         sim_io_eprintf(sd, "Warning, resuming but ignoring pending exception signal (%d)\n",
2580                        cpu->exc_suspended); 
2581     }
2582   else if(exception != 0 && cpu->exc_suspended > 0)
2583     {
2584       if(exception != cpu->exc_suspended) 
2585         sim_io_eprintf(sd, "Warning, resuming with mismatched exception signal (%d vs %d)\n",
2586                        cpu->exc_suspended, exception); 
2587       
2588       memcpy(cpu->registers, cpu->exc_suspend_registers, sizeof(cpu->registers)); 
2589     }
2590   else if(exception != 0 && cpu->exc_suspended == 0)
2591     {
2592       sim_io_eprintf(sd, "Warning, ignoring spontanous exception signal (%d)\n", exception); 
2593     }
2594   cpu->exc_suspended = 0; 
2595 }
2596
2597
2598 /*---------------------------------------------------------------------------*/
2599 /*> EOF interp.c <*/