* configure.in: Look for libtermcap.a.
* Makefile.in: Only link in -ltermcap if it exists. * erc32.c: Update to version 2.6a. Fix uart handling. * exec.c: Update to version 2.6a. Add sparclite support. * float.c: Update to version 2.6a. Convert comments to preprocessor warnings. Add __setfpucw() for i385 hosts so floating point exceptions work. * func.c: Update to version 2.6a. Fix uart handling, add support for user error traps. * help.c: Update to version 2.6a. Add help note on user error traps. * interf.c: Update to version 2.6a. Fix uart handling, and add sparclite support. * examples/gccx: Use sparclite cross compiler, not native gcc. * examples/srt0.S: Use "mov" rather than "wr" for manipulating the psr register.
This commit is contained in:
parent
20e1ab85bf
commit
a665caa644
3 changed files with 132 additions and 64 deletions
|
@ -1,3 +1,28 @@
|
|||
Tue Dec 3 11:54:37 1996 Rob Savoye <rob@chinadoll.cygnus.com>
|
||||
|
||||
* configure.in: Look for libtermcap.a.
|
||||
* Makefile.in: Only link in -ltermcap if it exists.
|
||||
* erc32.c: Update to version 2.6a. Fix uart handling.
|
||||
* exec.c: Update to version 2.6a. Add sparclite support.
|
||||
* float.c: Update to version 2.6a. Convert comments to
|
||||
preprocessor warnings. Add __setfpucw() for i385 hosts so floating
|
||||
point exceptions work on win32.
|
||||
* func.c: Update to version 2.6a. Fix uart handling, add support
|
||||
for user error traps.
|
||||
* help.c: Update to version 2.6a. Add help note on user error
|
||||
traps.
|
||||
* interf.c: Update to version 2.6a. Fix uart handling, and add
|
||||
sparclite support.
|
||||
* examples/gccx: Use sparclite cross compiler, not native gcc.
|
||||
* examples/srt0.S: Use "mov" rather than "wr" for manipulating
|
||||
the psr register.
|
||||
|
||||
Mon Nov 25 08:28:10 1996 Fred Fish <fnf@cygnus.com>
|
||||
|
||||
* Makefile.in (run.o): Remove this rule, it hides the one in
|
||||
../common/Make-common.in that correctly references the source
|
||||
in the sibling ../common directory.
|
||||
|
||||
Wed Nov 20 01:30:12 1996 Doug Evans <dje@canuck.cygnus.com>
|
||||
|
||||
* Makefile.in: Delete stuff moved to ../common/Make-common.in.
|
||||
|
|
|
@ -6,4 +6,7 @@ SIM_AC_COMMON
|
|||
|
||||
AC_CHECK_HEADERS(stdlib.h)
|
||||
|
||||
AC_CHECK_LIB(termcap, main, TERMCAP=-ltermcap, TERMCAP="")
|
||||
AC_SUBST(TERMCAP)
|
||||
|
||||
SIM_AC_OUTPUT
|
||||
|
|
|
@ -23,10 +23,13 @@
|
|||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include "sis.h"
|
||||
#include "bfd.h"
|
||||
#include <dis-asm.h>
|
||||
|
||||
#include "remote-sim.h"
|
||||
|
||||
#ifndef fprintf
|
||||
extern fprintf();
|
||||
#endif
|
||||
|
@ -41,23 +44,22 @@ extern struct estate ebase;
|
|||
|
||||
extern int ctrl_c;
|
||||
extern int nfp;
|
||||
extern int ift;
|
||||
extern int rom8;
|
||||
extern int wrp;
|
||||
extern int sis_verbose;
|
||||
extern char *sis_version;
|
||||
extern struct estate ebase;
|
||||
extern struct evcell evbuf[];
|
||||
extern struct irqcell irqarr[];
|
||||
extern int irqpend, ext_irl;
|
||||
extern char uart_dev1[], uart_dev2[];
|
||||
extern int sparclite;
|
||||
extern int termsave;
|
||||
extern char uart_dev1[], uart_dev2[];
|
||||
|
||||
int sis_gdb_break = 1;
|
||||
|
||||
#ifdef IUREV0
|
||||
extern int iurev0;
|
||||
#endif
|
||||
|
||||
#ifdef MECREV0
|
||||
extern int mecrev0;
|
||||
#endif
|
||||
host_callback *sim_callback;
|
||||
|
||||
run_sim(sregs, go, icount, dis)
|
||||
struct pstate *sregs;
|
||||
|
@ -68,8 +70,10 @@ run_sim(sregs, go, icount, dis)
|
|||
int mexc, ws;
|
||||
|
||||
if (sis_verbose)
|
||||
printf_filtered("resuming at %x\n", sregs->pc);
|
||||
sregs->starttime = time(NULL);
|
||||
(*sim_callback->printf_filtered) (sim_callback, "resuming at %x\n",
|
||||
sregs->pc);
|
||||
init_stdio();
|
||||
sregs->starttime = time(NULL);
|
||||
while ((!sregs->err_mode & (go || (icount > 0))) &&
|
||||
((sregs->bptnum == 0) || !(sregs->bphit = check_bpt(sregs)))) {
|
||||
|
||||
|
@ -85,12 +89,6 @@ run_sim(sregs, go, icount, dis)
|
|||
sregs->asi = 8;
|
||||
else
|
||||
sregs->asi = 9;
|
||||
#ifdef IUREV0
|
||||
if (iurev0 && sregs->rett_err) {
|
||||
sregs->asi &= ~0x1;
|
||||
sregs->asi |= ((sregs->psr & 0x040) >> 6);
|
||||
}
|
||||
#endif
|
||||
|
||||
mexc = memory_read(sregs->asi, sregs->pc, &sregs->inst, &sregs->hold);
|
||||
if (sregs->annul) {
|
||||
|
@ -115,7 +113,8 @@ run_sim(sregs, go, icount, dis)
|
|||
}
|
||||
if ((sis_gdb_break) && (sregs->inst == 0x91d02001)) {
|
||||
if (sis_verbose)
|
||||
printf_filtered("SW BP hit at %x\n", sregs->pc);
|
||||
(*sim_callback->printf_filtered) (sim_callback,
|
||||
"SW BP hit at %x\n", sregs->pc);
|
||||
return (BPT_HIT);
|
||||
} else
|
||||
dispatch_instruction(sregs);
|
||||
|
@ -131,14 +130,18 @@ run_sim(sregs, go, icount, dis)
|
|||
go = icount = 0;
|
||||
}
|
||||
}
|
||||
sim_stop();
|
||||
sregs->tottime += time(NULL) - sregs->starttime;
|
||||
restore_stdio();
|
||||
clearerr(stdin);
|
||||
if (sregs->err_mode)
|
||||
error_mode(sregs->pc);
|
||||
if (sregs->err_mode)
|
||||
return (ERROR);
|
||||
if (sregs->bphit) {
|
||||
if (sis_verbose)
|
||||
printf_filtered("HW BP hit at %x\n", sregs->pc);
|
||||
(*sim_callback->printf_filtered) (sim_callback,
|
||||
"HW BP hit at %x\n", sregs->pc);
|
||||
return (BPT_HIT);
|
||||
}
|
||||
if (ctrl_c) {
|
||||
|
@ -148,9 +151,22 @@ run_sim(sregs, go, icount, dis)
|
|||
return (TIME_OUT);
|
||||
}
|
||||
|
||||
void
|
||||
sim_set_callbacks (ptr)
|
||||
host_callback *ptr;
|
||||
{
|
||||
sim_callback = ptr;
|
||||
}
|
||||
|
||||
void
|
||||
sim_open(char *args)
|
||||
sim_size (memsize)
|
||||
int memsize;
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
sim_open(args)
|
||||
char *args;
|
||||
{
|
||||
|
||||
int argc = 0;
|
||||
|
@ -160,8 +176,8 @@ sim_open(char *args)
|
|||
int grdl = 0;
|
||||
int freq = 15;
|
||||
|
||||
printf_filtered("\n SIS - SPARC instruction simulator %s\n", sis_version);
|
||||
printf_filtered(" Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n");
|
||||
(*sim_callback->printf_filtered) (sim_callback, "\n SIS - SPARC instruction simulator %s\n", sis_version);
|
||||
(*sim_callback->printf_filtered) (sim_callback, " Bug-reports to Jiri Gaisler ESA/ESTEC (jgais@wd.estec.esa.nl)\n");
|
||||
argv = buildargv(args);
|
||||
if (argv != NULL)
|
||||
while (argv[argc])
|
||||
|
@ -170,39 +186,40 @@ sim_open(char *args)
|
|||
if (argv[stat][0] == '-') {
|
||||
if (strcmp(argv[stat], "-v") == 0) {
|
||||
sis_verbose = 1;
|
||||
}
|
||||
#ifdef IUREV0
|
||||
if (strcmp(argv[stat], "-iurev0") == 0) {
|
||||
iurev0 = 1;
|
||||
printf_filtered(" simulating IU rev.0 jmpl/restore bug\n");
|
||||
}
|
||||
#endif
|
||||
#ifdef MECREV0
|
||||
if (strcmp(argv[stat], "-mecrev0") == 0) {
|
||||
mecrev0 = 1;
|
||||
printf_filtered(" simulating MEC rev.0 timer and uart interrupt bug\n");
|
||||
}
|
||||
#endif
|
||||
} else
|
||||
if (strcmp(argv[stat], "-nfp") == 0) {
|
||||
printf_filtered("no FPU\n");
|
||||
(*sim_callback->printf_filtered) (sim_callback, "no FPU\n");
|
||||
nfp = 1;
|
||||
}
|
||||
if (strcmp(argv[stat], "-uart1") == 0) {
|
||||
if ((stat + 1) < argc)
|
||||
strcpy(uart_dev1, argv[++stat]);
|
||||
}
|
||||
if (strcmp(argv[stat], "-uart2") == 0) {
|
||||
if ((stat + 1) < argc)
|
||||
strcpy(uart_dev2, argv[++stat]);
|
||||
}
|
||||
} else
|
||||
if (strcmp(argv[stat], "-ift") == 0) {
|
||||
ift = 1;
|
||||
} else
|
||||
if (strcmp(argv[stat], "-sparclite") == 0) {
|
||||
(*sim_callback->printf_filtered) (sim_callback, "simulating Sparclite\n");
|
||||
sparclite = 1;
|
||||
} else
|
||||
if (strcmp(argv[stat], "-wrp") == 0) {
|
||||
wrp = 1;
|
||||
} else
|
||||
if (strcmp(argv[stat], "-rom8") == 0) {
|
||||
rom8 = 1;
|
||||
} else
|
||||
if (strcmp(argv[stat], "-uart1") == 0) {
|
||||
if ((stat + 1) < argc)
|
||||
strcpy(uart_dev1, argv[++stat]);
|
||||
} else
|
||||
if (strcmp(argv[stat], "-uart2") == 0) {
|
||||
if ((stat + 1) < argc)
|
||||
strcpy(uart_dev2, argv[++stat]);
|
||||
} else
|
||||
if (strcmp(argv[stat], "-nogdb") == 0) {
|
||||
printf_filtered("disabling GDB trap handling for breakpoints\n");
|
||||
(*sim_callback->printf_filtered) (sim_callback, "disabling GDB trap handling for breakpoints\n");
|
||||
sis_gdb_break = 0;
|
||||
}
|
||||
} else
|
||||
if (strcmp(argv[stat], "-freq") == 0)
|
||||
if ((stat + 1) < argc) {
|
||||
freq = VAL(argv[++stat]);
|
||||
printf_filtered(" ERC32 freq %d Mhz\n", freq);
|
||||
(*sim_callback->printf_filtered) (sim_callback, " ERC32 freq %d Mhz\n", freq);
|
||||
}
|
||||
} else
|
||||
bfd_load(argv[stat]);
|
||||
|
@ -210,8 +227,8 @@ sim_open(char *args)
|
|||
}
|
||||
freeargv(argv);
|
||||
sregs.freq = freq;
|
||||
|
||||
INIT_DISASSEMBLE_INFO(dinfo, stdout, fprintf);
|
||||
termsave = fcntl(0, F_GETFL, 0);
|
||||
INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf);
|
||||
init_signals();
|
||||
reset_all();
|
||||
ebase.simtime = 0;
|
||||
|
@ -225,20 +242,31 @@ sim_close(int quitting)
|
|||
{
|
||||
|
||||
exit_sim();
|
||||
fcntl(0, F_SETFL, termsave);
|
||||
|
||||
};
|
||||
|
||||
/* Return non-zero if the caller should handle the load. Zero if
|
||||
we have loaded the image. */
|
||||
|
||||
int sim_load PARAMS ((char *prog, int from_tty));
|
||||
|
||||
int
|
||||
sim_load(char *prog, int from_tty)
|
||||
sim_load(prog, from_tty)
|
||||
char *prog;
|
||||
int from_tty;
|
||||
{
|
||||
bfd_load(prog);
|
||||
return (0);
|
||||
}
|
||||
|
||||
void sim_create_inferior PARAMS ((SIM_ADDR start_address, char **argv, char **env));
|
||||
|
||||
void
|
||||
sim_create_inferior(int start_address, char **argv, char **env)
|
||||
sim_create_inferior(start_address, argv, env)
|
||||
SIM_ADDR start_address;
|
||||
char **argv;
|
||||
char **env;
|
||||
{
|
||||
ebase.simtime = 0;
|
||||
reset_all();
|
||||
|
@ -269,15 +297,20 @@ sim_fetch_register(regno, buf)
|
|||
|
||||
int
|
||||
sim_write(mem, buf, length)
|
||||
int mem;
|
||||
SIM_ADDR mem;
|
||||
unsigned char *buf;
|
||||
int length;
|
||||
{
|
||||
return (sis_memory_write(mem, buf, length));
|
||||
}
|
||||
|
||||
int sim_read PARAMS ((SIM_ADDR mem, unsigned char *buf, int length));
|
||||
|
||||
int
|
||||
sim_read(int mem, unsigned char *buf, int length)
|
||||
sim_read(mem, buf, length)
|
||||
SIM_ADDR mem;
|
||||
unsigned char *buf;
|
||||
int length;
|
||||
{
|
||||
return (sis_memory_read(mem, buf, length));
|
||||
}
|
||||
|
@ -292,10 +325,6 @@ sim_info(int verbose)
|
|||
|
||||
int simstat = OK;
|
||||
|
||||
enum sim_stop {
|
||||
sim_exited, sim_stopped, sim_signalled
|
||||
};
|
||||
|
||||
void
|
||||
sim_stop_reason(enum sim_stop * reason, int *sigrc)
|
||||
{
|
||||
|
@ -309,6 +338,9 @@ sim_stop_reason(enum sim_stop * reason, int *sigrc)
|
|||
case TIME_OUT:
|
||||
case BPT_HIT:
|
||||
*reason = sim_stopped;
|
||||
#ifdef _WIN32
|
||||
#define SIGTRAP 5
|
||||
#endif
|
||||
*sigrc = SIGTRAP;
|
||||
break;
|
||||
case ERROR:
|
||||
|
@ -375,15 +407,21 @@ sim_resume(int step, int siggnal)
|
|||
{
|
||||
simstat = run_sim(&sregs, 1, 0, 0);
|
||||
|
||||
flush_windows ();
|
||||
if (sis_gdb_break) flush_windows ();
|
||||
}
|
||||
|
||||
int
|
||||
sim_trace ()
|
||||
{
|
||||
/* FIXME: unfinished */
|
||||
sim_resume (0, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
sim_kill(void)
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
sim_do_command(cmd)
|
||||
|
@ -392,7 +430,7 @@ sim_do_command(cmd)
|
|||
exec_cmd(&sregs, cmd);
|
||||
}
|
||||
|
||||
|
||||
#if 0 /* FIXME: These shouldn't exist. */
|
||||
|
||||
int
|
||||
sim_insert_breakpoint(int addr)
|
||||
|
@ -401,7 +439,7 @@ sim_insert_breakpoint(int addr)
|
|||
sregs.bpts[sregs.bptnum] = addr & ~0x3;
|
||||
sregs.bptnum++;
|
||||
if (sis_verbose)
|
||||
printf_filtered("inserted HW BP at %x\n", addr);
|
||||
(*sim_callback->printf_filtered) (sim_callback, "inserted HW BP at %x\n", addr);
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
|
@ -419,8 +457,10 @@ sim_remove_breakpoint(int addr)
|
|||
sregs.bpts[i] = sregs.bpts[i + 1];
|
||||
sregs.bptnum -= 1;
|
||||
if (sis_verbose)
|
||||
printf_filtered("removed HW BP at %x\n", addr);
|
||||
(*sim_callback->printf_filtered) (sim_callback, "removed HW BP at %x\n", addr);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue