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