1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
/* Copyright (C) 1995-2022 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "ansidecl.h"
#include "sim/callback.h"
#include "sim/sim.h"
#include <sim-config.h>
#include <stdint.h>
#if HOST_BYTE_ORDER == BIG_ENDIAN
#define HOST_BIG_ENDIAN
#define EBT 0
#else
#define HOST_LITTLE_ENDIAN
#define EBT 3
#endif
#define I_ACC_EXC 1
/* Maximum events in event queue */
#define EVENT_MAX 256
/* Maximum # of floating point queue */
#define FPUQN 1
/* Maximum # of breakpoints */
#define BPT_MAX 256
struct histype {
unsigned addr;
unsigned time;
};
/* type definitions */
typedef float float32; /* 32-bit float */
typedef double float64; /* 64-bit float */
struct pstate {
float64 fd[16]; /* FPU registers */
#ifdef HOST_LITTLE_ENDIAN
float32 fs[32];
float32 *fdp;
#else
float32 *fs;
#endif
int32_t *fsi;
uint32_t fsr;
int32_t fpstate;
uint32_t fpq[FPUQN * 2];
uint32_t fpqn;
uint32_t ftime;
uint32_t flrd;
uint32_t frd;
uint32_t frs1;
uint32_t frs2;
uint32_t fpu_pres; /* FPU present (0 = No, 1 = Yes) */
uint32_t psr; /* IU registers */
uint32_t tbr;
uint32_t wim;
uint32_t g[8];
uint32_t r[128];
uint32_t y;
uint32_t asr17; /* Single vector trapping */
uint32_t pc, npc;
uint32_t trap; /* Current trap type */
uint32_t annul; /* Instruction annul */
uint32_t data; /* Loaded data */
uint32_t inst; /* Current instruction */
uint32_t asi; /* Current ASI */
uint32_t err_mode; /* IU error mode */
uint32_t breakpoint;
uint32_t bptnum;
uint32_t bphit;
uint32_t bpts[BPT_MAX]; /* Breakpoints */
uint32_t ltime; /* Load interlock time */
uint32_t hold; /* IU hold cycles in current inst */
uint32_t fhold; /* FPU hold cycles in current inst */
uint32_t icnt; /* Instruction cycles in curr inst */
uint32_t histlen; /* Trace history management */
uint32_t histind;
struct histype *histbuf;
float32 freq; /* Simulated processor frequency */
double tottime;
uint64_t ninst;
uint64_t fholdt;
uint64_t holdt;
uint64_t icntt;
uint64_t finst;
uint64_t simstart;
double starttime;
uint64_t tlimit; /* Simulation time limit */
uint64_t pwdtime; /* Cycles in power-down mode */
uint64_t nstore; /* Number of load instructions */
uint64_t nload; /* Number of store instructions */
uint64_t nannul; /* Number of annuled instructions */
uint64_t nbranch; /* Number of branch instructions */
uint32_t ildreg; /* Destination of last load instruction */
uint64_t ildtime; /* Last time point for load dependency */
int rett_err; /* IU in jmpl/restore error state (Rev.0) */
int jmpltime;
};
struct evcell {
void (*cfunc) ();
int32_t arg;
uint64_t time;
struct evcell *nxt;
};
struct estate {
struct evcell eq;
struct evcell *freeq;
uint64_t simtime;
};
struct irqcell {
void (*callback) ();
int32_t arg;
};
#define OK 0
#define TIME_OUT 1
#define BPT_HIT 2
#define ERROR 3
#define CTRL_C 4
/* Prototypes */
/* erc32.c */
extern void init_sim (void);
extern void reset (void);
extern void error_mode (uint32_t pc);
extern void sim_halt (void);
extern void exit_sim (void);
extern void init_stdio (void);
extern void restore_stdio (void);
extern int memory_iread (uint32_t addr, uint32_t *data, uint32_t *ws);
extern int memory_read (int32_t asi, uint32_t addr, void *data,
int32_t sz, int32_t *ws);
extern int memory_write (int32_t asi, uint32_t addr, uint32_t *data,
int32_t sz, int32_t *ws);
extern int sis_memory_write (uint32_t addr,
const void *data, uint32_t length);
extern int sis_memory_read (uint32_t addr, void *data,
uint32_t length);
extern void boot_init (void);
/* func.c */
extern struct pstate sregs;
extern void set_regi (struct pstate *sregs, int32_t reg,
uint32_t rval);
extern void get_regi (struct pstate *sregs, int32_t reg, unsigned char *buf);
extern int exec_cmd (struct pstate *sregs, const char *cmd);
extern void reset_stat (struct pstate *sregs);
extern void show_stat (struct pstate *sregs);
extern void init_bpt (struct pstate *sregs);
extern void init_signals (void);
struct disassemble_info;
extern void dis_mem (uint32_t addr, uint32_t len,
struct disassemble_info *info);
extern void event (void (*cfunc) (), int32_t arg, uint64_t delta);
extern void set_int (int32_t level, void (*callback) (), int32_t arg);
extern void advance_time (struct pstate *sregs);
extern uint32_t now (void);
extern int wait_for_irq (void);
extern int check_bpt (struct pstate *sregs);
extern void reset_all (void);
extern void sys_reset (void);
extern void sys_halt (void);
extern int bfd_load (const char *fname);
extern double get_time (void);
/* exec.c */
extern int dispatch_instruction (struct pstate *sregs);
extern int execute_trap (struct pstate *sregs);
extern int check_interrupts (struct pstate *sregs);
extern void init_regs (struct pstate *sregs);
/* interf.c */
extern int run_sim (struct pstate *sregs,
uint64_t icount, int dis);
/* float.c */
extern int get_accex (void);
extern void clear_accex (void);
extern void set_fsr (uint32_t fsr);
/* help.c */
extern void usage (void);
extern void gen_help (void);
|