10 #define MULT_LATENCY 0
14 extern int enable_disass
;
15 extern int enable_disass_user
;
16 extern int enable_verb_elf
;
17 extern int enable_forwarding
;
18 extern int enable_fastbranch
;
19 extern int enable_testcases
;
20 extern int enable_regwrites
;
21 extern int enable_firmware_mode
;
22 extern int enable_cosimulation
;
24 extern int endian_is_big
;
26 extern struct timeval stat_start_time
, stat_stop_time
;
28 /* The hazards here count def-use cases with no intervening cycles,
29 not all hazards today */
30 uint64_t stat_gen_load_hazard
;
31 uint64_t stat_load_use_hazard_rs
;
32 uint64_t stat_load_use_hazard_rt
;
33 uint64_t stat_load32_use_hazard
;
34 uint64_t stat_shift_use_hazard
;
36 uint64_t stat_nop_delay_slots
;
37 uint64_t stat_nop_useless
;
40 The simulation space address to physical address translation is a
41 key operation, so it has been optimized slightly.
43 First off, we can't implement a 1-1 mapping as the virtual address
44 space on the host is smaller than the target (both are 32-bit), so
45 we have to live with some sort of segmentation. An obvious first
46 approach is to divide the simulation space into 2^S segments with a
47 mapping from segments to physical segments:
51 offset(x) = x & ((1 << N) - 1)
52 Inv: for all x, (segment(x) << N) + offset(x) == x
54 addr2phys(x) = memory_segment[segment(x)] + offset(x)
56 As we can't map all segments, we represent the "holes" as areas
57 laying outside the segment space:
59 addr_mapped(x) = offset(x) < memory_segment_size[segment(x)]
63 Note, the offset(x) can also be written
65 offset(x) = x - (segment(x) << N)
69 addr2phys(x) = memory_segment[segment(x)] + x - (segment(x) << N)
71 or by arranging for memory_segment'[s] = memory_segment[s] - (s << N)
73 addr2phys(x) = memory_segment'[segment(x)] + x
75 BUT we don't do it like that below, for clairity.
79 #define OFFSETBITS (32 - SEGMENTBITS)
80 #define NSEGMENT (1 << SEGMENTBITS)
82 extern void *memory_segment
[NSEGMENT
];
83 extern unsigned memory_segment_size
[NSEGMENT
];
85 #define segment(x) (((unsigned)(x)) >> OFFSETBITS)
86 #define seg2virt(s) (((unsigned)(s)) << OFFSETBITS)
87 #define offset(x) (((unsigned)(x)) & ((1 << OFFSETBITS) - 1))
88 #define addr2phys(x) (memory_segment[segment(x)] + offset(x))
89 #define addr_mapped(x) (offset(x) < memory_segment_size[segment(x)])
91 #define EXT8(b) ((int8_t) (u_int8_t) (b))
92 #define EXT16(h)((int16_t)(u_int16_t)(h))
93 #define LD8(a) load(a,1,0)
94 #define LD16(a) load(a,2,0)
95 #define LD32(a) load(a,4,0)
97 #define ST8(a,v) store(a,v,1)
98 #define ST16(a,v) store(a,v,2)
99 #define ST32(a,v) store(a,v,4)
101 #define fatal(msg...) ({printf(msg); exit(1);})
103 extern unsigned program_entry
;
104 extern unsigned text_start
, text_size
;
105 extern unsigned mif_size
;
107 long long unsigned n_cycle
, n_stall
;
108 long long unsigned n_issue
;
109 long long unsigned n_call
;
110 long long unsigned n_icache_hits
, n_icache_misses
;
112 extern int rs232in_fd
;
113 extern int rs232out_fd
;
118 uint32_t framebuffer_start
, framebuffer_size
;
119 unsigned framebuffer_generation
;
121 // Cache parameters in words log2
122 uint32_t icache_way_lines_log2
, icache_words_in_line_log2
;
123 uint32_t dcache_way_lines_log2
, dcache_words_in_line_log2
;
125 void exception(char *kind
);
126 void loadsection(FILE *f
, unsigned f_offset
, unsigned f_len
, unsigned m_addr
, unsigned m_len
);
127 void readelf(char *name
);
128 void initialize_memory(void);
129 void ensure_mapped_memory_range(unsigned addr
, unsigned len
);
130 void dis_load_store(char *buf
, char *name
, inst_t i
);
131 unsigned load(unsigned a
, int c
, int fetch
);
132 void store(unsigned a
, unsigned v
, int c
);
133 void disass(unsigned pc
, inst_t i
);
135 void init_reg_use_map(void);
136 void run_simple(MIPS_state_t
*s
);
137 void dump(FILE *output
, char kind
, uint32_t start
, uint32_t size
);
138 void dump_tinymon(void);
142 // c-style-variables-are-local-p: t
143 // c-file-style: "linux"