/*
 * This file is part of SIS.
 * 
 * ERC32SIM, SPARC instruction simulator. Copyright (C) 1995 Jiri Gaisler,
 * European Space Agency
 * 
 * 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 "config.h"
#include "ansidecl.h"
#include "gdb/callback.h"
#include "gdb/remote-sim.h"

#include "end.h"

#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 short int int16;	/* 16-bit signed int */
typedef unsigned short int uint16;	/* 16-bit unsigned int */
typedef int     int32;		/* 32-bit signed int */
typedef unsigned int uint32;	/* 32-bit unsigned int */
typedef float   float32;	/* 32-bit float */
typedef double  float64;	/* 64-bit float */

/* FIXME: what about host compilers that don't support 64-bit ints? */
typedef unsigned long long uint64; /* 64-bit unsigned int */
typedef long long int64;	   /* 64-bit signed int */

#define UINT64_MAX 18446744073709551615ULL

struct pstate {

    float64         fd[16];	/* FPU registers */
#ifdef HOST_LITTLE_ENDIAN_FLOAT
    float32         fs[32];
    float32        *fdp;
#else
    float32        *fs;
#endif
    int32          *fsi;
    uint32          fsr;
    int32           fpstate;
    uint32          fpq[FPUQN * 2];
    uint32          fpqn;
    uint32          ftime;
    uint32          flrd;
    uint32          frd;
    uint32          frs1;
    uint32          frs2;
    uint32          fpu_pres;	/* FPU present (0 = No, 1 = Yes) */

    uint32          psr;	/* IU registers */
    uint32          tbr;
    uint32          wim;
    uint32          g[8];
    uint32          r[128];
    uint32          y;
    uint32          asr17;      /* Single vector trapping */
    uint32          pc, npc;


    uint32          trap;	/* Current trap type */
    uint32          annul;	/* Instruction annul */
    uint32          data;	/* Loaded data	     */
    uint32          inst;	/* Current instruction */
    uint32          asi;	/* Current ASI */
    uint32          err_mode;	/* IU error mode */
    uint32          breakpoint;
    uint32          bptnum;
    uint32          bphit;
    uint32          bpts[BPT_MAX];	/* Breakpoints */

    uint32          ltime;	/* Load interlock time */
    uint32          hold;	/* IU hold cycles in current inst */
    uint32          fhold;	/* FPU hold cycles in current inst */
    uint32          icnt;	/* Instruction cycles in curr inst */

    uint32          histlen;	/* Trace history management */
    uint32          histind;
    struct histype *histbuf;
    float32         freq;	/* Simulated processor frequency */


    uint64          tottime;
    uint64          ninst;
    uint64          fholdt;
    uint64          holdt;
    uint64          icntt;
    uint64          finst;
    uint64          simstart;
    uint64          starttime;
    uint64          tlimit;	/* Simulation time limit */
    uint64          pwdtime;	/* Cycles in power-down mode */
    uint64          nstore;	/* Number of load instructions */
    uint64          nload;	/* Number of store instructions */
    uint64          nannul;	/* Number of annuled instructions */
    uint64          nbranch;	/* Number of branch instructions */
    uint32          ildreg;	/* Destination of last load instruction */
    uint64          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           arg;
    uint64          time;
    struct evcell  *nxt;
};

struct estate {
    struct evcell   eq;
    struct evcell  *freeq;
    uint64          simtime;
};

struct irqcell {
    void            (*callback) ();
    int32           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 PARAMS ((void));
extern void	reset PARAMS ((void));
extern void	error_mode PARAMS ((uint32 pc));
extern void	sim_halt PARAMS ((void));
extern void	exit_sim PARAMS ((void));
extern void	init_stdio PARAMS ((void));
extern void	restore_stdio PARAMS ((void));
extern int	memory_read PARAMS ((int32 asi, uint32 addr, uint32 *data,
				     int32 sz, int32 *ws));
extern int	memory_write PARAMS ((int32 asi, uint32 addr, uint32 *data,
				    int32 sz, int32 *ws));
extern int	sis_memory_write PARAMS ((uint32 addr,
				    const unsigned char *data, uint32 length));
extern int	sis_memory_read PARAMS ((uint32 addr, char *data,
					 uint32 length));

/* func.c */
extern void	set_regi PARAMS ((struct pstate *sregs, int32 reg,
				  uint32 rval));
extern void	get_regi PARAMS ((struct pstate *sregs, int32 reg, char *buf));
extern int	exec_cmd PARAMS ((struct pstate *sregs, char *cmd));
extern void	reset_stat PARAMS ((struct pstate  *sregs));
extern void	show_stat PARAMS ((struct pstate  *sregs));
extern void	init_bpt PARAMS ((struct pstate  *sregs));
extern void	init_signals PARAMS ((void));

struct disassemble_info;
extern void	dis_mem PARAMS ((uint32 addr, uint32 len,
				 struct disassemble_info *info));
extern void	event PARAMS ((void (*cfunc) (), int32 arg, uint64 delta));
extern void	set_int PARAMS ((int32 level, void (*callback) (), int32 arg));
extern void	advance_time PARAMS ((struct pstate  *sregs));
extern uint32	now PARAMS ((void));
extern int	wait_for_irq PARAMS ((void));
extern int	check_bpt PARAMS ((struct pstate *sregs));
extern void	reset_all PARAMS ((void));
extern void	sys_reset PARAMS ((void));
extern void	sys_halt PARAMS ((void));
extern int	bfd_load PARAMS ((char *fname));

/* exec.c */
extern int	dispatch_instruction PARAMS ((struct pstate *sregs));
extern int	execute_trap PARAMS ((struct pstate *sregs));
extern int	check_interrupts PARAMS ((struct pstate  *sregs));
extern void	init_regs PARAMS ((struct pstate *sregs));

/* interf.c */
extern int	run_sim PARAMS ((struct pstate *sregs,
				 uint64 icount, int dis));

/* float.c */
extern int	get_accex PARAMS ((void));
extern void	clear_accex PARAMS ((void));
extern void	set_fsr PARAMS ((uint32 fsr));

/* help.c */
extern void	usage PARAMS ((void));
extern void	gen_help PARAMS ((void));
