aboutsummaryrefslogtreecommitdiff
path: root/sim/erc32/sis.h
blob: 33f16c77ca47b26bf2ef901f4c07fc263fcf309f (plain)
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);