[patch] sim/erc32/ max simulation time extended by using 64bit ints

Tiemen Schut
2010-04-23T13:25:50Z

[-- Attachment #1: Type: text/plain, Size: 468 bytes --]

Hey all,

This patch solves the problem that the sparc instruction simulator (SIS) would hang after a few minutes of simulation time (time depending on speed of host pc), because of the use of 32 bit counters internally.

This patch doesn't change anything to simulator behaviour, except that it allows for longer simulation times.

There may be a problem with the use of 64 bit integers, but that was also there before this patch.

Thanks,

Tiemen Schut

[-- Attachment #2: sis-V3.diff --]
[-- Type: application/octet-stream, Size: 9232 bytes --]

Index: sim/erc32/ChangeLog
===================================================================
RCS file: /cvs/src/src/sim/erc32/ChangeLog,v
retrieving revision 1.31
diff -u -r1.31 ChangeLog
--- sim/erc32/ChangeLog 14 Apr 2010 07:38:04 -0000 1.31
+++ sim/erc32/ChangeLog 22 Apr 2010 13:45:22 -0000
@@ -1,3 +1,8 @@
+2010-04-20 Tiemen Schut <T.Schut@sron.nl>
+
+ * sis.c, func.c, sis.h, interf.c: Increase max simulation time
+ by using uint64 for relevant counters.
+
2010-04-14 Mike Frysinger <vapier@gentoo.org>

* interp.c (sim_write): Add const to buf arg.
Index: sim/erc32/func.c
===================================================================
RCS file: /cvs/src/src/sim/erc32/func.c,v
retrieving revision 1.4
diff -u -r1.4 func.c
--- sim/erc32/func.c 8 Jul 2005 08:04:54 -0000 1.4
+++ sim/erc32/func.c 22 Apr 2010 13:45:22 -0000
@@ -421,7 +421,7 @@
}
} else if (strncmp(cmd1, "cont", clen) == 0) {
if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) {
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
} else {
stat = run_sim(sregs, VAL(cmd1), 0);
}
@@ -472,7 +472,7 @@
if ((cmd2 = strtok(NULL, " \t\n\r")) != NULL) {
stat = run_sim(sregs, VAL(cmd2), 0);
} else {
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
}
daddr = sregs->pc;
sim_halt();
@@ -544,7 +544,7 @@
reset_all();
reset_stat(sregs);
if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) {
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
} else {
stat = run_sim(sregs, VAL(cmd1), 0);
}
@@ -560,7 +560,7 @@
sim_halt();
} else if (strncmp(cmd1, "tcont", clen) == 0) {
sregs->tlimit = limcalc(sregs->freq);
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
daddr = sregs->pc;
sim_halt();
} else if (strncmp(cmd1, "tgo", clen) == 0) {
@@ -573,7 +573,7 @@
sregs->pc = len & ~3;
sregs->npc = sregs->pc + 4;
printf("resuming at 0x%08x\n",sregs->pc);
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
daddr = sregs->pc;
sim_halt();
} else if (strncmp(cmd1, "tlimit", clen) == 0) {
@@ -583,7 +583,7 @@
sregs->tlimit / sregs->freq / 1000);
} else if (strncmp(cmd1, "tra", clen) == 0) {
if ((cmd1 = strtok(NULL, " \t\n\r")) == NULL) {
- stat = run_sim(sregs, -1, 1);
+ stat = run_sim(sregs, UINT64_MAX, 1);
} else {
stat = run_sim(sregs, VAL(cmd1), 1);
}
@@ -595,7 +595,7 @@
reset_all();
reset_stat(sregs);
sregs->tlimit = limcalc(sregs->freq);
- stat = run_sim(sregs, -1, 0);
+ stat = run_sim(sregs, UINT64_MAX, 0);
daddr = sregs->pc;
sim_halt();
} else
@@ -833,7 +833,7 @@
event(cfunc, arg, delta)
void (*cfunc) ();
int32 arg;
- uint32 delta;
+ uint64 delta;
{
struct evcell *ev1, *evins;

@@ -900,7 +900,8 @@

struct evcell *evrem;
void (*cfunc) ();
- uint32 arg, endtime;
+ uint32 arg;
+ uint64 endtime;

#ifdef STAT
sregs->fholdt += sregs->fhold;
@@ -938,7 +939,8 @@
{
struct evcell *evrem;
void (*cfunc) ();
- int32 arg, endtime;
+ int32 arg;
+ uint64 endtime;

if (ebase.eq.nxt == NULL)
printf("Warning: event queue empty - power-down mode not entered\n");
Index: sim/erc32/interf.c
===================================================================
RCS file: /cvs/src/src/sim/erc32/interf.c,v
retrieving revision 1.7
diff -u -r1.7 interf.c
--- sim/erc32/interf.c 14 Apr 2010 07:38:04 -0000 1.7
+++ sim/erc32/interf.c 22 Apr 2010 13:45:22 -0000
@@ -37,7 +37,7 @@

#define PSR_CWP 0x7

-#define VAL(x) strtol(x,(char **)NULL,0)
+#define VAL(x) strtoull(x,(char **)NULL,0)

extern struct disassemble_info dinfo;
extern struct pstate sregs;
@@ -69,7 +69,7 @@
int
run_sim(sregs, icount, dis)
struct pstate *sregs;
- unsigned int icount;
+ uint64 icount;
int dis;
{
int mexc, irq;
@@ -338,10 +338,10 @@

int
sim_fetch_register(sd, regno, buf, length)
- SIM_DESC sd;
- int regno;
- unsigned char *buf;
- int length;
+ SIM_DESC sd;
+ int regno;
+ unsigned char *buf;
+ int length;
{
get_regi(&sregs, regno, buf);
return -1;
@@ -349,10 +349,10 @@

int
sim_write(sd, mem, buf, length)
- SIM_DESC sd;
- SIM_ADDR mem;
+ SIM_DESC sd;
+ SIM_ADDR mem;
const unsigned char *buf;
- int length;
+ int length;
{
return (sis_memory_write(mem, buf, length));
}
@@ -461,7 +461,7 @@
void
sim_resume(SIM_DESC sd, int step, int siggnal)
{
- simstat = run_sim(&sregs, -1, 0);
+ simstat = run_sim(&sregs, UINT64_MAX, 0);

if (sis_gdb_break) flush_windows ();
}
Index: sim/erc32/sis.c
===================================================================
RCS file: /cvs/src/src/sim/erc32/sis.c,v
retrieving revision 1.3
diff -u -r1.3 sis.c
--- sim/erc32/sis.c 9 Jun 2008 22:55:27 -0000 1.3
+++ sim/erc32/sis.c 22 Apr 2010 13:45:22 -0000
@@ -82,7 +82,7 @@
int
run_sim(sregs, icount, dis)
struct pstate *sregs;
- unsigned int icount;
+ uint64 icount;
int dis;
{
int irq, mexc, deb, asi;
Index: sim/erc32/sis.h
===================================================================
RCS file: /cvs/src/src/sim/erc32/sis.h,v
retrieving revision 1.2
diff -u -r1.2 sis.h
--- sim/erc32/sis.h 9 Jun 2002 15:45:46 -0000 1.2
+++ sim/erc32/sis.h 22 Apr 2010 13:45:22 -0000
@@ -23,6 +23,7 @@
#include "ansidecl.h"
#include "gdb/callback.h"
#include "gdb/remote-sim.h"
+#include "stdint.h"

#include "end.h"

@@ -52,8 +53,8 @@
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 */
+typedef uint64_t uint64; /* 64-bit unsigned int */
+typedef int64_t int64; /* 64-bit signed int */

struct pstate {

@@ -108,22 +109,22 @@
float32 freq; /* Simulated processor frequency */

- uint32 tottime;
- uint32 ninst;
- uint32 fholdt;
- uint32 holdt;
- uint32 icntt;
- uint32 finst;
- uint32 simstart;
- uint32 starttime;
- uint32 tlimit; /* Simulation time limit */
- uint32 pwdtime; /* Cycles in power-down mode */
- uint32 nstore; /* Number of load instructions */
- uint32 nload; /* Number of store instructions */
- uint32 nannul; /* Number of annuled instructions */
- uint32 nbranch; /* Number of branch instructions */
- uint32 ildreg; /* Destination of last load instruction */
- uint32 ildtime; /* Last time point for load dependency */
+ 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 */
+ uint64 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;
@@ -132,14 +133,14 @@
struct evcell {
void (*cfunc) ();
int32 arg;
- uint32 time;
+ uint64 time;
struct evcell *nxt;
};

struct estate {
struct evcell eq;
struct evcell *freeq;
- uint32 simtime;
+ uint64 simtime;
};

struct irqcell {
@@ -186,7 +187,7 @@
struct disassemble_info;
extern void dis_mem PARAMS ((uint32 addr, uint32 len,
struct disassemble_info *info));
-extern void event PARAMS ((void (*cfunc) (), int32 arg, uint32 delta));
+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));
@@ -205,7 +206,7 @@

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

/* float.c */
extern int get_accex PARAMS ((void));