2 /* Simulator for the MIPS architecture.
4 This file is part of the MIPS sim
6 THIS SOFTWARE IS NOT COPYRIGHTED
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.
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.
22 We only need to take account of the target endianness when moving data
23 between the simulator and the host. We do not need to worry about the
24 endianness of the host, since this sim code and GDB are executing in
27 The IDT monitor (found on the VR4300 board), seems to lie about
28 register contents. It seems to treat the registers as sign-extended
29 32-bit values. This cause *REAL* problems when single-stepping 64-bit
34 /* The TRACE and PROFILE manifests enable the provision of extra
35 features. If they are not defined then a simpler (quicker)
36 simulator is constructed without the required run-time checks,
38 #if 1 /* 0 to allow user build selection, 1 to force inclusion */
45 #include "sim-utils.h"
46 #include "sim-options.h"
47 #include "sim-assert.h"
70 #include "libiberty.h"
72 #include "callback.h" /* GDB simulator callback interface */
73 #include "remote-sim.h" /* GDB simulator interface */
75 #include "support.h" /* internal support manifests */
83 char* pr_addr PARAMS ((SIM_ADDR addr));
84 char* pr_uword64 PARAMS ((uword64 addr));
87 #define SIGBUS SIGSEGV
90 /* Get the simulator engine description, without including the code: */
95 struct sim_state simulator;
97 /* The following reserved instruction value is used when a simulator
98 trap is required. NOTE: Care must be taken, since this value may be
99 used in later revisions of the MIPS ISA. */
100 #define RSVD_INSTRUCTION (0x00000005)
101 #define RSVD_INSTRUCTION_MASK (0xFC00003F)
103 #define RSVD_INSTRUCTION_ARG_SHIFT 6
104 #define RSVD_INSTRUCTION_ARG_MASK 0xFFFFF
107 /* NOTE: These numbers depend on the processor architecture being
109 #define Interrupt (0)
110 #define TLBModification (1)
113 #define AddressLoad (4)
114 #define AddressStore (5)
115 #define InstructionFetch (6)
116 #define DataReference (7)
117 #define SystemCall (8)
118 #define BreakPoint (9)
119 #define ReservedInstruction (10)
120 #define CoProcessorUnusable (11)
121 #define IntegerOverflow (12) /* Arithmetic overflow (IDT monitor raises SIGFPE) */
126 /* The following exception code is actually private to the simulator
127 world. It is *NOT* a processor feature, and is used to signal
128 run-time errors in the simulator. */
129 #define SimulatorFault (0xFFFFFFFF)
131 /* The following are generic to all versions of the MIPS architecture
133 /* Memory Access Types (for CCA): */
135 #define CachedNoncoherent (1)
136 #define CachedCoherent (2)
139 #define isINSTRUCTION (1 == 0) /* FALSE */
140 #define isDATA (1 == 1) /* TRUE */
142 #define isLOAD (1 == 0) /* FALSE */
143 #define isSTORE (1 == 1) /* TRUE */
145 #define isREAL (1 == 0) /* FALSE */
146 #define isRAW (1 == 1) /* TRUE */
148 #define isTARGET (1 == 0) /* FALSE */
149 #define isHOST (1 == 1) /* TRUE */
151 /* The "AccessLength" specifications for Loads and Stores. NOTE: This
152 is the number of bytes minus 1. */
153 #define AccessLength_BYTE (0)
154 #define AccessLength_HALFWORD (1)
155 #define AccessLength_TRIPLEBYTE (2)
156 #define AccessLength_WORD (3)
157 #define AccessLength_QUINTIBYTE (4)
158 #define AccessLength_SEXTIBYTE (5)
159 #define AccessLength_SEPTIBYTE (6)
160 #define AccessLength_DOUBLEWORD (7)
161 #define AccessLength_QUADWORD (15)
164 /* FPU registers must be one of the following types. All other values
165 are reserved (and undefined). */
171 /* The following are well outside the normal acceptable format
172 range, and are used in the register status vector. */
173 fmt_unknown = 0x10000000,
174 fmt_uninterpreted = 0x20000000,
178 /* NOTE: We cannot avoid globals, since the GDB "sim_" interface does
179 not allow a private variable to be passed around. This means that
180 simulators under GDB can only be single-threaded. However, it would
181 be possible for the simulators to be multi-threaded if GDB allowed
182 for a private pointer to be maintained. i.e. a general "void **ptr"
183 variable that GDB passed around in the argument list to all of
184 sim_xxx() routines. It could be initialised to NULL by GDB, and
185 then updated by sim_open() and used by the other sim_xxx() support
186 functions. This would allow new features in the simulator world,
187 like storing a context - continuing execution to gather a result,
188 and then going back to the point where the context was saved and
189 changing some state before continuing. i.e. the ability to perform
190 UNDOs on simulations. It would also allow the simulation of
191 shared-memory multi-processor systems.
193 [NOTE: This is now partially implemented] */
195 static host_callback *callback = NULL; /* handle onto the current callback structure */
197 /* This is nasty, since we have to rely on matching the register
198 numbers used by GDB. Unfortunately, depending on the MIPS target
199 GDB uses different register numbers. We cannot just include the
200 relevant "gdb/tm.h" link, since GDB may not be configured before
201 the sim world, and also the GDB header file requires too much other
203 /* TODO: Sort out a scheme for *KNOWING* the mapping between real
204 registers, and the numbers that GDB uses. At the moment due to the
205 order that the tools are built, we cannot rely on a configured GDB
206 world whilst constructing the simulator. This means we have to
207 assume the GDB register number mapping. */
209 #define LAST_EMBED_REGNUM (89)
212 /* To keep this default simulator simple, and fast, we use a direct
213 vector of registers. The internal simulator engine then uses
214 manifests to access the correct slot. */
215 static ut_reg registers[LAST_EMBED_REGNUM + 1];
216 static int register_widths[LAST_EMBED_REGNUM + 1];
218 #define GPR (®isters[0])
221 #define FGR (®isters[FGRIDX])
223 #define LO (registers[33])
224 #define HI (registers[34])
225 #define PC (registers[37])
226 #define CAUSE (registers[36])
228 #define SR (registers[SRIDX]) /* CPU status register */
230 #define FCR0 (registers[FCR0IDX]) /* really a 32bit register */
231 #define FCR31IDX (70)
232 #define FCR31 (registers[FCR31IDX]) /* really a 32bit register */
234 #define COCIDX (LAST_EMBED_REGNUM + 2) /* special case : outside the normal range */
236 /* The following are pseudonyms for standard registers */
237 #define ZERO (registers[0])
238 #define V0 (registers[2])
239 #define A0 (registers[4])
240 #define A1 (registers[5])
241 #define A2 (registers[6])
242 #define A3 (registers[7])
243 #define SP (registers[29])
244 #define RA (registers[31])
247 /* start-sanitize-r5900 */
249 The R5900 has 128 bit registers, but the hi 64 bits are only touched by
250 multimedia (MMI) instructions. The normal mips instructions just use the
251 lower 64 bits. To avoid changing the older parts of the simulator to
252 handle this weirdness, the high 64 bits of each register are kept in
253 a separate array (registers1). The high 64 bits of any register are by
254 convention refered by adding a '1' to the end of the normal register's
255 name. So LO still refers to the low 64 bits of the LO register, LO1
256 refers to the high 64 bits of that same register.
259 /* The high part of each register */
260 static ut_reg registers1[LAST_EMBED_REGNUM + 1];
262 #define GPR1 (®isters1[0])
264 #define LO1 (registers1[33])
265 #define HI1 (registers1[34])
267 #define BYTES_IN_MMI_REGS (sizeof(registers[0])+sizeof(registers1[0]))
268 #define HALFWORDS_IN_MMI_REGS (BYTES_IN_MMI_REGS/2)
269 #define WORDS_IN_MMI_REGS (BYTES_IN_MMI_REGS/4)
270 #define DOUBLEWORDS_IN_MMI_REGS (BYTES_IN_MMI_REGS/8)
272 #define BYTES_IN_MIPS_REGS (sizeof(registers[0]))
273 #define HALFWORDS_IN_MIPS_REGS (BYTES_IN_MIPS_REGS/2)
274 #define WORDS_IN_MIPS_REGS (BYTES_IN_MIPS_REGS/4)
275 #define DOUBLEWORDS_IN_MIPS_REGS (BYTES_IN_MIPS_REGS/8)
279 SUB_REG_FETCH - return as lvalue some sub-part of a "register"
280 T - type of the sub part
281 TC - # of T's in the mips part of the "register"
282 I - index (from 0) of desired sub part
283 A - low part of "register"
284 A1 - high part of register
286 #define SUB_REG_FETCH(T,TC,A,A1,I) (*(((T*)(((I) < (TC)) ? (A) : (A1))) + ((I) % (TC))))
289 GPR_<type>(R,I) - return, as lvalue, the I'th <type> of general register R
290 where <type> has two letters:
291 1 is S=signed or U=unsigned
292 2 is B=byte H=halfword W=word D=doubleword
295 #define SUB_REG_SB(A,A1,I) SUB_REG_FETCH(signed char, BYTES_IN_MIPS_REGS, A, A1, I)
296 #define SUB_REG_SH(A,A1,I) SUB_REG_FETCH(signed short, HALFWORDS_IN_MIPS_REGS, A, A1, I)
297 #define SUB_REG_SW(A,A1,I) SUB_REG_FETCH(signed int, WORDS_IN_MIPS_REGS, A, A1, I)
298 #define SUB_REG_SD(A,A1,I) SUB_REG_FETCH(signed long long, DOUBLEWORDS_IN_MIPS_REGS, A, A1, I)
300 #define SUB_REG_UB(A,A1,I) SUB_REG_FETCH(unsigned char, BYTES_IN_MIPS_REGS, A, A1, I)
301 #define SUB_REG_UH(A,A1,I) SUB_REG_FETCH(unsigned short, HALFWORDS_IN_MIPS_REGS, A, A1, I)
302 #define SUB_REG_UW(A,A1,I) SUB_REG_FETCH(unsigned int, WORDS_IN_MIPS_REGS, A, A1, I)
303 #define SUB_REG_UD(A,A1,I) SUB_REG_FETCH(unsigned long long,DOUBLEWORDS_IN_MIPS_REGS, A, A1, I)
307 #define GPR_SB(R,I) SUB_REG_SB(®isters[R], ®isters1[R], I)
308 #define GPR_SH(R,I) SUB_REG_SH(®isters[R], ®isters1[R], I)
309 #define GPR_SW(R,I) SUB_REG_SW(®isters[R], ®isters1[R], I)
310 #define GPR_SD(R,I) SUB_REG_SD(®isters[R], ®isters1[R], I)
312 #define GPR_UB(R,I) SUB_REG_UB(®isters[R], ®isters1[R], I)
313 #define GPR_UH(R,I) SUB_REG_UH(®isters[R], ®isters1[R], I)
314 #define GPR_UW(R,I) SUB_REG_UW(®isters[R], ®isters1[R], I)
315 #define GPR_UD(R,I) SUB_REG_UD(®isters[R], ®isters1[R], I)
318 #define RS_SB(I) SUB_REG_SB(&rs_reg, &rs_reg1, I)
319 #define RS_SH(I) SUB_REG_SH(&rs_reg, &rs_reg1, I)
320 #define RS_SW(I) SUB_REG_SW(&rs_reg, &rs_reg1, I)
321 #define RS_SD(I) SUB_REG_SD(&rs_reg, &rs_reg1, I)
323 #define RS_UB(I) SUB_REG_UB(&rs_reg, &rs_reg1, I)
324 #define RS_UH(I) SUB_REG_UH(&rs_reg, &rs_reg1, I)
325 #define RS_UW(I) SUB_REG_UW(&rs_reg, &rs_reg1, I)
326 #define RS_UD(I) SUB_REG_UD(&rs_reg, &rs_reg1, I)
328 #define RT_SB(I) SUB_REG_SB(&rt_reg, &rt_reg1, I)
329 #define RT_SH(I) SUB_REG_SH(&rt_reg, &rt_reg1, I)
330 #define RT_SW(I) SUB_REG_SW(&rt_reg, &rt_reg1, I)
331 #define RT_SD(I) SUB_REG_SD(&rt_reg, &rt_reg1, I)
333 #define RT_UB(I) SUB_REG_UB(&rt_reg, &rt_reg1, I)
334 #define RT_UH(I) SUB_REG_UH(&rt_reg, &rt_reg1, I)
335 #define RT_UW(I) SUB_REG_UW(&rt_reg, &rt_reg1, I)
336 #define RT_UD(I) SUB_REG_UD(&rt_reg, &rt_reg1, I)
340 #define LO_SB(I) SUB_REG_SB(&LO, &LO1, I)
341 #define LO_SH(I) SUB_REG_SH(&LO, &LO1, I)
342 #define LO_SW(I) SUB_REG_SW(&LO, &LO1, I)
343 #define LO_SD(I) SUB_REG_SD(&LO, &LO1, I)
345 #define LO_UB(I) SUB_REG_UB(&LO, &LO1, I)
346 #define LO_UH(I) SUB_REG_UH(&LO, &LO1, I)
347 #define LO_UW(I) SUB_REG_UW(&LO, &LO1, I)
348 #define LO_UD(I) SUB_REG_UD(&LO, &LO1, I)
350 #define HI_SB(I) SUB_REG_SB(&HI, &HI1, I)
351 #define HI_SH(I) SUB_REG_SH(&HI, &HI1, I)
352 #define HI_SW(I) SUB_REG_SW(&HI, &HI1, I)
353 #define HI_SD(I) SUB_REG_SD(&HI, &HI1, I)
355 #define HI_UB(I) SUB_REG_UB(&HI, &HI1, I)
356 #define HI_UH(I) SUB_REG_UH(&HI, &HI1, I)
357 #define HI_UW(I) SUB_REG_UW(&HI, &HI1, I)
358 #define HI_UD(I) SUB_REG_UD(&HI, &HI1, I)
359 /* end-sanitize-r5900 */
362 /* start-sanitize-r5900 */
363 static ut_reg SA; /* the shift amount register */
364 /* end-sanitize-r5900 */
366 static ut_reg EPC = 0; /* Exception PC */
369 /* Keep the current format state for each register: */
370 static FP_formats fpr_state[32];
373 /* The following are internal simulator state variables: */
374 static ut_reg IPC = 0; /* internal Instruction PC */
375 static ut_reg DSPC = 0; /* delay-slot PC */
378 /* TODO : these should be the bitmasks for these bits within the
379 status register. At the moment the following are VR4300
381 #define status_KSU_mask (0x3) /* mask for KSU bits */
382 #define status_KSU_shift (3) /* shift for field */
383 #define ksu_kernel (0x0)
384 #define ksu_supervisor (0x1)
385 #define ksu_user (0x2)
386 #define ksu_unknown (0x3)
388 #define status_IE (1 << 0) /* Interrupt enable */
389 #define status_EXL (1 << 1) /* Exception level */
390 #define status_RE (1 << 25) /* Reverse Endian in user mode */
391 #define status_FR (1 << 26) /* enables MIPS III additional FP registers */
392 #define status_SR (1 << 20) /* soft reset or NMI */
393 #define status_BEV (1 << 22) /* Location of general exception vectors */
394 #define status_TS (1 << 21) /* TLB shutdown has occurred */
395 #define status_ERL (1 << 2) /* Error level */
396 #define status_RP (1 << 27) /* Reduced Power mode */
398 #define cause_BD ((unsigned)1 << 31) /* Exception in branch delay slot */
401 /* Macro to update FPSR condition-code field. This is complicated by
402 the fact that there is a hole in the index range of the bits within
403 the FCSR register. Also, the number of bits visible depends on the
404 MIPS ISA version being supported. */
405 #define SETFCC(cc,v) {\
406 int bit = ((cc == 0) ? 23 : (24 + (cc)));\
407 FCSR = ((FCSR & ~(1 << bit)) | ((v) << bit));\
409 #define GETFCC(cc) (((((cc) == 0) ? (FCSR & (1 << 23)) : (FCSR & (1 << (24 + (cc))))) != 0) ? 1 : 0)
411 /* This should be the COC1 value at the start of the preceding
413 #define PREVCOC1() ((state & simPCOC1) ? 1 : 0)
416 /* Standard FCRS bits: */
417 #define IR (0) /* Inexact Result */
418 #define UF (1) /* UnderFlow */
419 #define OF (2) /* OverFlow */
420 #define DZ (3) /* Division by Zero */
421 #define IO (4) /* Invalid Operation */
422 #define UO (5) /* Unimplemented Operation */
424 /* Get masks for individual flags: */
425 #if 1 /* SAFE version */
426 #define FP_FLAGS(b) (((unsigned)(b) < 5) ? (1 << ((b) + 2)) : 0)
427 #define FP_ENABLE(b) (((unsigned)(b) < 5) ? (1 << ((b) + 7)) : 0)
428 #define FP_CAUSE(b) (((unsigned)(b) < 6) ? (1 << ((b) + 12)) : 0)
430 #define FP_FLAGS(b) (1 << ((b) + 2))
431 #define FP_ENABLE(b) (1 << ((b) + 7))
432 #define FP_CAUSE(b) (1 << ((b) + 12))
435 #define FP_FS (1 << 24) /* MIPS III onwards : Flush to Zero */
437 #define FP_MASK_RM (0x3)
439 #define FP_RM_NEAREST (0) /* Round to nearest (Round) */
440 #define FP_RM_TOZERO (1) /* Round to zero (Trunc) */
441 #define FP_RM_TOPINF (2) /* Round to Plus infinity (Ceil) */
442 #define FP_RM_TOMINF (3) /* Round to Minus infinity (Floor) */
443 #define GETRM() (int)((FCSR >> FP_SH_RM) & FP_MASK_RM)
445 /* Slots for delayed register updates. For the moment we just have a
446 fixed number of slots (rather than a more generic, dynamic
447 system). This keeps the simulator fast. However, we only allow for
448 the register update to be delayed for a single instruction
450 #define PSLOTS (5) /* Maximum number of instruction cycles */
451 static int pending_in;
452 static int pending_out;
453 static int pending_total;
454 static int pending_slot_count[PSLOTS];
455 static int pending_slot_reg[PSLOTS];
456 static ut_reg pending_slot_value[PSLOTS];
458 /*---------------------------------------------------------------------------*/
459 /*-- GDB simulator interface ------------------------------------------------*/
460 /*---------------------------------------------------------------------------*/
462 static void dotrace PARAMS((FILE *tracefh,int type,SIM_ADDR address,int width,char *comment,...));
463 static void sim_warning PARAMS((char *fmt,...));
464 extern void sim_error PARAMS((char *fmt,...));
465 static void ColdReset PARAMS((void));
466 static int AddressTranslation PARAMS((uword64 vAddr,int IorD,int LorS,uword64 *pAddr,int *CCA,int host,int raw));
467 static void StoreMemory PARAMS((int CCA,int AccessLength,uword64 MemElem,uword64 MemElem1,uword64 pAddr,uword64 vAddr,int raw));
468 static void LoadMemory PARAMS((uword64*memvalp,uword64*memval1p,int CCA,int AccessLength,uword64 pAddr,uword64 vAddr,int IorD,int raw));
469 static void SignalException PARAMS((int exception,...));
470 static long getnum PARAMS((char *value));
471 extern void sim_set_profile PARAMS((int frequency));
472 static unsigned int power2 PARAMS((unsigned int value));
474 /*---------------------------------------------------------------------------*/
476 /* The following are not used for MIPS IV onwards: */
477 #define PENDING_FILL(r,v) {\
478 /* printf("DBG: FILL BEFORE pending_in = %d, pending_out = %d, pending_total = %d\n",pending_in,pending_out,pending_total); */\
479 if (pending_slot_reg[pending_in] != (LAST_EMBED_REGNUM + 1))\
480 sim_warning("Attempt to over-write pending value");\
481 pending_slot_count[pending_in] = 2;\
482 pending_slot_reg[pending_in] = (r);\
483 pending_slot_value[pending_in] = (uword64)(v);\
484 /*printf("DBG: FILL reg %d value = 0x%s\n",(r),pr_addr(v));*/\
487 if (pending_in == PSLOTS)\
489 /*printf("DBG: FILL AFTER pending_in = %d, pending_out = %d, pending_total = %d\n",pending_in,pending_out,pending_total);*/\
492 static int LLBIT = 0;
493 /* LLBIT = Load-Linked bit. A bit of "virtual" state used by atomic
494 read-write instructions. It is set when a linked load occurs. It is
495 tested and cleared by the conditional store. It is cleared (during
496 other CPU operations) when a store to the location would no longer
497 be atomic. In particular, it is cleared by exception return
500 static int HIACCESS = 0;
501 static int LOACCESS = 0;
502 static int HI1ACCESS = 0;
503 static int LO1ACCESS = 0;
505 /* ??? The 4300 and a few other processors have interlocks on hi/lo register
506 reads, and hence do not have this problem. To avoid spurious warnings,
507 we just disable this always. */
511 /* The HIACCESS and LOACCESS counts are used to ensure that
512 corruptions caused by using the HI or LO register to close to a
513 following operation are spotted. */
514 static ut_reg HLPC = 0;
515 /* If either of the preceding two instructions have accessed the HI or
516 LO registers, then the values they see should be
517 undefined. However, to keep the simulator world simple, we just let
518 them use the value read and raise a warning to notify the user: */
519 #define CHECKHILO(s) {\
520 if ((HIACCESS != 0) || (LOACCESS != 0) || (HI1ACCESS != 0) || (LO1ACCESS != 0))\
521 sim_warning("%s over-writing HI and LO registers values (PC = 0x%s HLPC = 0x%s)\n",(s),pr_addr(PC),pr_addr(HLPC));\
525 /* NOTE: We keep the following status flags as bit values (1 for true,
526 0 for false). This allows them to be used in binary boolean
527 operations without worrying about what exactly the non-zero true
531 #define UserMode ((((SR & status_KSU_mask) >> status_KSU_shift) == ksu_user) ? 1 : 0)
534 /* Hardware configuration. Affects endianness of LoadMemory and
535 StoreMemory and the endianness of Kernel and Supervisor mode
536 execution. The value is 0 for little-endian; 1 for big-endian. */
537 #define BigEndianMem (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN)
538 /*(state & simBE) ? 1 : 0)*/
541 /* This is true if the host and target have different endianness. */
542 #define ByteSwapMem (CURRENT_TARGET_BYTE_ORDER != CURRENT_HOST_BYTE_ORDER)
545 /* This mode is selected if in User mode with the RE bit being set in
546 SR (Status Register). It reverses the endianness of load and store
548 #define ReverseEndian (((SR & status_RE) && UserMode) ? 1 : 0)
551 /* The endianness for load and store instructions (0=little;1=big). In
552 User mode this endianness may be switched by setting the state_RE
553 bit in the SR register. Thus, BigEndianCPU may be computed as
554 (BigEndianMem EOR ReverseEndian). */
555 #define BigEndianCPU (BigEndianMem ^ ReverseEndian) /* Already bits */
557 #if !defined(FASTSIM) || defined(PROFILE)
558 /* At the moment these values will be the same, since we do not have
559 access to the pipeline cycle count information from the simulator
561 static unsigned int instruction_fetches = 0;
562 static unsigned int instruction_fetch_overflow = 0;
565 /* Flags in the "state" variable: */
566 #define simHALTEX (1 << 2) /* 0 = run; 1 = halt on exception */
567 #define simHALTIN (1 << 3) /* 0 = run; 1 = halt on interrupt */
568 #define simTRACE (1 << 8) /* 0 = do nothing; 1 = trace address activity */
569 #define simPROFILE (1 << 9) /* 0 = do nothing; 1 = gather profiling samples */
570 #define simPCOC0 (1 << 17) /* COC[1] from current */
571 #define simPCOC1 (1 << 18) /* COC[1] from previous */
572 #define simDELAYSLOT (1 << 24) /* 0 = do nothing; 1 = delay slot entry exists */
573 #define simSKIPNEXT (1 << 25) /* 0 = do nothing; 1 = skip instruction */
574 #define simSIGINT (1 << 28) /* 0 = do nothing; 1 = SIGINT has occured */
575 #define simJALDELAYSLOT (1 << 29) /* 1 = in jal delay slot */
577 static unsigned int state = 0;
579 #define DELAYSLOT() {\
580 if (state & simDELAYSLOT)\
581 sim_warning("Delay slot already activated (branch in delay slot?)");\
582 state |= simDELAYSLOT;\
585 #define JALDELAYSLOT() {\
587 state |= simJALDELAYSLOT;\
591 state &= ~simDELAYSLOT;\
592 state |= simSKIPNEXT;\
595 #define INDELAYSLOT() ((state & simDELAYSLOT) != 0)
596 #define INJALDELAYSLOT() ((state & simJALDELAYSLOT) != 0)
598 #define K0BASE (0x80000000)
599 #define K0SIZE (0x20000000)
600 #define K1BASE (0xA0000000)
601 #define K1SIZE (0x20000000)
603 /* Simple run-time monitor support */
604 static unsigned char *monitor = NULL;
605 static ut_reg monitor_base = 0xBFC00000;
606 static unsigned monitor_size = (1 << 11); /* power-of-2 */
608 static char *logfile = NULL; /* logging disabled by default */
609 static FILE *logfh = NULL;
612 static char *tracefile = "trace.din"; /* default filename for trace log */
613 static FILE *tracefh = NULL;
614 static void open_trace PARAMS((void));
618 static unsigned profile_frequency = 256;
619 static unsigned profile_nsamples = (128 << 10);
620 static unsigned short *profile_hist = NULL;
621 static ut_reg profile_minpc;
622 static ut_reg profile_maxpc;
623 static int profile_shift = 0; /* address shift amount */
628 mips_option_handler (sd, opt, arg)
638 tmp = (char *)malloc(strlen(arg) + 1);
640 callback->printf_filtered(callback,"Failed to allocate buffer for logfile name \"%s\"\n",optarg);
649 callback->printf_filtered(callback,"Explicit model selection not yet available (Ignoring \"%s\")\n",optarg);
654 /* Eventually the simTRACE flag could be treated as a toggle, to
655 allow external control of the program points being traced
656 (i.e. only from main onwards, excluding the run-time setup,
660 else if (strcmp (arg, "yes") == 0)
662 else if (strcmp (arg, "no") == 0)
666 fprintf (stderr, "Unreconized trace option `%s'\n", arg);
672 Simulator constructed without tracing support (for performance).\n\
673 Re-compile simulator with \"-DTRACE\" to enable this option.\n");
679 if (optarg != NULL) {
681 tmp = (char *)malloc(strlen(optarg) + 1);
684 callback->printf_filtered(callback,"Failed to allocate buffer for tracefile name \"%s\"\n",optarg);
690 callback->printf_filtered(callback,"Placing trace information into file \"%s\"\n",tracefile);
702 Simulator constructed without profiling support (for performance).\n\
703 Re-compile simulator with \"-DPROFILE\" to enable this option.\n");
705 #endif /* !PROFILE */
709 profile_nsamples = (unsigned)getnum(optarg);
715 sim_set_profile((int)getnum(optarg));
724 static const OPTION mips_options[] =
726 { {"log", required_argument, NULL,'l'},
727 'l', "FILE", "Log file",
728 mips_option_handler },
729 { {"name", required_argument, NULL,'n'},
730 'n', "MODEL", "Select arch model",
731 mips_option_handler },
732 { {"profile", optional_argument, NULL,'p'},
733 'p', "on|off", "Enable profiling",
734 mips_option_handler },
735 { {"trace", optional_argument, NULL,'t'},
736 't', "on|off", "Enable tracing",
737 mips_option_handler },
738 { {"tracefile",required_argument, NULL,'z'},
739 'z', "FILE", "Write trace to file",
740 mips_option_handler },
741 { {"frequency",required_argument, NULL,'y'},
742 'y', "FREQ", "Profile frequency",
743 mips_option_handler },
744 { {"samples", required_argument, NULL,'x'},
745 'y', "SIZE", "Profile sample size",
746 mips_option_handler },
747 { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
751 int interrupt_pending;
754 interrupt_event (SIM_DESC sd, void *data)
758 interrupt_pending = 0;
759 SignalException (Interrupt);
761 else if (!interrupt_pending)
762 sim_events_schedule (sd, 1, interrupt_event, data);
767 /*---------------------------------------------------------------------------*/
768 /*-- GDB simulator interface ------------------------------------------------*/
769 /*---------------------------------------------------------------------------*/
772 sim_open (kind,cb,argv)
777 SIM_DESC sd = &simulator;
779 STATE_OPEN_KIND (sd) = kind;
780 STATE_MAGIC (sd) = SIM_MAGIC_NUMBER;
781 STATE_CALLBACK (sd) = cb;
783 CPU_STATE (STATE_CPU (sd, 0)) = sd;
785 /* FIXME: watchpoints code shouldn't need this */
786 STATE_WATCHPOINTS (sd)->pc = &(PC);
787 STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC);
788 STATE_WATCHPOINTS (sd)->interrupt_handler = interrupt_event;
790 /* memory defaults (unless sim_size was here first) */
791 if (STATE_MEM_SIZE (sd) == 0)
792 STATE_MEM_SIZE (sd) = (2 << 20);
793 STATE_MEM_BASE (sd) = K1BASE;
795 if (callback == NULL) {
796 fprintf(stderr,"SIM Error: sim_open() called without callbacks attached\n");
802 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
804 sim_add_option_table (sd, mips_options);
806 /* getopt will print the error message so we just have to exit if this fails.
807 FIXME: Hmmm... in the case of gdb we need getopt to call
809 if (sim_parse_args (sd, argv) != SIM_RC_OK)
811 /* Uninstall the modules to avoid memory leaks,
812 file descriptor leaks, etc. */
813 sim_module_uninstall (sd);
817 if (sim_post_argv_init (sd) != SIM_RC_OK)
819 /* Uninstall the modules to avoid memory leaks,
820 file descriptor leaks, etc. */
821 sim_module_uninstall (sd);
825 /* verify assumptions the simulator made about the host type system.
826 This macro does not return if there is a problem */
830 /* Check that the host FPU conforms to IEEE 754-1985 for the SINGLE
831 and DOUBLE binary formats. This is a bit nasty, requiring that we
832 trust the explicit manifests held in the source: */
833 /* TODO: We need to cope with the simulated target and the host not
834 having the same endianness. This will require the high and low
835 words of a (double) to be swapped when converting between the
836 host and the simulated target. */
844 s.d = (double)523.2939453125;
846 if ((s.i[0] == 0 && (s.f[1] != (float)4.01102924346923828125
847 || s.i[1] != 0x40805A5A))
848 || (s.i[1] == 0 && (s.f[0] != (float)4.01102924346923828125
849 || s.i[0] != 0x40805A5A)))
851 fprintf(stderr,"The host executing the simulator does not seem to have IEEE 754-1985 std FP\n");
857 /* This is NASTY, in that we are assuming the size of specific
861 for (rn = 0; (rn < (LAST_EMBED_REGNUM + 1)); rn++) {
863 register_widths[rn] = GPRLEN;
864 else if ((rn >= FGRIDX) && (rn < (FGRIDX + 32)))
865 register_widths[rn] = GPRLEN;
866 else if ((rn >= 33) && (rn <= 37))
867 register_widths[rn] = GPRLEN;
868 else if ((rn == SRIDX) || (rn == FCR0IDX) || (rn == FCR31IDX) || ((rn >= 72) && (rn <= 89)))
869 register_widths[rn] = 32;
871 register_widths[rn] = 0;
876 if (logfile != NULL) {
877 if (strcmp(logfile,"-") == 0)
880 logfh = fopen(logfile,"wb+");
882 callback->printf_filtered(callback,"Failed to create file \"%s\", writing log information to stderr.\n",tracefile);
888 /* FIXME: In the future both of these malloc's can be replaced by
889 calls to sim-core. */
891 /* If the host has "mmap" available we could use it to provide a
892 very large virtual address space for the simulator, since memory
893 would only be allocated within the "mmap" space as it is
894 accessed. This can also be linked to the architecture specific
895 support, required to simulate the MMU. */
896 sim_size(STATE_MEM_SIZE (sd));
897 /* NOTE: The above will also have enabled any profiling state! */
899 /* Create the monitor address space as well */
900 monitor = (unsigned char *)calloc(1,monitor_size);
902 fprintf(stderr,"Not enough VM for monitor simulation (%d bytes)\n",
906 if (state & simTRACE)
917 tracefh = fopen(tracefile,"wb+");
920 sim_warning("Failed to create file \"%s\", writing trace information to stderr.",tracefile);
926 /* For the profile writing, we write the data in the host
927 endianness. This unfortunately means we are assuming that the
928 profile file we create is processed on the same host executing the
929 simulator. The gmon.out file format should either have an explicit
930 endianness, or a method of encoding the endianness in the file
940 if (CURRENT_HOST_BYTE_ORDER == BIG_ENDIAN) {
941 buff[3] = ((val >> 0) & 0xFF);
942 buff[2] = ((val >> 8) & 0xFF);
943 buff[1] = ((val >> 16) & 0xFF);
944 buff[0] = ((val >> 24) & 0xFF);
946 buff[0] = ((val >> 0) & 0xFF);
947 buff[1] = ((val >> 8) & 0xFF);
948 buff[2] = ((val >> 16) & 0xFF);
949 buff[3] = ((val >> 24) & 0xFF);
951 if (fwrite(buff,4,1,fh) != 1) {
952 sim_warning("Failed to write 4bytes to the profile file");
965 if (CURRENT_HOST_BYTE_ORDER == BIG_ENDIAN) {
966 buff[1] = ((val >> 0) & 0xFF);
967 buff[0] = ((val >> 8) & 0xFF);
969 buff[0] = ((val >> 0) & 0xFF);
970 buff[1] = ((val >> 8) & 0xFF);
972 if (fwrite(buff,2,1,fh) != 1) {
973 sim_warning("Failed to write 2bytes to the profile file");
980 sim_close (sd, quitting)
985 printf("DBG: sim_close: entered (quitting = %d)\n",quitting);
988 /* Cannot assume sim_kill() has been called */
989 /* "quitting" is non-zero if we cannot hang on errors */
991 /* Ensure that any resources allocated through the callback
992 mechanism are released: */
993 callback->shutdown(callback);
996 if ((state & simPROFILE) && (profile_hist != NULL)) {
997 FILE *pf = fopen("gmon.out","wb");
1001 sim_warning("Failed to open \"gmon.out\" profile file");
1005 printf("DBG: minpc = 0x%s\n",pr_addr(profile_minpc));
1006 printf("DBG: maxpc = 0x%s\n",pr_addr(profile_maxpc));
1008 ok = writeout32(pf,(unsigned int)profile_minpc);
1010 ok = writeout32(pf,(unsigned int)profile_maxpc);
1012 ok = writeout32(pf,(profile_nsamples * 2) + 12); /* size of sample buffer (+ header) */
1014 printf("DBG: nsamples = %d (size = 0x%08X)\n",profile_nsamples,((profile_nsamples * 2) + 12));
1016 for (loop = 0; (ok && (loop < profile_nsamples)); loop++) {
1017 ok = writeout16(pf,profile_hist[loop]);
1026 profile_hist = NULL;
1027 state &= ~simPROFILE;
1029 #endif /* PROFILE */
1032 if (tracefh != NULL && tracefh != stderr)
1038 if (logfh != NULL && logfh != stdout && logfh != stderr)
1042 if (STATE_MEMORY (sd) != NULL)
1043 free(STATE_MEMORY (sd)); /* cfree not available on all hosts */
1044 STATE_MEMORY (sd) = NULL;
1051 sim_write (sd,addr,buffer,size)
1054 unsigned char *buffer;
1058 uword64 vaddr = (uword64)addr;
1060 /* Return the number of bytes written, or zero if error. */
1062 callback->printf_filtered(callback,"sim_write(0x%s,buffer,%d);\n",pr_addr(addr),size);
1065 /* We provide raw read and write routines, since we do not want to
1066 count the GDB memory accesses in our statistics gathering. */
1068 /* There is a lot of code duplication in the individual blocks
1069 below, but the variables are declared locally to a block to give
1070 the optimiser the best chance of improving the code. We have to
1071 perform slow byte reads from the host memory, to ensure that we
1072 get the data into the correct endianness for the (simulated)
1073 target memory world. */
1075 /* Mask count to get odd byte, odd halfword, and odd word out of the
1076 way. We can then perform doubleword transfers to and from the
1077 simulator memory for optimum performance. */
1078 if (index && (index & 1)) {
1081 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW)) {
1082 uword64 value = ((uword64)(*buffer++));
1083 StoreMemory(cca,AccessLength_BYTE,value,0,paddr,vaddr,isRAW);
1086 index &= ~1; /* logical operations usually quicker than arithmetic on RISC systems */
1088 if (index && (index & 2)) {
1091 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW)) {
1093 /* We need to perform the following magic to ensure that that
1094 bytes are written into same byte positions in the target memory
1095 world, regardless of the endianness of the host. */
1097 value = ((uword64)(*buffer++) << 8);
1098 value |= ((uword64)(*buffer++) << 0);
1100 value = ((uword64)(*buffer++) << 0);
1101 value |= ((uword64)(*buffer++) << 8);
1103 StoreMemory(cca,AccessLength_HALFWORD,value,0,paddr,vaddr,isRAW);
1108 if (index && (index & 4)) {
1111 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW)) {
1114 value = ((uword64)(*buffer++) << 24);
1115 value |= ((uword64)(*buffer++) << 16);
1116 value |= ((uword64)(*buffer++) << 8);
1117 value |= ((uword64)(*buffer++) << 0);
1119 value = ((uword64)(*buffer++) << 0);
1120 value |= ((uword64)(*buffer++) << 8);
1121 value |= ((uword64)(*buffer++) << 16);
1122 value |= ((uword64)(*buffer++) << 24);
1124 StoreMemory(cca,AccessLength_WORD,value,0,paddr,vaddr,isRAW);
1129 for (;index; index -= 8) {
1132 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW)) {
1135 value = ((uword64)(*buffer++) << 56);
1136 value |= ((uword64)(*buffer++) << 48);
1137 value |= ((uword64)(*buffer++) << 40);
1138 value |= ((uword64)(*buffer++) << 32);
1139 value |= ((uword64)(*buffer++) << 24);
1140 value |= ((uword64)(*buffer++) << 16);
1141 value |= ((uword64)(*buffer++) << 8);
1142 value |= ((uword64)(*buffer++) << 0);
1144 value = ((uword64)(*buffer++) << 0);
1145 value |= ((uword64)(*buffer++) << 8);
1146 value |= ((uword64)(*buffer++) << 16);
1147 value |= ((uword64)(*buffer++) << 24);
1148 value |= ((uword64)(*buffer++) << 32);
1149 value |= ((uword64)(*buffer++) << 40);
1150 value |= ((uword64)(*buffer++) << 48);
1151 value |= ((uword64)(*buffer++) << 56);
1153 StoreMemory(cca,AccessLength_DOUBLEWORD,value,0,paddr,vaddr,isRAW);
1162 sim_read (sd,addr,buffer,size)
1165 unsigned char *buffer;
1170 /* Return the number of bytes read, or zero if error. */
1172 callback->printf_filtered(callback,"sim_read(0x%s,buffer,%d);\n",pr_addr(addr),size);
1175 /* TODO: Perform same optimisation as the sim_write() code
1176 above. NOTE: This will require a bit more work since we will need
1177 to ensure that the source physical address is doubleword aligned
1178 before, and then deal with trailing bytes. */
1179 for (index = 0; (index < size); index++) {
1180 uword64 vaddr,paddr,value;
1182 vaddr = (uword64)addr + index;
1183 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&cca,isTARGET,isRAW)) {
1184 LoadMemory(&value,NULL,cca,AccessLength_BYTE,paddr,vaddr,isDATA,isRAW);
1185 buffer[index] = (unsigned char)(value&0xFF);
1194 sim_store_register (sd,rn,memory)
1197 unsigned char *memory;
1199 /* NOTE: gdb (the client) stores registers in target byte order
1200 while the simulator uses host byte order */
1202 callback->printf_filtered(callback,"sim_store_register(%d,*memory=0x%s);\n",rn,pr_addr(*((SIM_ADDR *)memory)));
1205 /* Unfortunately this suffers from the same problem as the register
1206 numbering one. We need to know what the width of each logical
1207 register number is for the architecture being simulated. */
1209 if (register_widths[rn] == 0)
1210 sim_warning("Invalid register width for %d (register store ignored)",rn);
1213 if (register_widths[rn] == 32)
1214 registers[rn] = T2H_4 (*(unsigned int*)memory);
1216 registers[rn] = T2H_8 (*(uword64*)memory);
1223 sim_fetch_register (sd,rn,memory)
1226 unsigned char *memory;
1228 /* NOTE: gdb (the client) stores registers in target byte order
1229 while the simulator uses host byte order */
1231 callback->printf_filtered(callback,"sim_fetch_register(%d=0x%s,mem) : place simulator registers into memory\n",rn,pr_addr(registers[rn]));
1234 if (register_widths[rn] == 0)
1235 sim_warning("Invalid register width for %d (register fetch ignored)",rn);
1238 if (register_widths[rn] == 32)
1239 *((unsigned int *)memory) = H2T_4 ((unsigned int)(registers[rn] & 0xFFFFFFFF));
1240 else /* 64bit register */
1241 *((uword64 *)memory) = H2T_8 (registers[rn]);
1249 sim_info (sd,verbose)
1255 /* Accessed from the GDB "info files" command: */
1256 if (STATE_VERBOSE_P (sd) || verbose)
1259 sim_io_printf (sd, "MIPS %d-bit %s endian simulator\n",
1260 (PROCESSOR_64BIT ? 64 : 32),
1261 (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN ? "Big" : "Little"));
1263 sim_io_printf (sd, "0x%08X bytes of memory at 0x%s\n",
1264 STATE_MEM_SIZE (sd),
1265 pr_addr (STATE_MEM_BASE (sd)));
1267 #if !defined(FASTSIM)
1269 /* at present this simulator executes one instruction per
1270 simulator cycle. Consequently this data never changes */
1271 if (instruction_fetch_overflow != 0)
1272 sim_io_printf (sd, "Instruction fetches = 0x%08X%08X\n",
1273 instruction_fetch_overflow, instruction_fetches);
1275 sim_io_printf (sd, "Instruction fetches = %d\n", instruction_fetches);
1277 /* It would be a useful feature, if when performing multi-cycle
1278 simulations (rather than single-stepping) we keep the start and
1279 end times of the execution, so that we can give a performance
1280 figure for the simulator. */
1281 #endif /* !FASTSIM */
1282 sim_io_printf (sd, "Number of execution cycles = %ld\n",
1283 (long) sim_events_time (sd));
1285 /* print information pertaining to MIPS ISA and architecture being simulated */
1286 /* things that may be interesting */
1287 /* instructions executed - if available */
1288 /* cycles executed - if available */
1289 /* pipeline stalls - if available */
1290 /* virtual time taken */
1291 /* profiling size */
1292 /* profiling frequency */
1299 sim_load (sd,prog,abfd,from_tty)
1307 prog_bfd = sim_load_file (sd,
1311 /* pass NULL for abfd, we always open our own */
1313 STATE_OPEN_KIND (sd) == SIM_OPEN_DEBUG);
1314 if (prog_bfd == NULL)
1316 sim_analyze_program (sd, prog_bfd);
1318 /* Configure/verify the target byte order and other runtime
1319 configuration options */
1320 sim_config (sd, PREFERED_TARGET_BYTE_ORDER(prog_bfd));
1322 /* (re) Write the monitor trap address handlers into the monitor
1323 (eeprom) address space. This can only be done once the target
1324 endianness has been determined. */
1327 /* Entry into the IDT monitor is via fixed address vectors, and
1328 not using machine instructions. To avoid clashing with use of
1329 the MIPS TRAP system, we place our own (simulator specific)
1330 "undefined" instructions into the relevant vector slots. */
1331 for (loop = 0; (loop < monitor_size); loop += 4) {
1332 uword64 vaddr = (monitor_base + loop);
1335 if (AddressTranslation(vaddr, isDATA, isSTORE, &paddr, &cca, isTARGET, isRAW))
1336 StoreMemory(cca, AccessLength_WORD,
1337 (RSVD_INSTRUCTION | (((loop >> 2) & RSVD_INSTRUCTION_ARG_MASK) << RSVD_INSTRUCTION_ARG_SHIFT)),
1338 0, paddr, vaddr, isRAW);
1340 /* The PMON monitor uses the same address space, but rather than
1341 branching into it the address of a routine is loaded. We can
1342 cheat for the moment, and direct the PMON routine to IDT style
1343 instructions within the monitor space. This relies on the IDT
1344 monitor not using the locations from 0xBFC00500 onwards as its
1346 for (loop = 0; (loop < 24); loop++)
1348 uword64 vaddr = (monitor_base + 0x500 + (loop * 4));
1351 unsigned int value = ((0x500 - 8) / 8); /* default UNDEFINED reason code */
1370 case 5: /* printf */
1371 value = ((0x500 - 16) / 8); /* not an IDT reason code */
1374 case 8: /* cliexit */
1378 case 11: /* flush_cache */
1382 /* FIXME - should monitor_base be SIM_ADDR?? */
1383 value = ((unsigned int)monitor_base + (value * 8));
1384 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW))
1385 StoreMemory(cca,AccessLength_WORD,value,0,paddr,vaddr,isRAW);
1387 sim_error("Failed to write to monitor space 0x%s",pr_addr(vaddr));
1389 /* The LSI MiniRISC PMON has its vectors at 0x200, not 0x500. */
1391 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isRAW))
1392 StoreMemory(cca,AccessLength_WORD,value,0,paddr,vaddr,isRAW);
1394 sim_error("Failed to write to monitor space 0x%s",pr_addr(vaddr));
1402 sim_create_inferior (sd, argv,env)
1409 printf("DBG: sim_create_inferior entered: start_address = 0x%s\n",
1414 /* If we were providing a more complete I/O, co-processor or memory
1415 simulation, we should perform any "device" initialisation at this
1416 point. This can include pre-loading memory areas with particular
1417 patterns (e.g. simulating ROM monitors). */
1420 PC = (uword64) STATE_START_ADDR(sd);
1422 /* TODO: Sort this properly. SIM_ADDR may already be a 64bit value: */
1423 PC = SIGNEXTEND(bfd_get_start_address(prog_bfd),32);
1426 /* Prepare to execute the program to be simulated */
1427 /* argv and env are NULL terminated lists of pointers */
1430 #if 0 /* def DEBUG */
1431 callback->printf_filtered(callback,"sim_create_inferior() : passed arguments ignored\n");
1434 for (cptr = argv; (cptr && *cptr); cptr++)
1435 printf("DBG: arg \"%s\"\n",*cptr);
1438 /* We should really place the argv slot values into the argument
1439 registers, and onto the stack as required. However, this
1440 assumes that we have a stack defined, which is not necessarily
1441 true at the moment. */
1452 /* This routine should be for terminating any existing simulation
1453 thread. Since we are single-threaded only at the moment, this is
1454 not an issue. It should *NOT* be used to terminate the
1456 #else /* do *NOT* call sim_close */
1457 sim_close(sd, 1); /* Do not hang on errors */
1458 /* This would also be the point where any memory mapped areas used
1459 by the simulator should be released. */
1464 typedef enum {e_terminate,e_help,e_setmemsize,e_reset} e_cmds;
1466 static struct t_sim_command {
1470 } sim_commands[] = {
1471 {e_help, "help", ": Show MIPS simulator private commands"},
1472 {e_setmemsize,"set-memory-size","<n> : Specify amount of memory simulated"},
1473 {e_reset, "reset-system", ": Reset the simulated processor"},
1478 sim_do_command (sd,cmd)
1482 struct t_sim_command *cptr;
1484 if (callback == NULL) {
1485 fprintf(stderr,"Simulator not enabled: \"target sim\" should be used to activate\n");
1489 if (!(cmd && *cmd != '\0'))
1492 /* NOTE: Accessed from the GDB "sim" commmand: */
1493 for (cptr = sim_commands; cptr && cptr->name; cptr++)
1494 if (strncmp (cmd, cptr->name, strlen(cptr->name)) == 0)
1496 cmd += strlen(cptr->name);
1498 case e_help: /* no arguments */
1499 { /* no arguments */
1500 struct t_sim_command *lptr;
1501 callback->printf_filtered(callback,"List of MIPS simulator commands:\n");
1502 for (lptr = sim_commands; lptr->name; lptr++)
1503 callback->printf_filtered(callback,"%s %s\n",lptr->name,lptr->help);
1504 sim_args_command (sd, "help");
1508 case e_setmemsize: /* memory size argument */
1510 unsigned int newsize = (unsigned int)getnum(cmd);
1515 case e_reset: /* no arguments */
1517 /* NOTE: See the comments in sim_open() relating to device
1522 callback->printf_filtered(callback,"FATAL: Matched \"%s\", but failed to match command id %d.\n",cmd,cptr->id);
1530 /* try for a common command when the sim specific lookup fails */
1531 if (sim_args_command (sd, cmd) != SIM_RC_OK)
1532 callback->printf_filtered(callback,"Error: \"%s\" is not a valid MIPS simulator command.\n",cmd);
1538 /*---------------------------------------------------------------------------*/
1539 /* NOTE: The following routines do not seem to be used by GDB at the
1540 moment. However, they may be useful to the standalone simulator
1544 /* The profiling format is described in the "gmon_out.h" header file */
1549 #if defined(PROFILE)
1550 profile_frequency = n;
1551 state |= simPROFILE;
1552 #endif /* PROFILE */
1557 sim_set_profile_size (n)
1560 SIM_DESC sd = &simulator;
1561 #if defined(PROFILE)
1562 if (state & simPROFILE) {
1565 /* Since we KNOW that the memory banks are a power-of-2 in size: */
1566 profile_nsamples = power2(n);
1567 profile_minpc = STATE_MEM_BASE (sd);
1568 profile_maxpc = (STATE_MEM_BASE (sd) + STATE_MEM_SIZE (sd));
1570 /* Just in-case we are sampling every address: NOTE: The shift
1571 right of 2 is because we only have word-aligned PC addresses. */
1572 if (profile_nsamples > (STATE_MEM_SIZE (sd) >> 2))
1573 profile_nsamples = (STATE_MEM_SIZE (sd) >> 2);
1575 /* Since we are dealing with power-of-2 values: */
1576 profile_shift = (((STATE_MEM_SIZE (sd) >> 2) / profile_nsamples) - 1);
1578 bsize = (profile_nsamples * sizeof(unsigned short));
1579 if (profile_hist == NULL)
1580 profile_hist = (unsigned short *)calloc(64,(bsize / 64));
1582 profile_hist = (unsigned short *)realloc(profile_hist,bsize);
1583 if (profile_hist == NULL) {
1584 sim_warning("Failed to allocate VM for profiling buffer (0x%08X bytes)",bsize);
1585 state &= ~simPROFILE;
1588 #endif /* PROFILE */
1597 SIM_DESC sd = &simulator;
1599 /* Used by "run", and internally, to set the simulated memory size */
1601 callback->printf_filtered(callback,"Zero not valid: Memory size still 0x%08X bytes\n",STATE_MEM_SIZE (sd));
1604 newsize = power2(newsize);
1605 if (STATE_MEMORY (sd) == NULL)
1606 new = (char *)calloc(64,(STATE_MEM_SIZE (sd) / 64));
1608 new = (char *)realloc(STATE_MEMORY (sd),newsize);
1610 if (STATE_MEMORY (sd) == NULL)
1611 sim_error("Not enough VM for simulation memory of 0x%08X bytes",STATE_MEM_SIZE (sd));
1613 sim_warning("Failed to resize memory (still 0x%08X bytes)",STATE_MEM_SIZE (sd));
1615 STATE_MEM_SIZE (sd) = (unsigned)newsize;
1616 STATE_MEMORY (sd) = new;
1617 #if defined(PROFILE)
1618 /* Ensure that we sample across the new memory range */
1619 sim_set_profile_size(profile_nsamples);
1620 #endif /* PROFILE */
1630 sim_io_eprintf (sd, "Sim trace not supported");
1632 /* This routine is called by the "run" program, when detailed
1633 execution information is required. Rather than executing a single
1634 instruction, and looping around externally... we just start
1635 simulating, returning TRUE when the simulator stops (for whatever
1639 /* Ensure tracing is enabled, if available */
1640 if (tracefh == NULL)
1648 state &= ~(simSTOP | simSTEP); /* execute until event */
1650 state |= (simHALTEX | simHALTIN); /* treat interrupt event as exception */
1651 /* Start executing instructions from the current state (set
1652 explicitly by register updates, or by sim_create_inferior): */
1659 /*---------------------------------------------------------------------------*/
1660 /*-- Private simulator support interface ------------------------------------*/
1661 /*---------------------------------------------------------------------------*/
1663 /* Simple monitor interface (currently setup for the IDT and PMON monitors) */
1666 unsigned int reason;
1668 SIM_DESC sd = &simulator;
1670 printf("DBG: sim_monitor: entered (reason = %d)\n",reason);
1673 /* The IDT monitor actually allows two instructions per vector
1674 slot. However, the simulator currently causes a trap on each
1675 individual instruction. We cheat, and lose the bottom bit. */
1678 /* The following callback functions are available, however the
1679 monitor we are simulating does not make use of them: get_errno,
1680 isatty, lseek, rename, system, time and unlink */
1682 case 6: /* int open(char *path,int flags) */
1686 if (AddressTranslation(A0,isDATA,isLOAD,&paddr,&cca,isHOST,isREAL))
1687 V0 = callback->open(callback,(char *)((int)paddr),(int)A1);
1689 sim_error("Attempt to pass pointer that does not reference simulated memory");
1693 case 7: /* int read(int file,char *ptr,int len) */
1697 if (AddressTranslation(A1,isDATA,isLOAD,&paddr,&cca,isHOST,isREAL))
1698 V0 = callback->read(callback,(int)A0,(char *)((int)paddr),(int)A2);
1700 sim_error("Attempt to pass pointer that does not reference simulated memory");
1704 case 8: /* int write(int file,char *ptr,int len) */
1708 if (AddressTranslation(A1,isDATA,isLOAD,&paddr,&cca,isHOST,isREAL))
1709 V0 = callback->write(callback,(int)A0,(const char *)((int)paddr),(int)A2);
1711 sim_error("Attempt to pass pointer that does not reference simulated memory");
1715 case 10: /* int close(int file) */
1716 V0 = callback->close(callback,(int)A0);
1719 case 11: /* char inbyte(void) */
1722 if (callback->read_stdin(callback,&tmp,sizeof(char)) != sizeof(char)) {
1723 sim_error("Invalid return from character read");
1731 case 12: /* void outbyte(char chr) : write a byte to "stdout" */
1733 char tmp = (char)(A0 & 0xFF);
1734 callback->write_stdout(callback,&tmp,sizeof(char));
1738 case 17: /* void _exit() */
1739 sim_warning("sim_monitor(17): _exit(int reason) to be coded");
1740 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA, sim_exited,
1741 (unsigned int)(A0 & 0xFFFFFFFF));
1744 case 28 : /* PMON flush_cache */
1747 case 55: /* void get_mem_info(unsigned int *ptr) */
1748 /* in: A0 = pointer to three word memory location */
1749 /* out: [A0 + 0] = size */
1750 /* [A0 + 4] = instruction cache size */
1751 /* [A0 + 8] = data cache size */
1754 uword64 paddr, value;
1758 /* NOTE: We use RAW memory writes here, but since we are not
1759 gathering statistics for the monitor calls we are simulating,
1760 it is not an issue. */
1763 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isREAL)) {
1764 value = (uword64)STATE_MEM_SIZE (sd);
1765 StoreMemory(cca,AccessLength_WORD,value,0,paddr,vaddr,isRAW);
1766 /* We re-do the address translations, in-case the block
1767 overlaps a memory boundary: */
1769 vaddr += (AccessLength_WORD + 1);
1770 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isREAL)) {
1771 StoreMemory(cca,AccessLength_WORD,0,value,paddr,vaddr,isRAW);
1772 vaddr += (AccessLength_WORD + 1);
1773 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&cca,isTARGET,isREAL))
1774 StoreMemory(cca,AccessLength_WORD,value,0,paddr,vaddr,isRAW);
1783 sim_error("Invalid pointer passed into monitor call");
1787 case 158 : /* PMON printf */
1788 /* in: A0 = pointer to format string */
1789 /* A1 = optional argument 1 */
1790 /* A2 = optional argument 2 */
1791 /* A3 = optional argument 3 */
1793 /* The following is based on the PMON printf source */
1797 /* This isn't the quickest way, since we call the host print
1798 routine for every character almost. But it does avoid
1799 having to allocate and manage a temporary string buffer. */
1800 if (AddressTranslation(A0,isDATA,isLOAD,&paddr,&cca,isHOST,isREAL)) {
1801 char *s = (char *)((int)paddr);
1802 ut_reg *ap = &A1; /* 1st argument */
1803 /* TODO: Include check that we only use three arguments (A1, A2 and A3) */
1807 enum {FMT_RJUST, FMT_LJUST, FMT_RJUST0, FMT_CENTER} fmt = FMT_RJUST;
1808 int width = 0, trunc = 0, haddot = 0, longlong = 0;
1811 if (strchr ("dobxXulscefg%", *s))
1819 else if (*s == '*') {
1824 } else if (*s >= '1' && *s <= '9') {
1827 for (t = s; isdigit (*s); s++);
1828 strncpy (tmp, t, s - t);
1830 n = (unsigned int)strtol(tmp,NULL,10);
1836 } else if (*s == '.')
1840 callback->printf_filtered(callback,"%%");
1841 } else if (*s == 's') {
1842 if ((int)*ap != 0) {
1843 if (AddressTranslation(*ap++,isDATA,isLOAD,&paddr,&cca,isHOST,isREAL)) {
1844 char *p = (char *)((int)paddr);;
1845 callback->printf_filtered(callback,p);
1848 sim_error("Attempt to pass pointer that does not reference simulated memory");
1852 callback->printf_filtered(callback,"(null)");
1853 } else if (*s == 'c') {
1855 callback->printf_filtered(callback,"%c",n);
1863 if (strchr ("dobxXu", *s)) {
1864 word64 lv = (word64) *ap++;
1866 callback->printf_filtered(callback,"<binary not supported>");
1868 sprintf(tmp,"%%%s%c",longlong ? "ll" : "",*s);
1870 callback->printf_filtered(callback,tmp,lv);
1872 callback->printf_filtered(callback,tmp,(int)lv);
1874 } else if (strchr ("eEfgG", *s)) {
1875 #ifdef _MSC_VER /* MSVC version 2.x can't convert from uword64 directly */
1876 double dbl = (double)((word64)*ap++);
1878 double dbl = (double)*ap++;
1880 sprintf(tmp,"%%%d.%d%c",width,trunc,*s);
1881 callback->printf_filtered(callback,tmp,dbl);
1887 callback->printf_filtered(callback,"%c",*s++);
1890 sim_error("Attempt to pass pointer that does not reference simulated memory");
1895 sim_warning("TODO: sim_monitor(%d) : PC = 0x%s",reason,pr_addr(IPC));
1896 sim_warning("(Arguments : A0 = 0x%s : A1 = 0x%s : A2 = 0x%s : A3 = 0x%s)",pr_addr(A0),pr_addr(A1),pr_addr(A2),pr_addr(A3));
1902 /* Store a word into memory. */
1905 store_word (vaddr, val)
1912 if ((vaddr & 3) != 0)
1913 SignalException (AddressStore);
1916 if (AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached,
1919 const uword64 mask = 7;
1923 paddr = (paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2));
1924 byte = (vaddr & mask) ^ (BigEndianCPU << 2);
1925 memval = ((uword64) val) << (8 * byte);
1926 StoreMemory (uncached, AccessLength_WORD, memval, 0, paddr, vaddr,
1932 /* Load a word from memory. */
1938 if ((vaddr & 3) != 0)
1939 SignalException (AddressLoad);
1945 if (AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached,
1948 const uword64 mask = 0x7;
1949 const unsigned int reverse = ReverseEndian ? 1 : 0;
1950 const unsigned int bigend = BigEndianCPU ? 1 : 0;
1954 paddr = (paddr & ~mask) | ((paddr & mask) ^ (reverse << 2));
1955 LoadMemory (&memval,NULL,uncached, AccessLength_WORD, paddr, vaddr,
1957 byte = (vaddr & mask) ^ (bigend << 2);
1958 return SIGNEXTEND (((memval >> (8 * byte)) & 0xffffffff), 32);
1965 /* Simulate the mips16 entry and exit pseudo-instructions. These
1966 would normally be handled by the reserved instruction exception
1967 code, but for ease of simulation we just handle them directly. */
1973 int aregs, sregs, rreg;
1976 printf("DBG: mips16_entry: entered (insn = 0x%08X)\n",insn);
1979 aregs = (insn & 0x700) >> 8;
1980 sregs = (insn & 0x0c0) >> 6;
1981 rreg = (insn & 0x020) >> 5;
1983 /* This should be checked by the caller. */
1992 /* This is the entry pseudo-instruction. */
1994 for (i = 0; i < aregs; i++)
1995 store_word ((uword64) (SP + 4 * i), registers[i + 4]);
2003 store_word ((uword64) tsp, RA);
2006 for (i = 0; i < sregs; i++)
2009 store_word ((uword64) tsp, registers[16 + i]);
2017 /* This is the exit pseudo-instruction. */
2024 RA = load_word ((uword64) tsp);
2027 for (i = 0; i < sregs; i++)
2030 registers[i + 16] = load_word ((uword64) tsp);
2037 FGR[0] = WORD64LO (GPR[4]);
2038 fpr_state[0] = fmt_uninterpreted;
2040 else if (aregs == 6)
2042 FGR[0] = WORD64LO (GPR[5]);
2043 FGR[1] = WORD64LO (GPR[4]);
2044 fpr_state[0] = fmt_uninterpreted;
2045 fpr_state[1] = fmt_uninterpreted;
2053 sim_warning(char *fmt,...)
2059 vsprintf (buf, fmt, ap);
2062 if (logfh != NULL) {
2063 fprintf(logfh,"SIM Warning: %s\n", buf);
2065 callback->printf_filtered(callback,"SIM Warning: %s\n", buf);
2067 /* This used to call SignalException with a SimulatorFault, but that causes
2068 the simulator to exit, and that is inappropriate for a warning. */
2073 sim_error(char *fmt,...)
2079 vsprintf (buf, fmt, ap);
2082 callback->printf_filtered(callback,"SIM Error: %s", buf);
2083 SignalException (SimulatorFault, buf);
2093 /* Round *UP* to the nearest power-of-2 if not already one */
2094 if (value != (value & ~(value - 1))) {
2095 for (tmp = value, loop = 0; (tmp != 0); loop++)
2097 value = (1 << loop);
2110 num = strtol(value,&end,10);
2112 callback->printf_filtered(callback,"Warning: Invalid number \"%s\" ignored, using zero\n",value);
2114 if (*end && ((tolower(*end) == 'k') || (tolower(*end) == 'm'))) {
2115 if (tolower(*end) == 'k')
2122 callback->printf_filtered(callback,"Warning: Spurious characters \"%s\" at end of number ignored\n",end);
2128 /*-- trace support ----------------------------------------------------------*/
2130 /* The TRACE support is provided (if required) in the memory accessing
2131 routines. Since we are also providing the architecture specific
2132 features, the architecture simulation code can also deal with
2133 notifying the TRACE world of cache flushes, etc. Similarly we do
2134 not need to provide profiling support in the simulator engine,
2135 since we can sample in the instruction fetch control loop. By
2136 defining the TRACE manifest, we add tracing as a run-time
2140 /* Tracing by default produces "din" format (as required by
2141 dineroIII). Each line of such a trace file *MUST* have a din label
2142 and address field. The rest of the line is ignored, so comments can
2143 be included if desired. The first field is the label which must be
2144 one of the following values:
2149 3 escape record (treated as unknown access type)
2150 4 escape record (causes cache flush)
2152 The address field is a 32bit (lower-case) hexadecimal address
2153 value. The address should *NOT* be preceded by "0x".
2155 The size of the memory transfer is not important when dealing with
2156 cache lines (as long as no more than a cache line can be
2157 transferred in a single operation :-), however more information
2158 could be given following the dineroIII requirement to allow more
2159 complete memory and cache simulators to provide better
2160 results. i.e. the University of Pisa has a cache simulator that can
2161 also take bus size and speed as (variable) inputs to calculate
2162 complete system performance (a much more useful ability when trying
2163 to construct an end product, rather than a processor). They
2164 currently have an ARM version of their tool called ChARM. */
2168 void dotrace(FILE *tracefh,int type,SIM_ADDR address,int width,char *comment,...)
2170 if (state & simTRACE) {
2172 fprintf(tracefh,"%d %s ; width %d ; ",
2176 va_start(ap,comment);
2177 vfprintf(tracefh,comment,ap);
2179 fprintf(tracefh,"\n");
2181 /* NOTE: Since the "din" format will only accept 32bit addresses, and
2182 we may be generating 64bit ones, we should put the hi-32bits of the
2183 address into the comment field. */
2185 /* TODO: Provide a buffer for the trace lines. We can then avoid
2186 performing writes until the buffer is filled, or the file is
2189 /* NOTE: We could consider adding a comment field to the "din" file
2190 produced using type 3 markers (unknown access). This would then
2191 allow information about the program that the "din" is for, and
2192 the MIPs world that was being simulated, to be placed into the
2199 /*---------------------------------------------------------------------------*/
2200 /*-- simulator engine -------------------------------------------------------*/
2201 /*---------------------------------------------------------------------------*/
2206 /* RESET: Fixed PC address: */
2207 PC = (((uword64)0xFFFFFFFF<<32) | 0xBFC00000);
2208 /* The reset vector address is in the unmapped, uncached memory space. */
2210 SR &= ~(status_SR | status_TS | status_RP);
2211 SR |= (status_ERL | status_BEV);
2213 #if defined(HASFPU) && (GPRLEN == (64))
2214 /* Cheat and allow access to the complete register set immediately: */
2215 SR |= status_FR; /* 64bit registers */
2216 #endif /* HASFPU and 64bit FP registers */
2218 /* Ensure that any instructions with pending register updates are
2222 for (loop = 0; (loop < PSLOTS); loop++)
2223 pending_slot_reg[loop] = (LAST_EMBED_REGNUM + 1);
2224 pending_in = pending_out = pending_total = 0;
2228 /* Initialise the FPU registers to the unknown state */
2231 for (rn = 0; (rn < 32); rn++)
2232 fpr_state[rn] = fmt_uninterpreted;
2239 /* Description from page A-22 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2240 /* Translate a virtual address to a physical address and cache
2241 coherence algorithm describing the mechanism used to resolve the
2242 memory reference. Given the virtual address vAddr, and whether the
2243 reference is to Instructions ot Data (IorD), find the corresponding
2244 physical address (pAddr) and the cache coherence algorithm (CCA)
2245 used to resolve the reference. If the virtual address is in one of
2246 the unmapped address spaces the physical address and the CCA are
2247 determined directly by the virtual address. If the virtual address
2248 is in one of the mapped address spaces then the TLB is used to
2249 determine the physical address and access type; if the required
2250 translation is not present in the TLB or the desired access is not
2251 permitted the function fails and an exception is taken.
2253 NOTE: This function is extended to return an exception state. This,
2254 along with the exception generation is used to notify whether a
2255 valid address translation occured */
2258 AddressTranslation(vAddr,IorD,LorS,pAddr,CCA,host,raw)
2267 SIM_DESC sd = &simulator;
2268 int res = -1; /* TRUE : Assume good return */
2271 callback->printf_filtered(callback,"AddressTranslation(0x%s,%s,%s,...);\n",pr_addr(vAddr),(IorD ? "isDATA" : "isINSTRUCTION"),(LorS ? "iSTORE" : "isLOAD"));
2274 /* Check that the address is valid for this memory model */
2276 /* For a simple (flat) memory model, we simply pass virtual
2277 addressess through (mostly) unchanged. */
2278 vAddr &= 0xFFFFFFFF;
2280 /* Treat the kernel memory spaces identically for the moment: */
2281 if ((STATE_MEM_BASE (sd) == K1BASE) && (vAddr >= K0BASE) && (vAddr < (K0BASE + K0SIZE)))
2282 vAddr += (K1BASE - K0BASE);
2284 /* Also assume that the K1BASE memory wraps. This is required to
2285 allow the PMON run-time __sizemem() routine to function (without
2286 having to provide exception simulation). NOTE: A kludge to work
2287 around the fact that the monitor memory is currently held in the
2289 if (((vAddr < monitor_base) || (vAddr >= (monitor_base + monitor_size))) && (vAddr >= K1BASE && vAddr < (K1BASE + K1SIZE)))
2290 vAddr = (K1BASE | (vAddr & (STATE_MEM_SIZE (sd) - 1)));
2292 *pAddr = vAddr; /* default for isTARGET */
2293 *CCA = Uncached; /* not used for isHOST */
2295 /* NOTE: This is a duplicate of the code that appears in the
2296 LoadMemory and StoreMemory functions. They should be merged into
2297 a single function (that can be in-lined if required). */
2298 if ((vAddr >= STATE_MEM_BASE (sd)) && (vAddr < (STATE_MEM_BASE (sd) + STATE_MEM_SIZE (sd)))) {
2300 *pAddr = (int)&STATE_MEMORY (sd)[((unsigned int)(vAddr - STATE_MEM_BASE (sd)) & (STATE_MEM_SIZE (sd) - 1))];
2301 } else if ((vAddr >= monitor_base) && (vAddr < (monitor_base + monitor_size))) {
2303 *pAddr = (int)&monitor[((unsigned int)(vAddr - monitor_base) & (monitor_size - 1))];
2306 sim_warning("Failed: AddressTranslation(0x%s,%s,%s,...) IPC = 0x%s",pr_addr(vAddr),(IorD ? "isDATA" : "isINSTRUCTION"),(LorS ? "isSTORE" : "isLOAD"),pr_addr(IPC));
2308 res = 0; /* AddressTranslation has failed */
2309 *pAddr = (SIM_ADDR)-1;
2310 if (!raw) /* only generate exceptions on real memory transfers */
2311 SignalException((LorS == isSTORE) ? AddressStore : AddressLoad);
2314 /* This is a normal occurance during gdb operation, for instance trying
2315 to print parameters at function start before they have been setup,
2316 and hence we should not print a warning except when debugging the
2318 sim_warning("AddressTranslation for %s %s from 0x%s failed",(IorD ? "data" : "instruction"),(LorS ? "store" : "load"),pr_addr(vAddr));
2325 /* Description from page A-23 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2326 /* Prefetch data from memory. Prefetch is an advisory instruction for
2327 which an implementation specific action is taken. The action taken
2328 may increase performance, but must not change the meaning of the
2329 program, or alter architecturally-visible state. */
2332 Prefetch(CCA,pAddr,vAddr,DATA,hint)
2340 callback->printf_filtered(callback,"Prefetch(%d,0x%s,0x%s,%d,%d);\n",CCA,pr_addr(pAddr),pr_addr(vAddr),DATA,hint);
2343 /* For our simple memory model we do nothing */
2347 /* Description from page A-22 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2348 /* Load a value from memory. Use the cache and main memory as
2349 specified in the Cache Coherence Algorithm (CCA) and the sort of
2350 access (IorD) to find the contents of AccessLength memory bytes
2351 starting at physical location pAddr. The data is returned in the
2352 fixed width naturally-aligned memory element (MemElem). The
2353 low-order two (or three) bits of the address and the AccessLength
2354 indicate which of the bytes within MemElem needs to be given to the
2355 processor. If the memory access type of the reference is uncached
2356 then only the referenced bytes are read from memory and valid
2357 within the memory element. If the access type is cached, and the
2358 data is not present in cache, an implementation specific size and
2359 alignment block of memory is read and loaded into the cache to
2360 satisfy a load reference. At a minimum, the block is the entire
2363 LoadMemory(memvalp,memval1p,CCA,AccessLength,pAddr,vAddr,IorD,raw)
2373 SIM_DESC sd = &simulator;
2378 if (STATE_MEMORY (sd) == NULL)
2379 callback->printf_filtered(callback,"DBG: LoadMemory(%p,%p,%d,%d,0x%s,0x%s,%s,%s)\n",memvalp,memval1p,CCA,AccessLength,pr_addr(pAddr),pr_addr(vAddr),(IorD ? "isDATA" : "isINSTRUCTION"),(raw ? "isRAW" : "isREAL"));
2382 #if defined(WARN_MEM)
2383 if (CCA != uncached)
2384 sim_warning("LoadMemory CCA (%d) is not uncached (currently all accesses treated as cached)",CCA);
2386 if (((pAddr & LOADDRMASK) + AccessLength) > LOADDRMASK) {
2387 /* In reality this should be a Bus Error */
2388 sim_error("AccessLength of %d would extend over %dbit aligned boundary for physical address 0x%s\n",AccessLength,(LOADDRMASK + 1)<<2,pr_addr(pAddr));
2390 #endif /* WARN_MEM */
2392 /* Decide which physical memory locations are being dealt with. At
2393 this point we should be able to split the pAddr bits into the
2394 relevant address map being simulated. If the "raw" variable is
2395 set, the memory read being performed should *NOT* update any I/O
2396 state or affect the CPU state. This also includes avoiding
2397 affecting statistics gathering. */
2399 /* If instruction fetch then we need to check that the two lo-order
2400 bits are zero, otherwise raise a InstructionFetch exception: */
2401 if ((IorD == isINSTRUCTION)
2402 && ((pAddr & 0x3) != 0)
2403 && (((pAddr & 0x1) != 0) || ((vAddr & 0x1) == 0)))
2404 SignalException(InstructionFetch);
2406 unsigned int index = 0;
2407 unsigned char *mem = NULL;
2411 dotrace(tracefh,((IorD == isDATA) ? 0 : 2),(unsigned int)(pAddr&0xFFFFFFFF),(AccessLength + 1),"load%s",((IorD == isDATA) ? "" : " instruction"));
2414 /* NOTE: Quicker methods of decoding the address space can be used
2415 when a real memory map is being simulated (i.e. using hi-order
2416 address bits to select device). */
2417 if ((pAddr >= STATE_MEM_BASE (sd)) && (pAddr < (STATE_MEM_BASE (sd) + STATE_MEM_SIZE (sd)))) {
2418 index = ((unsigned int)(pAddr - STATE_MEM_BASE (sd)) & (STATE_MEM_SIZE (sd) - 1));
2419 mem = STATE_MEMORY (sd);
2420 } else if ((pAddr >= monitor_base) && (pAddr < (monitor_base + monitor_size))) {
2421 index = ((unsigned int)(pAddr - monitor_base) & (monitor_size - 1));
2425 sim_error("Simulator memory not found for physical address 0x%s\n",pr_addr(pAddr));
2427 /* If we obtained the endianness of the host, and it is the same
2428 as the target memory system we can optimise the memory
2429 accesses. However, without that information we must perform
2430 slow transfer, and hope that the compiler optimisation will
2431 merge successive loads. */
2433 /* In reality we should always be loading a doubleword value (or
2434 word value in 32bit memory worlds). The external code then
2435 extracts the required bytes. However, to keep performance
2436 high we only load the required bytes into the relevant
2439 switch (AccessLength) { /* big-endian memory */
2440 case AccessLength_QUADWORD :
2441 value1 |= ((uword64)mem[index++] << 56);
2442 case 14: /* AccessLength is one less than datalen */
2443 value1 |= ((uword64)mem[index++] << 48);
2445 value1 |= ((uword64)mem[index++] << 40);
2447 value1 |= ((uword64)mem[index++] << 32);
2449 value1 |= ((unsigned int)mem[index++] << 24);
2451 value1 |= ((unsigned int)mem[index++] << 16);
2453 value1 |= ((unsigned int)mem[index++] << 8);
2455 value1 |= mem[index];
2457 case AccessLength_DOUBLEWORD :
2458 value |= ((uword64)mem[index++] << 56);
2459 case AccessLength_SEPTIBYTE :
2460 value |= ((uword64)mem[index++] << 48);
2461 case AccessLength_SEXTIBYTE :
2462 value |= ((uword64)mem[index++] << 40);
2463 case AccessLength_QUINTIBYTE :
2464 value |= ((uword64)mem[index++] << 32);
2465 case AccessLength_WORD :
2466 value |= ((unsigned int)mem[index++] << 24);
2467 case AccessLength_TRIPLEBYTE :
2468 value |= ((unsigned int)mem[index++] << 16);
2469 case AccessLength_HALFWORD :
2470 value |= ((unsigned int)mem[index++] << 8);
2471 case AccessLength_BYTE :
2472 value |= mem[index];
2476 index += (AccessLength + 1);
2477 switch (AccessLength) { /* little-endian memory */
2478 case AccessLength_QUADWORD :
2479 value1 |= ((uword64)mem[--index] << 56);
2480 case 14: /* AccessLength is one less than datalen */
2481 value1 |= ((uword64)mem[--index] << 48);
2483 value1 |= ((uword64)mem[--index] << 40);
2485 value1 |= ((uword64)mem[--index] << 32);
2487 value1 |= ((uword64)mem[--index] << 24);
2489 value1 |= ((uword64)mem[--index] << 16);
2491 value1 |= ((uword64)mem[--index] << 8);
2493 value1 |= ((uword64)mem[--index] << 0);
2495 case AccessLength_DOUBLEWORD :
2496 value |= ((uword64)mem[--index] << 56);
2497 case AccessLength_SEPTIBYTE :
2498 value |= ((uword64)mem[--index] << 48);
2499 case AccessLength_SEXTIBYTE :
2500 value |= ((uword64)mem[--index] << 40);
2501 case AccessLength_QUINTIBYTE :
2502 value |= ((uword64)mem[--index] << 32);
2503 case AccessLength_WORD :
2504 value |= ((uword64)mem[--index] << 24);
2505 case AccessLength_TRIPLEBYTE :
2506 value |= ((uword64)mem[--index] << 16);
2507 case AccessLength_HALFWORD :
2508 value |= ((uword64)mem[--index] << 8);
2509 case AccessLength_BYTE :
2510 value |= ((uword64)mem[--index] << 0);
2516 printf("DBG: LoadMemory() : (offset %d) : value = 0x%s%s\n",
2517 (int)(pAddr & LOADDRMASK),pr_uword64(value1),pr_uword64(value));
2520 /* TODO: We could try and avoid the shifts when dealing with raw
2521 memory accesses. This would mean updating the LoadMemory and
2522 StoreMemory routines to avoid shifting the data before
2523 returning or using it. */
2524 if (AccessLength <= AccessLength_DOUBLEWORD) {
2525 if (!raw) { /* do nothing for raw accessess */
2527 value <<= (((7 - (pAddr & LOADDRMASK)) - AccessLength) * 8);
2528 else /* little-endian only needs to be shifted up to the correct byte offset */
2529 value <<= ((pAddr & LOADDRMASK) * 8);
2534 printf("DBG: LoadMemory() : shifted value = 0x%s%s\n",
2535 pr_uword64(value1),pr_uword64(value));
2541 if (memval1p) *memval1p = value1;
2545 /* Description from page A-23 of the "MIPS IV Instruction Set" manual
2547 /* Store a value to memory. The specified data is stored into the
2548 physical location pAddr using the memory hierarchy (data caches and
2549 main memory) as specified by the Cache Coherence Algorithm
2550 (CCA). The MemElem contains the data for an aligned, fixed-width
2551 memory element (word for 32-bit processors, doubleword for 64-bit
2552 processors), though only the bytes that will actually be stored to
2553 memory need to be valid. The low-order two (or three) bits of pAddr
2554 and the AccessLength field indicates which of the bytes within the
2555 MemElem data should actually be stored; only these bytes in memory
2559 StoreMemory(CCA,AccessLength,MemElem,MemElem1,pAddr,vAddr,raw)
2563 uword64 MemElem1; /* High order 64 bits */
2568 SIM_DESC sd = &simulator;
2570 callback->printf_filtered(callback,"DBG: StoreMemory(%d,%d,0x%s,0x%s,0x%s,0x%s,%s)\n",CCA,AccessLength,pr_uword64(MemElem),pr_uword64(MemElem1),pr_addr(pAddr),pr_addr(vAddr),(raw ? "isRAW" : "isREAL"));
2573 #if defined(WARN_MEM)
2574 if (CCA != uncached)
2575 sim_warning("StoreMemory CCA (%d) is not uncached (currently all accesses treated as cached)",CCA);
2577 if (((pAddr & LOADDRMASK) + AccessLength) > LOADDRMASK)
2578 sim_error("AccessLength of %d would extend over %dbit aligned boundary for physical address 0x%s\n",AccessLength,(LOADDRMASK + 1)<<2,pr_addr(pAddr));
2579 #endif /* WARN_MEM */
2583 dotrace(tracefh,1,(unsigned int)(pAddr&0xFFFFFFFF),(AccessLength + 1),"store");
2586 /* See the comments in the LoadMemory routine about optimising
2587 memory accesses. Also if we wanted to make the simulator smaller,
2588 we could merge a lot of this code with the LoadMemory
2589 routine. However, this would slow the simulator down with
2590 run-time conditionals. */
2592 unsigned int index = 0;
2593 unsigned char *mem = NULL;
2595 if ((pAddr >= STATE_MEM_BASE (sd)) && (pAddr < (STATE_MEM_BASE (sd) + STATE_MEM_SIZE (sd)))) {
2596 index = ((unsigned int)(pAddr - STATE_MEM_BASE (sd)) & (STATE_MEM_SIZE (sd) - 1));
2597 mem = STATE_MEMORY (sd);
2598 } else if ((pAddr >= monitor_base) && (pAddr < (monitor_base + monitor_size))) {
2599 index = ((unsigned int)(pAddr - monitor_base) & (monitor_size - 1));
2604 sim_error("Simulator memory not found for physical address 0x%s\n",pr_addr(pAddr));
2609 printf("DBG: StoreMemory: offset = %d MemElem = 0x%s%s\n",(unsigned int)(pAddr & LOADDRMASK),pr_uword64(MemElem1),pr_uword64(MemElem));
2612 if (AccessLength <= AccessLength_DOUBLEWORD) {
2615 shift = ((7 - AccessLength) * 8);
2616 else /* real memory access */
2617 shift = ((pAddr & LOADDRMASK) * 8);
2620 /* no need to shift raw little-endian data */
2622 MemElem >>= ((pAddr & LOADDRMASK) * 8);
2627 printf("DBG: StoreMemory: shift = %d MemElem = 0x%s%s\n",shift,pr_uword64(MemElem1),pr_uword64(MemElem));
2631 switch (AccessLength) { /* big-endian memory */
2632 case AccessLength_QUADWORD :
2633 mem[index++] = (unsigned char)(MemElem1 >> 56);
2636 mem[index++] = (unsigned char)(MemElem1 >> 56);
2639 mem[index++] = (unsigned char)(MemElem1 >> 56);
2642 mem[index++] = (unsigned char)(MemElem1 >> 56);
2645 mem[index++] = (unsigned char)(MemElem1 >> 56);
2648 mem[index++] = (unsigned char)(MemElem1 >> 56);
2651 mem[index++] = (unsigned char)(MemElem1 >> 56);
2654 mem[index++] = (unsigned char)(MemElem1 >> 56);
2656 case AccessLength_DOUBLEWORD :
2657 mem[index++] = (unsigned char)(MemElem >> 56);
2659 case AccessLength_SEPTIBYTE :
2660 mem[index++] = (unsigned char)(MemElem >> 56);
2662 case AccessLength_SEXTIBYTE :
2663 mem[index++] = (unsigned char)(MemElem >> 56);
2665 case AccessLength_QUINTIBYTE :
2666 mem[index++] = (unsigned char)(MemElem >> 56);
2668 case AccessLength_WORD :
2669 mem[index++] = (unsigned char)(MemElem >> 56);
2671 case AccessLength_TRIPLEBYTE :
2672 mem[index++] = (unsigned char)(MemElem >> 56);
2674 case AccessLength_HALFWORD :
2675 mem[index++] = (unsigned char)(MemElem >> 56);
2677 case AccessLength_BYTE :
2678 mem[index++] = (unsigned char)(MemElem >> 56);
2682 index += (AccessLength + 1);
2683 switch (AccessLength) { /* little-endian memory */
2684 case AccessLength_QUADWORD :
2685 mem[--index] = (unsigned char)(MemElem1 >> 56);
2687 mem[--index] = (unsigned char)(MemElem1 >> 48);
2689 mem[--index] = (unsigned char)(MemElem1 >> 40);
2691 mem[--index] = (unsigned char)(MemElem1 >> 32);
2693 mem[--index] = (unsigned char)(MemElem1 >> 24);
2695 mem[--index] = (unsigned char)(MemElem1 >> 16);
2697 mem[--index] = (unsigned char)(MemElem1 >> 8);
2699 mem[--index] = (unsigned char)(MemElem1 >> 0);
2701 case AccessLength_DOUBLEWORD :
2702 mem[--index] = (unsigned char)(MemElem >> 56);
2703 case AccessLength_SEPTIBYTE :
2704 mem[--index] = (unsigned char)(MemElem >> 48);
2705 case AccessLength_SEXTIBYTE :
2706 mem[--index] = (unsigned char)(MemElem >> 40);
2707 case AccessLength_QUINTIBYTE :
2708 mem[--index] = (unsigned char)(MemElem >> 32);
2709 case AccessLength_WORD :
2710 mem[--index] = (unsigned char)(MemElem >> 24);
2711 case AccessLength_TRIPLEBYTE :
2712 mem[--index] = (unsigned char)(MemElem >> 16);
2713 case AccessLength_HALFWORD :
2714 mem[--index] = (unsigned char)(MemElem >> 8);
2715 case AccessLength_BYTE :
2716 mem[--index] = (unsigned char)(MemElem >> 0);
2727 /* Description from page A-26 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2728 /* Order loads and stores to synchronise shared memory. Perform the
2729 action necessary to make the effects of groups of synchronizable
2730 loads and stores indicated by stype occur in the same order for all
2733 SyncOperation(stype)
2737 callback->printf_filtered(callback,"SyncOperation(%d) : TODO\n",stype);
2742 /* Description from page A-26 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2743 /* Signal an exception condition. This will result in an exception
2744 that aborts the instruction. The instruction operation pseudocode
2745 will never see a return from this function call. */
2748 SignalException (int exception,...)
2751 SIM_DESC sd = &simulator;
2752 /* Ensure that any active atomic read/modify/write operation will fail: */
2755 switch (exception) {
2756 /* TODO: For testing purposes I have been ignoring TRAPs. In
2757 reality we should either simulate them, or allow the user to
2758 ignore them at run-time. */
2760 sim_warning("Ignoring instruction TRAP (PC 0x%s)",pr_addr(IPC));
2763 case ReservedInstruction :
2766 unsigned int instruction;
2767 va_start(ap,exception);
2768 instruction = va_arg(ap,unsigned int);
2770 /* Provide simple monitor support using ReservedInstruction
2771 exceptions. The following code simulates the fixed vector
2772 entry points into the IDT monitor by causing a simulator
2773 trap, performing the monitor operation, and returning to
2774 the address held in the $ra register (standard PCS return
2775 address). This means we only need to pre-load the vector
2776 space with suitable instruction values. For systems were
2777 actual trap instructions are used, we would not need to
2778 perform this magic. */
2779 if ((instruction & RSVD_INSTRUCTION_MASK) == RSVD_INSTRUCTION) {
2780 sim_monitor( ((instruction >> RSVD_INSTRUCTION_ARG_SHIFT) & RSVD_INSTRUCTION_ARG_MASK) );
2781 PC = RA; /* simulate the return from the vector entry */
2782 /* NOTE: This assumes that a branch-and-link style
2783 instruction was used to enter the vector (which is the
2784 case with the current IDT monitor). */
2785 sim_engine_restart (sd, STATE_CPU (sd, 0), NULL, NULL_CIA);
2787 /* Look for the mips16 entry and exit instructions, and
2788 simulate a handler for them. */
2789 else if ((IPC & 1) != 0
2790 && (instruction & 0xf81f) == 0xe809
2791 && (instruction & 0x0c0) != 0x0c0) {
2792 mips16_entry (instruction);
2793 sim_engine_restart (sd, STATE_CPU (sd, 0), NULL, NULL_CIA);
2794 } /* else fall through to normal exception processing */
2795 sim_warning("ReservedInstruction 0x%08X at IPC = 0x%s",instruction,pr_addr(IPC));
2800 if (exception != BreakPoint)
2801 callback->printf_filtered(callback,"DBG: SignalException(%d) IPC = 0x%s\n",exception,pr_addr(IPC));
2803 /* Store exception code into current exception id variable (used
2806 /* TODO: If not simulating exceptions then stop the simulator
2807 execution. At the moment we always stop the simulation. */
2808 /* state |= (simSTOP | simEXCEPTION); */
2810 /* Keep a copy of the current A0 in-case this is the program exit
2812 if (exception == BreakPoint) {
2814 unsigned int instruction;
2815 va_start(ap,exception);
2816 instruction = va_arg(ap,unsigned int);
2818 /* Check for our special terminating BREAK: */
2819 if ((instruction & 0x03FFFFC0) == 0x03ff0000) {
2820 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2821 sim_exited, (unsigned int)(A0 & 0xFFFFFFFF));
2825 /* See figure 5-17 for an outline of the code below */
2826 if (! (SR & status_EXL))
2828 CAUSE = (exception << 2);
2829 if (state & simDELAYSLOT)
2831 state &= ~simDELAYSLOT;
2833 EPC = (IPC - 4); /* reference the branch instruction */
2837 /* FIXME: TLB et.al. */
2846 /* Store exception code into current exception id variable (used
2848 if (SR & status_BEV)
2849 PC = (signed)0xBFC00200 + 0x180;
2851 PC = (signed)0x80000000 + 0x180;
2853 switch ((CAUSE >> 2) & 0x1F)
2856 /* Interrupts arrive during event processing, no need to
2860 case TLBModification:
2865 case InstructionFetch:
2867 /* The following is so that the simulator will continue from the
2868 exception address on breakpoint operations. */
2870 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2871 sim_stopped, SIGBUS);
2873 case ReservedInstruction:
2874 case CoProcessorUnusable:
2876 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2877 sim_stopped, SIGILL);
2879 case IntegerOverflow:
2881 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2882 sim_stopped, SIGFPE);
2889 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2890 sim_stopped, SIGTRAP);
2892 default : /* Unknown internal exception */
2894 sim_engine_halt (sd, STATE_CPU (sd, 0), NULL, NULL_CIA,
2895 sim_stopped, SIGQUIT);
2899 case SimulatorFault:
2903 va_start(ap,exception);
2904 msg = va_arg(ap,char *);
2906 sim_engine_abort (sd, STATE_CPU (sd, 0), NULL_CIA,
2907 "FATAL: Simulator error \"%s\"\n",msg);
2914 #if defined(WARN_RESULT)
2915 /* Description from page A-26 of the "MIPS IV Instruction Set" manual (revision 3.1) */
2916 /* This function indicates that the result of the operation is
2917 undefined. However, this should not affect the instruction
2918 stream. All that is meant to happen is that the destination
2919 register is set to an undefined result. To keep the simulator
2920 simple, we just don't bother updating the destination register, so
2921 the overall result will be undefined. If desired we can stop the
2922 simulator by raising a pseudo-exception. */
2926 sim_warning("UndefinedResult: IPC = 0x%s",pr_addr(IPC));
2927 #if 0 /* Disabled for the moment, since it actually happens a lot at the moment. */
2932 #endif /* WARN_RESULT */
2935 CacheOp(op,pAddr,vAddr,instruction)
2939 unsigned int instruction;
2941 #if 1 /* stop warning message being displayed (we should really just remove the code) */
2942 static int icache_warning = 1;
2943 static int dcache_warning = 1;
2945 static int icache_warning = 0;
2946 static int dcache_warning = 0;
2949 /* If CP0 is not useable (User or Supervisor mode) and the CP0
2950 enable bit in the Status Register is clear - a coprocessor
2951 unusable exception is taken. */
2953 callback->printf_filtered(callback,"TODO: Cache availability checking (PC = 0x%s)\n",pr_addr(IPC));
2957 case 0: /* instruction cache */
2959 case 0: /* Index Invalidate */
2960 case 1: /* Index Load Tag */
2961 case 2: /* Index Store Tag */
2962 case 4: /* Hit Invalidate */
2964 case 6: /* Hit Writeback */
2965 if (!icache_warning)
2967 sim_warning("Instruction CACHE operation %d to be coded",(op >> 2));
2973 SignalException(ReservedInstruction,instruction);
2978 case 1: /* data cache */
2980 case 0: /* Index Writeback Invalidate */
2981 case 1: /* Index Load Tag */
2982 case 2: /* Index Store Tag */
2983 case 3: /* Create Dirty */
2984 case 4: /* Hit Invalidate */
2985 case 5: /* Hit Writeback Invalidate */
2986 case 6: /* Hit Writeback */
2987 if (!dcache_warning)
2989 sim_warning("Data CACHE operation %d to be coded",(op >> 2));
2995 SignalException(ReservedInstruction,instruction);
3000 default: /* unrecognised cache ID */
3001 SignalException(ReservedInstruction,instruction);
3008 /*-- FPU support routines ---------------------------------------------------*/
3010 #if defined(HASFPU) /* Only needed when building FPU aware simulators */
3013 #define SizeFGR() (GPRLEN)
3015 /* They depend on the CPU being simulated */
3016 #define SizeFGR() ((PROCESSOR_64BIT && ((SR & status_FR) == 1)) ? 64 : 32)
3019 /* Numbers are held in normalized form. The SINGLE and DOUBLE binary
3020 formats conform to ANSI/IEEE Std 754-1985. */
3021 /* SINGLE precision floating:
3022 * seeeeeeeefffffffffffffffffffffff
3024 * e = 8bits = exponent
3025 * f = 23bits = fraction
3027 /* SINGLE precision fixed:
3028 * siiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
3030 * i = 31bits = integer
3032 /* DOUBLE precision floating:
3033 * seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff
3035 * e = 11bits = exponent
3036 * f = 52bits = fraction
3038 /* DOUBLE precision fixed:
3039 * siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
3041 * i = 63bits = integer
3044 /* Extract sign-bit: */
3045 #define FP_S_s(v) (((v) & ((unsigned)1 << 31)) ? 1 : 0)
3046 #define FP_D_s(v) (((v) & ((uword64)1 << 63)) ? 1 : 0)
3047 /* Extract biased exponent: */
3048 #define FP_S_be(v) (((v) >> 23) & 0xFF)
3049 #define FP_D_be(v) (((v) >> 52) & 0x7FF)
3050 /* Extract unbiased Exponent: */
3051 #define FP_S_e(v) (FP_S_be(v) - 0x7F)
3052 #define FP_D_e(v) (FP_D_be(v) - 0x3FF)
3053 /* Extract complete fraction field: */
3054 #define FP_S_f(v) ((v) & ~((unsigned)0x1FF << 23))
3055 #define FP_D_f(v) ((v) & ~((uword64)0xFFF << 52))
3056 /* Extract numbered fraction bit: */
3057 #define FP_S_fb(b,v) (((v) & (1 << (23 - (b)))) ? 1 : 0)
3058 #define FP_D_fb(b,v) (((v) & (1 << (52 - (b)))) ? 1 : 0)
3060 /* Explicit QNaN values used when value required: */
3061 #define FPQNaN_SINGLE (0x7FBFFFFF)
3062 #define FPQNaN_WORD (0x7FFFFFFF)
3063 #define FPQNaN_DOUBLE (((uword64)0x7FF7FFFF << 32) | 0xFFFFFFFF)
3064 #define FPQNaN_LONG (((uword64)0x7FFFFFFF << 32) | 0xFFFFFFFF)
3066 /* Explicit Infinity values used when required: */
3067 #define FPINF_SINGLE (0x7F800000)
3068 #define FPINF_DOUBLE (((uword64)0x7FF00000 << 32) | 0x00000000)
3070 #if 1 /* def DEBUG */
3071 #define RMMODE(v) (((v) == FP_RM_NEAREST) ? "Round" : (((v) == FP_RM_TOZERO) ? "Trunc" : (((v) == FP_RM_TOPINF) ? "Ceil" : "Floor")))
3072 #define DOFMT(v) (((v) == fmt_single) ? "single" : (((v) == fmt_double) ? "double" : (((v) == fmt_word) ? "word" : (((v) == fmt_long) ? "long" : (((v) == fmt_unknown) ? "<unknown>" : (((v) == fmt_uninterpreted) ? "<uninterpreted>" : "<format error>"))))))
3083 /* Treat unused register values, as fixed-point 64bit values: */
3084 if ((fmt == fmt_uninterpreted) || (fmt == fmt_unknown))
3086 /* If request to read data as "uninterpreted", then use the current
3088 fmt = fpr_state[fpr];
3093 /* For values not yet accessed, set to the desired format: */
3094 if (fpr_state[fpr] == fmt_uninterpreted) {
3095 fpr_state[fpr] = fmt;
3097 printf("DBG: Register %d was fmt_uninterpreted. Now %s\n",fpr,DOFMT(fmt));
3100 if (fmt != fpr_state[fpr]) {
3101 sim_warning("FPR %d (format %s) being accessed with format %s - setting to unknown (PC = 0x%s)",fpr,DOFMT(fpr_state[fpr]),DOFMT(fmt),pr_addr(IPC));
3102 fpr_state[fpr] = fmt_unknown;
3105 if (fpr_state[fpr] == fmt_unknown) {
3106 /* Set QNaN value: */
3109 value = FPQNaN_SINGLE;
3113 value = FPQNaN_DOUBLE;
3117 value = FPQNaN_WORD;
3121 value = FPQNaN_LONG;
3128 } else if (SizeFGR() == 64) {
3132 value = (FGR[fpr] & 0xFFFFFFFF);
3135 case fmt_uninterpreted:
3149 value = (FGR[fpr] & 0xFFFFFFFF);
3152 case fmt_uninterpreted:
3155 if ((fpr & 1) == 0) { /* even registers only */
3156 value = ((((uword64)FGR[fpr+1]) << 32) | (FGR[fpr] & 0xFFFFFFFF));
3158 SignalException (ReservedInstruction, 0);
3169 SignalException(SimulatorFault,"Unrecognised FP format in ValueFPR()");
3172 printf("DBG: ValueFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d\n",fpr,DOFMT(fmt),pr_addr(value),pr_addr(IPC),SizeFGR());
3179 StoreFPR(fpr,fmt,value)
3187 printf("DBG: StoreFPR: fpr = %d, fmt = %s, value = 0x%s : PC = 0x%s : SizeFGR() = %d\n",fpr,DOFMT(fmt),pr_addr(value),pr_addr(IPC),SizeFGR());
3190 if (SizeFGR() == 64) {
3194 FGR[fpr] = (((uword64)0xDEADC0DE << 32) | (value & 0xFFFFFFFF));
3195 fpr_state[fpr] = fmt;
3198 case fmt_uninterpreted:
3202 fpr_state[fpr] = fmt;
3206 fpr_state[fpr] = fmt_unknown;
3214 FGR[fpr] = (value & 0xFFFFFFFF);
3215 fpr_state[fpr] = fmt;
3218 case fmt_uninterpreted:
3221 if ((fpr & 1) == 0) { /* even register number only */
3222 FGR[fpr+1] = (value >> 32);
3223 FGR[fpr] = (value & 0xFFFFFFFF);
3224 fpr_state[fpr + 1] = fmt;
3225 fpr_state[fpr] = fmt;
3227 fpr_state[fpr] = fmt_unknown;
3228 fpr_state[fpr + 1] = fmt_unknown;
3229 SignalException (ReservedInstruction, 0);
3234 fpr_state[fpr] = fmt_unknown;
3239 #if defined(WARN_RESULT)
3242 #endif /* WARN_RESULT */
3245 SignalException(SimulatorFault,"Unrecognised FP format in StoreFPR()");
3248 printf("DBG: StoreFPR: fpr[%d] = 0x%s (format %s)\n",fpr,pr_addr(FGR[fpr]),DOFMT(fmt));
3261 /* Check if (((E - bias) == (E_max + 1)) && (fraction != 0)). We
3262 know that the exponent field is biased... we we cheat and avoid
3263 removing the bias value. */
3266 boolean = ((FP_S_be(op) == 0xFF) && (FP_S_f(op) != 0));
3267 /* We could use "FP_S_fb(1,op)" to ascertain whether we are
3268 dealing with a SNaN or QNaN */
3271 boolean = ((FP_D_be(op) == 0x7FF) && (FP_D_f(op) != 0));
3272 /* We could use "FP_S_fb(1,op)" to ascertain whether we are
3273 dealing with a SNaN or QNaN */
3276 boolean = (op == FPQNaN_WORD);
3279 boolean = (op == FPQNaN_LONG);
3282 fprintf (stderr, "Bad switch\n");
3287 printf("DBG: NaN: returning %d for 0x%s (format = %s)\n",boolean,pr_addr(op),DOFMT(fmt));
3301 printf("DBG: Infinity: format %s 0x%s (PC = 0x%s)\n",DOFMT(fmt),pr_addr(op),pr_addr(IPC));
3304 /* Check if (((E - bias) == (E_max + 1)) && (fraction == 0)). We
3305 know that the exponent field is biased... we we cheat and avoid
3306 removing the bias value. */
3309 boolean = ((FP_S_be(op) == 0xFF) && (FP_S_f(op) == 0));
3312 boolean = ((FP_D_be(op) == 0x7FF) && (FP_D_f(op) == 0));
3315 printf("DBG: TODO: unrecognised format (%s) for Infinity check\n",DOFMT(fmt));
3320 printf("DBG: Infinity: returning %d for 0x%s (format = %s)\n",boolean,pr_addr(op),DOFMT(fmt));
3334 /* Argument checking already performed by the FPCOMPARE code */
3337 printf("DBG: Less: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3340 /* The format type should already have been checked: */
3344 unsigned int wop1 = (unsigned int)op1;
3345 unsigned int wop2 = (unsigned int)op2;
3346 boolean = (*(float *)&wop1 < *(float *)&wop2);
3350 boolean = (*(double *)&op1 < *(double *)&op2);
3353 fprintf (stderr, "Bad switch\n");
3358 printf("DBG: Less: returning %d (format = %s)\n",boolean,DOFMT(fmt));
3372 /* Argument checking already performed by the FPCOMPARE code */
3375 printf("DBG: Equal: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3378 /* The format type should already have been checked: */
3381 boolean = ((op1 & 0xFFFFFFFF) == (op2 & 0xFFFFFFFF));
3384 boolean = (op1 == op2);
3387 fprintf (stderr, "Bad switch\n");
3392 printf("DBG: Equal: returning %d (format = %s)\n",boolean,DOFMT(fmt));
3399 AbsoluteValue(op,fmt)
3406 printf("DBG: AbsoluteValue: %s: op = 0x%s\n",DOFMT(fmt),pr_addr(op));
3409 /* The format type should already have been checked: */
3413 unsigned int wop = (unsigned int)op;
3414 float tmp = ((float)fabs((double)*(float *)&wop));
3415 result = (uword64)*(unsigned int *)&tmp;
3420 double tmp = (fabs(*(double *)&op));
3421 result = *(uword64 *)&tmp;
3424 fprintf (stderr, "Bad switch\n");
3439 printf("DBG: Negate: %s: op = 0x%s\n",DOFMT(fmt),pr_addr(op));
3442 /* The format type should already have been checked: */
3446 unsigned int wop = (unsigned int)op;
3447 float tmp = ((float)0.0 - *(float *)&wop);
3448 result = (uword64)*(unsigned int *)&tmp;
3453 double tmp = ((double)0.0 - *(double *)&op);
3454 result = *(uword64 *)&tmp;
3458 fprintf (stderr, "Bad switch\n");
3474 printf("DBG: Add: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3477 /* The registers must specify FPRs valid for operands of type
3478 "fmt". If they are not valid, the result is undefined. */
3480 /* The format type should already have been checked: */
3484 unsigned int wop1 = (unsigned int)op1;
3485 unsigned int wop2 = (unsigned int)op2;
3486 float tmp = (*(float *)&wop1 + *(float *)&wop2);
3487 result = (uword64)*(unsigned int *)&tmp;
3492 double tmp = (*(double *)&op1 + *(double *)&op2);
3493 result = *(uword64 *)&tmp;
3497 fprintf (stderr, "Bad switch\n");
3502 printf("DBG: Add: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3517 printf("DBG: Sub: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3520 /* The registers must specify FPRs valid for operands of type
3521 "fmt". If they are not valid, the result is undefined. */
3523 /* The format type should already have been checked: */
3527 unsigned int wop1 = (unsigned int)op1;
3528 unsigned int wop2 = (unsigned int)op2;
3529 float tmp = (*(float *)&wop1 - *(float *)&wop2);
3530 result = (uword64)*(unsigned int *)&tmp;
3535 double tmp = (*(double *)&op1 - *(double *)&op2);
3536 result = *(uword64 *)&tmp;
3540 fprintf (stderr, "Bad switch\n");
3545 printf("DBG: Sub: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3552 Multiply(op1,op2,fmt)
3560 printf("DBG: Multiply: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3563 /* The registers must specify FPRs valid for operands of type
3564 "fmt". If they are not valid, the result is undefined. */
3566 /* The format type should already have been checked: */
3570 unsigned int wop1 = (unsigned int)op1;
3571 unsigned int wop2 = (unsigned int)op2;
3572 float tmp = (*(float *)&wop1 * *(float *)&wop2);
3573 result = (uword64)*(unsigned int *)&tmp;
3578 double tmp = (*(double *)&op1 * *(double *)&op2);
3579 result = *(uword64 *)&tmp;
3583 fprintf (stderr, "Bad switch\n");
3588 printf("DBG: Multiply: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3603 printf("DBG: Divide: %s: op1 = 0x%s : op2 = 0x%s\n",DOFMT(fmt),pr_addr(op1),pr_addr(op2));
3606 /* The registers must specify FPRs valid for operands of type
3607 "fmt". If they are not valid, the result is undefined. */
3609 /* The format type should already have been checked: */
3613 unsigned int wop1 = (unsigned int)op1;
3614 unsigned int wop2 = (unsigned int)op2;
3615 float tmp = (*(float *)&wop1 / *(float *)&wop2);
3616 result = (uword64)*(unsigned int *)&tmp;
3621 double tmp = (*(double *)&op1 / *(double *)&op2);
3622 result = *(uword64 *)&tmp;
3626 fprintf (stderr, "Bad switch\n");
3631 printf("DBG: Divide: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3637 static uword64 UNUSED
3645 printf("DBG: Recip: %s: op = 0x%s\n",DOFMT(fmt),pr_addr(op));
3648 /* The registers must specify FPRs valid for operands of type
3649 "fmt". If they are not valid, the result is undefined. */
3651 /* The format type should already have been checked: */
3655 unsigned int wop = (unsigned int)op;
3656 float tmp = ((float)1.0 / *(float *)&wop);
3657 result = (uword64)*(unsigned int *)&tmp;
3662 double tmp = ((double)1.0 / *(double *)&op);
3663 result = *(uword64 *)&tmp;
3667 fprintf (stderr, "Bad switch\n");
3672 printf("DBG: Recip: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3686 printf("DBG: SquareRoot: %s: op = 0x%s\n",DOFMT(fmt),pr_addr(op));
3689 /* The registers must specify FPRs valid for operands of type
3690 "fmt". If they are not valid, the result is undefined. */
3692 /* The format type should already have been checked: */
3696 unsigned int wop = (unsigned int)op;
3698 float tmp = ((float)sqrt((double)*(float *)&wop));
3699 result = (uword64)*(unsigned int *)&tmp;
3701 /* TODO: Provide square-root */
3702 result = (uword64)0;
3709 double tmp = (sqrt(*(double *)&op));
3710 result = *(uword64 *)&tmp;
3712 /* TODO: Provide square-root */
3713 result = (uword64)0;
3718 fprintf (stderr, "Bad switch\n");
3723 printf("DBG: SquareRoot: returning 0x%s (format = %s)\n",pr_addr(result),DOFMT(fmt));
3730 Convert(rm,op,from,to)
3739 printf("DBG: Convert: mode %s : op 0x%s : from %s : to %s : (PC = 0x%s)\n",RMMODE(rm),pr_addr(op),DOFMT(from),DOFMT(to),pr_addr(IPC));
3742 /* The value "op" is converted to the destination format, rounding
3743 using mode "rm". When the destination is a fixed-point format,
3744 then a source value of Infinity, NaN or one which would round to
3745 an integer outside the fixed point range then an IEEE Invalid
3746 Operation condition is raised. */
3753 tmp = (float)(*(double *)&op);
3757 tmp = (float)((int)(op & 0xFFFFFFFF));
3761 tmp = (float)((word64)op);
3764 fprintf (stderr, "Bad switch\n");
3769 /* FIXME: This code is incorrect. The rounding mode does not
3770 round to integral values; it rounds to the nearest
3771 representable value in the format. */
3775 /* Round result to nearest representable value. When two
3776 representable values are equally near, round to the value
3777 that has a least significant bit of zero (i.e. is even). */
3779 tmp = (float)anint((double)tmp);
3781 /* TODO: Provide round-to-nearest */
3786 /* Round result to the value closest to, and not greater in
3787 magnitude than, the result. */
3789 tmp = (float)aint((double)tmp);
3791 /* TODO: Provide round-to-zero */
3796 /* Round result to the value closest to, and not less than,
3798 tmp = (float)ceil((double)tmp);
3802 /* Round result to the value closest to, and not greater than,
3804 tmp = (float)floor((double)tmp);
3809 result = (uword64)*(unsigned int *)&tmp;
3821 unsigned int wop = (unsigned int)op;
3822 tmp = (double)(*(float *)&wop);
3827 xxx = SIGNEXTEND((op & 0xFFFFFFFF),32);
3832 tmp = (double)((word64)op);
3836 fprintf (stderr, "Bad switch\n");
3841 /* FIXME: This code is incorrect. The rounding mode does not
3842 round to integral values; it rounds to the nearest
3843 representable value in the format. */
3848 tmp = anint(*(double *)&tmp);
3850 /* TODO: Provide round-to-nearest */
3856 tmp = aint(*(double *)&tmp);
3858 /* TODO: Provide round-to-zero */
3863 tmp = ceil(*(double *)&tmp);
3867 tmp = floor(*(double *)&tmp);
3872 result = *(uword64 *)&tmp;
3878 if (Infinity(op,from) || NaN(op,from) || (1 == 0/*TODO: check range */)) {
3879 printf("DBG: TODO: update FCSR\n");
3880 SignalException(FPE);
3882 if (to == fmt_word) {
3887 unsigned int wop = (unsigned int)op;
3888 tmp = (int)*((float *)&wop);
3892 tmp = (int)*((double *)&op);
3894 printf("DBG: from double %.30f (0x%s) to word: 0x%08X\n",*((double *)&op),pr_addr(op),tmp);
3898 fprintf (stderr, "Bad switch\n");
3901 result = (uword64)tmp;
3902 } else { /* fmt_long */
3907 unsigned int wop = (unsigned int)op;
3908 tmp = (word64)*((float *)&wop);
3912 tmp = (word64)*((double *)&op);
3915 fprintf (stderr, "Bad switch\n");
3918 result = (uword64)tmp;
3923 fprintf (stderr, "Bad switch\n");
3928 printf("DBG: Convert: returning 0x%s (to format = %s)\n",pr_addr(result),DOFMT(to));
3935 /*-- co-processor support routines ------------------------------------------*/
3938 CoProcPresent(coproc_number)
3939 unsigned int coproc_number;
3941 /* Return TRUE if simulator provides a model for the given co-processor number */
3946 COP_LW(coproc_num,coproc_reg,memword)
3947 int coproc_num, coproc_reg;
3948 unsigned int memword;
3950 switch (coproc_num) {
3954 printf("DBG: COP_LW: memword = 0x%08X (uword64)memword = 0x%s\n",memword,pr_addr(memword));
3956 StoreFPR(coproc_reg,fmt_word,(uword64)memword);
3957 fpr_state[coproc_reg] = fmt_uninterpreted;
3962 #if 0 /* this should be controlled by a configuration option */
3963 callback->printf_filtered(callback,"COP_LW(%d,%d,0x%08X) at IPC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,memword,pr_addr(IPC));
3972 COP_LD(coproc_num,coproc_reg,memword)
3973 int coproc_num, coproc_reg;
3976 switch (coproc_num) {
3979 StoreFPR(coproc_reg,fmt_uninterpreted,memword);
3984 #if 0 /* this message should be controlled by a configuration option */
3985 callback->printf_filtered(callback,"COP_LD(%d,%d,0x%s) at IPC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(memword),pr_addr(IPC));
3994 COP_SW(coproc_num,coproc_reg)
3995 int coproc_num, coproc_reg;
3997 unsigned int value = 0;
4000 switch (coproc_num) {
4004 hold = fpr_state[coproc_reg];
4005 fpr_state[coproc_reg] = fmt_word;
4006 value = (unsigned int)ValueFPR(coproc_reg,fmt_uninterpreted);
4007 fpr_state[coproc_reg] = hold;
4010 value = (unsigned int)ValueFPR(coproc_reg,fpr_state[coproc_reg]);
4013 printf("DBG: COP_SW: reg in format %s (will be accessing as single)\n",DOFMT(fpr_state[coproc_reg]));
4015 value = (unsigned int)ValueFPR(coproc_reg,fmt_single);
4022 #if 0 /* should be controlled by configuration option */
4023 callback->printf_filtered(callback,"COP_SW(%d,%d) at IPC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(IPC));
4032 COP_SD(coproc_num,coproc_reg)
4033 int coproc_num, coproc_reg;
4036 switch (coproc_num) {
4040 value = ValueFPR(coproc_reg,fmt_uninterpreted);
4043 value = ValueFPR(coproc_reg,fpr_state[coproc_reg]);
4046 printf("DBG: COP_SD: reg in format %s (will be accessing as double)\n",DOFMT(fpr_state[coproc_reg]));
4048 value = ValueFPR(coproc_reg,fmt_double);
4055 #if 0 /* should be controlled by configuration option */
4056 callback->printf_filtered(callback,"COP_SD(%d,%d) at IPC = 0x%s : TODO (architecture specific)\n",coproc_num,coproc_reg,pr_addr(IPC));
4065 decode_coproc(instruction)
4066 unsigned int instruction;
4068 int coprocnum = ((instruction >> 26) & 3);
4072 case 0: /* standard CPU control and cache registers */
4074 int code = ((instruction >> 21) & 0x1F);
4075 /* R4000 Users Manual (second edition) lists the following CP0
4077 DMFC0 Doubleword Move From CP0 (VR4100 = 01000000001tttttddddd00000000000)
4078 DMTC0 Doubleword Move To CP0 (VR4100 = 01000000101tttttddddd00000000000)
4079 MFC0 word Move From CP0 (VR4100 = 01000000000tttttddddd00000000000)
4080 MTC0 word Move To CP0 (VR4100 = 01000000100tttttddddd00000000000)
4081 TLBR Read Indexed TLB Entry (VR4100 = 01000010000000000000000000000001)
4082 TLBWI Write Indexed TLB Entry (VR4100 = 01000010000000000000000000000010)
4083 TLBWR Write Random TLB Entry (VR4100 = 01000010000000000000000000000110)
4084 TLBP Probe TLB for Matching Entry (VR4100 = 01000010000000000000000000001000)
4085 CACHE Cache operation (VR4100 = 101111bbbbbpppppiiiiiiiiiiiiiiii)
4086 ERET Exception return (VR4100 = 01000010000000000000000000011000)
4088 if (((code == 0x00) || (code == 0x04)) && ((instruction & 0x7FF) == 0))
4090 int rt = ((instruction >> 16) & 0x1F);
4091 int rd = ((instruction >> 11) & 0x1F);
4093 switch (rd) /* NOTEs: Standard CP0 registers */
4095 /* 0 = Index R4000 VR4100 VR4300 */
4096 /* 1 = Random R4000 VR4100 VR4300 */
4097 /* 2 = EntryLo0 R4000 VR4100 VR4300 */
4098 /* 3 = EntryLo1 R4000 VR4100 VR4300 */
4099 /* 4 = Context R4000 VR4100 VR4300 */
4100 /* 5 = PageMask R4000 VR4100 VR4300 */
4101 /* 6 = Wired R4000 VR4100 VR4300 */
4102 /* 8 = BadVAddr R4000 VR4100 VR4300 */
4103 /* 9 = Count R4000 VR4100 VR4300 */
4104 /* 10 = EntryHi R4000 VR4100 VR4300 */
4105 /* 11 = Compare R4000 VR4100 VR4300 */
4106 /* 12 = SR R4000 VR4100 VR4300 */
4113 /* 13 = Cause R4000 VR4100 VR4300 */
4114 /* 14 = EPC R4000 VR4100 VR4300 */
4115 /* 15 = PRId R4000 VR4100 VR4300 */
4116 /* 16 = Config R4000 VR4100 VR4300 */
4117 /* 17 = LLAddr R4000 VR4100 VR4300 */
4118 /* 18 = WatchLo R4000 VR4100 VR4300 */
4119 /* 19 = WatchHi R4000 VR4100 VR4300 */
4120 /* 20 = XContext R4000 VR4100 VR4300 */
4121 /* 26 = PErr or ECC R4000 VR4100 VR4300 */
4122 /* 27 = CacheErr R4000 VR4100 */
4123 /* 28 = TagLo R4000 VR4100 VR4300 */
4124 /* 29 = TagHi R4000 VR4100 VR4300 */
4125 /* 30 = ErrorEPC R4000 VR4100 VR4300 */
4126 GPR[rt] = 0xDEADC0DE; /* CPR[0,rd] */
4127 /* CPR[0,rd] = GPR[rt]; */
4130 callback->printf_filtered(callback,"Warning: MFC0 %d,%d not handled yet (architecture specific)\n",rt,rd);
4132 callback->printf_filtered(callback,"Warning: MTC0 %d,%d not handled yet (architecture specific)\n",rt,rd);
4135 else if (code == 0x10 && (instruction & 0x3f) == 0x18)
4138 if (SR & status_ERL)
4140 /* Oops, not yet available */
4141 callback->printf_filtered(callback,"Warning: ERET when SR[ERL] set not handled yet");
4152 sim_warning("Unrecognised COP0 instruction 0x%08X at IPC = 0x%s : No handler present",instruction,pr_addr(IPC));
4153 /* TODO: When executing an ERET or RFE instruction we should
4154 clear LLBIT, to ensure that any out-standing atomic
4155 read/modify/write sequence fails. */
4159 case 2: /* undefined co-processor */
4160 sim_warning("COP2 instruction 0x%08X at IPC = 0x%s : No handler present",instruction,pr_addr(IPC));
4163 case 1: /* should not occur (FPU co-processor) */
4164 case 3: /* should not occur (FPU co-processor) */
4165 SignalException(ReservedInstruction,instruction);
4172 /*-- instruction simulation -------------------------------------------------*/
4175 sim_engine_run (sd, next_cpu_nr, siggnal)
4177 int next_cpu_nr; /* ignore */
4178 int siggnal; /* ignore */
4180 #if !defined(FASTSIM)
4181 unsigned int pipeline_count = 1;
4185 if (STATE_MEMORY (sd) == NULL) {
4186 printf("DBG: simulate() entered with no memory\n");
4191 #if 0 /* Disabled to check that everything works OK */
4192 /* The VR4300 seems to sign-extend the PC on its first
4193 access. However, this may just be because it is currently
4194 configured in 32bit mode. However... */
4195 PC = SIGNEXTEND(PC,32);
4198 /* main controlling loop */
4200 /* Fetch the next instruction from the simulator memory: */
4201 uword64 vaddr = (uword64)PC;
4204 unsigned int instruction; /* uword64? what's this used for? FIXME! */
4205 int dsstate = (state & simDELAYSLOT);
4209 printf("DBG: state = 0x%08X :",state);
4211 if (state & simSTOP) printf(" simSTOP");
4212 if (state & simSTEP) printf(" simSTEP");
4214 if (state & simHALTEX) printf(" simHALTEX");
4215 if (state & simHALTIN) printf(" simHALTIN");
4217 if (state & simBE) printf(" simBE");
4225 callback->printf_filtered(callback,"DBG: DSPC = 0x%s\n",pr_addr(DSPC));
4228 if (AddressTranslation(PC,isINSTRUCTION,isLOAD,&paddr,&cca,isTARGET,isREAL)) {
4229 if ((vaddr & 1) == 0) {
4230 /* Copy the action of the LW instruction */
4231 unsigned int reverse = (ReverseEndian ? (LOADDRMASK >> 2) : 0);
4232 unsigned int bigend = (BigEndianCPU ? (LOADDRMASK >> 2) : 0);
4235 paddr = ((paddr & ~LOADDRMASK) | ((paddr & LOADDRMASK) ^ (reverse << 2)));
4236 LoadMemory(&value,NULL,cca,AccessLength_WORD,paddr,vaddr,isINSTRUCTION,isREAL);
4237 byte = ((vaddr & LOADDRMASK) ^ (bigend << 2));
4238 instruction = ((value >> (8 * byte)) & 0xFFFFFFFF);
4240 /* Copy the action of the LH instruction */
4241 unsigned int reverse = (ReverseEndian ? (LOADDRMASK >> 1) : 0);
4242 unsigned int bigend = (BigEndianCPU ? (LOADDRMASK >> 1) : 0);
4245 paddr = (((paddr & ~ (uword64) 1) & ~LOADDRMASK)
4246 | (((paddr & ~ (uword64) 1) & LOADDRMASK) ^ (reverse << 1)));
4247 LoadMemory(&value,NULL,cca, AccessLength_HALFWORD,
4248 paddr & ~ (uword64) 1,
4249 vaddr, isINSTRUCTION, isREAL);
4250 byte = (((vaddr &~ (uword64) 1) & LOADDRMASK) ^ (bigend << 1));
4251 instruction = ((value >> (8 * byte)) & 0xFFFF);
4254 fprintf(stderr,"Cannot translate address for PC = 0x%s failed\n",pr_addr(PC));
4259 callback->printf_filtered(callback,"DBG: fetched 0x%08X from PC = 0x%s\n",instruction,pr_addr(PC));
4262 #if !defined(FASTSIM) || defined(PROFILE)
4263 instruction_fetches++;
4264 /* Since we increment above, the value should only ever be zero if
4265 we have just overflowed: */
4266 if (instruction_fetches == 0)
4267 instruction_fetch_overflow++;
4268 #if defined(PROFILE)
4269 if ((state & simPROFILE) && ((instruction_fetches % profile_frequency) == 0) && profile_hist) {
4270 unsigned n = ((unsigned int)(PC - profile_minpc) >> (profile_shift + 2));
4271 if (n < profile_nsamples) {
4272 /* NOTE: The counts for the profiling bins are only 16bits wide */
4273 if (profile_hist[n] != USHRT_MAX)
4274 (profile_hist[n])++;
4277 #endif /* PROFILE */
4278 #endif /* !FASTSIM && PROFILE */
4280 IPC = PC; /* copy PC for this instruction */
4281 /* This is required by exception processing, to ensure that we can
4282 cope with exceptions in the delay slots of branches that may
4283 already have changed the PC. */
4284 if ((vaddr & 1) == 0)
4285 PC += 4; /* increment ready for the next fetch */
4288 /* NOTE: If we perform a delay slot change to the PC, this
4289 increment is not requuired. However, it would make the
4290 simulator more complicated to try and avoid this small hit. */
4292 /* Currently this code provides a simple model. For more
4293 complicated models we could perform exception status checks at
4294 this point, and set the simSTOP state as required. This could
4295 also include processing any hardware interrupts raised by any
4296 I/O model attached to the simulator context.
4298 Support for "asynchronous" I/O events within the simulated world
4299 could be providing by managing a counter, and calling a I/O
4300 specific handler when a particular threshold is reached. On most
4301 architectures a decrement and check for zero operation is
4302 usually quicker than an increment and compare. However, the
4303 process of managing a known value decrement to zero, is higher
4304 than the cost of using an explicit value UINT_MAX into the
4305 future. Which system is used will depend on how complicated the
4306 I/O model is, and how much it is likely to affect the simulator
4309 If events need to be scheduled further in the future than
4310 UINT_MAX event ticks, then the I/O model should just provide its
4311 own counter, triggered from the event system. */
4313 /* MIPS pipeline ticks. To allow for future support where the
4314 pipeline hit of individual instructions is known, this control
4315 loop manages a "pipeline_count" variable. It is initialised to
4316 1 (one), and will only be changed by the simulator engine when
4317 executing an instruction. If the engine does not have access to
4318 pipeline cycle count information then all instructions will be
4319 treated as using a single cycle. NOTE: A standard system is not
4320 provided by the default simulator because different MIPS
4321 architectures have different cycle counts for the same
4324 [NOTE: pipeline_count has been replaced the event queue] */
4327 /* Set previous flag, depending on current: */
4328 if (state & simPCOC0)
4332 /* and update the current value: */
4339 /* NOTE: For multi-context simulation environments the "instruction"
4340 variable should be local to this routine. */
4342 /* Shorthand accesses for engine. Note: If we wanted to use global
4343 variables (and a single-threaded simulator engine), then we can
4344 create the actual variables with these names. */
4346 if (!(state & simSKIPNEXT)) {
4347 /* Include the simulator engine */
4349 #if ((GPRLEN == 64) && !PROCESSOR_64BIT) || ((GPRLEN == 32) && PROCESSOR_64BIT)
4350 #error "Mismatch between run-time simulator code and simulation engine"
4353 #if defined(WARN_LOHI)
4354 /* Decrement the HI/LO validity ticks */
4363 #endif /* WARN_LOHI */
4365 #if defined(WARN_ZERO)
4366 /* For certain MIPS architectures, GPR[0] is hardwired to zero. We
4367 should check for it being changed. It is better doing it here,
4368 than within the simulator, since it will help keep the simulator
4371 sim_warning("The ZERO register has been updated with 0x%s (PC = 0x%s) (reset back to zero)",pr_addr(ZERO),pr_addr(IPC));
4372 ZERO = 0; /* reset back to zero before next instruction */
4374 #endif /* WARN_ZERO */
4375 } else /* simSKIPNEXT check */
4376 state &= ~simSKIPNEXT;
4378 /* If the delay slot was active before the instruction is
4379 executed, then update the PC to its new value: */
4382 printf("DBG: dsstate set before instruction execution - updating PC to 0x%s\n",pr_addr(DSPC));
4385 state &= ~(simDELAYSLOT | simJALDELAYSLOT);
4388 if (MIPSISA < 4) { /* The following is only required on pre MIPS IV processors: */
4389 /* Deal with pending register updates: */
4391 printf("DBG: EMPTY BEFORE pending_in = %d, pending_out = %d, pending_total = %d\n",pending_in,pending_out,pending_total);
4393 if (pending_out != pending_in) {
4395 int index = pending_out;
4396 int total = pending_total;
4397 if (pending_total == 0) {
4398 fprintf(stderr,"FATAL: Mis-match on pending update pointers\n");
4401 for (loop = 0; (loop < total); loop++) {
4403 printf("DBG: BEFORE index = %d, loop = %d\n",index,loop);
4405 if (pending_slot_reg[index] != (LAST_EMBED_REGNUM + 1)) {
4407 printf("pending_slot_count[%d] = %d\n",index,pending_slot_count[index]);
4409 if (--(pending_slot_count[index]) == 0) {
4411 printf("pending_slot_reg[%d] = %d\n",index,pending_slot_reg[index]);
4412 printf("pending_slot_value[%d] = 0x%s\n",index,pr_addr(pending_slot_value[index]));
4414 if (pending_slot_reg[index] == COCIDX) {
4415 SETFCC(0,((FCR31 & (1 << 23)) ? 1 : 0));
4417 registers[pending_slot_reg[index]] = pending_slot_value[index];
4419 /* The only time we have PENDING updates to FPU
4420 registers, is when performing binary transfers. This
4421 means we should update the register type field. */
4422 if ((pending_slot_reg[index] >= FGRIDX) && (pending_slot_reg[index] < (FGRIDX + 32)))
4423 fpr_state[pending_slot_reg[index] - FGRIDX] = fmt_uninterpreted;
4427 printf("registers[%d] = 0x%s\n",pending_slot_reg[index],pr_addr(registers[pending_slot_reg[index]]));
4429 pending_slot_reg[index] = (LAST_EMBED_REGNUM + 1);
4431 if (pending_out == PSLOTS)
4437 printf("DBG: AFTER index = %d, loop = %d\n",index,loop);
4440 if (index == PSLOTS)
4445 printf("DBG: EMPTY AFTER pending_in = %d, pending_out = %d, pending_total = %d\n",pending_in,pending_out,pending_total);
4449 #if !defined(FASTSIM)
4450 if (sim_events_tickn (sd, pipeline_count))
4452 /* cpu->cia = cia; */
4453 sim_events_process (sd);
4456 if (sim_events_tick (sd))
4458 /* cpu->cia = cia; */
4459 sim_events_process (sd);
4461 #endif /* FASTSIM */
4465 /* This code copied from gdb's utils.c. Would like to share this code,
4466 but don't know of a common place where both could get to it. */
4468 /* Temporary storage using circular buffer */
4474 static char buf[NUMCELLS][CELLSIZE];
4476 if (++cell>=NUMCELLS) cell=0;
4480 /* Print routines to handle variable size regs, etc */
4482 /* Eliminate warning from compiler on 32-bit systems */
4483 static int thirty_two = 32;
4489 char *paddr_str=get_cell();
4490 switch (sizeof(addr))
4493 sprintf(paddr_str,"%08lx%08lx",
4494 (unsigned long)(addr>>thirty_two),(unsigned long)(addr&0xffffffff));
4497 sprintf(paddr_str,"%08lx",(unsigned long)addr);
4500 sprintf(paddr_str,"%04x",(unsigned short)(addr&0xffff));
4503 sprintf(paddr_str,"%x",addr);
4512 char *paddr_str=get_cell();
4513 sprintf(paddr_str,"%08lx%08lx",
4514 (unsigned long)(addr>>thirty_two),(unsigned long)(addr&0xffffffff));
4519 /*---------------------------------------------------------------------------*/
4520 /*> EOF interp.c <*/