sim/erc32: Use memory_iread() function for instruction fetching.
Use separate memory_iread() function for instruction fetching. Speeds up execution and allows addition of an MMU at a later stage.
This commit is contained in:
parent
5831e29bc1
commit
102b920e11
|
@ -1,3 +1,12 @@
|
|||
2015-03-28 Jiri Gaisler <jiri@gaisler.se>
|
||||
|
||||
* erc32.c (memory_iread): New function to fetch instructions.
|
||||
(memory_read): Print message in verbose mode.
|
||||
* interf.c (run_sim): Use memory_iread.
|
||||
* sis.c (run_sim): As above.
|
||||
* sis.h (memory_iread): New prototype.
|
||||
(sregs): Declare.
|
||||
|
||||
2015-03-28 Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
* erc32.c (mec_read): Delete parenthesis around return statement.
|
||||
|
|
|
@ -1647,6 +1647,31 @@ store_bytes (mem, data, sz)
|
|||
|
||||
/* Memory emulation */
|
||||
|
||||
int
|
||||
memory_iread (uint32 addr, uint32 *data, int32 *ws)
|
||||
{
|
||||
uint32 asi;
|
||||
if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) {
|
||||
memcpy (data, &ramb[addr & mem_rammask & ~3], 4);
|
||||
*ws = mem_ramr_ws;
|
||||
return 0;
|
||||
} else if (addr < mem_romsz) {
|
||||
memcpy (data, &romb[addr & ~3], 4);
|
||||
*ws = mem_romr_ws;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sis_verbose)
|
||||
printf ("Memory exception at %x (illegal address)\n", addr);
|
||||
if (sregs.psr & 0x080)
|
||||
asi = 9;
|
||||
else
|
||||
asi = 8;
|
||||
set_sfsr (UIMP_ACC, addr, asi, 1);
|
||||
*ws = MEM_EX_WS;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
memory_read(asi, addr, data, sz, ws)
|
||||
int32 asi;
|
||||
|
@ -1712,7 +1737,8 @@ memory_read(asi, addr, data, sz, ws)
|
|||
|
||||
}
|
||||
|
||||
printf("Memory exception at %x (illegal address)\n", addr);
|
||||
if (sis_verbose)
|
||||
printf ("Memory exception at %x (illegal address)\n", addr);
|
||||
set_sfsr(UIMP_ACC, addr, asi, 1);
|
||||
*ws = MEM_EX_WS;
|
||||
return 1;
|
||||
|
|
|
@ -95,9 +95,8 @@ run_sim(sregs, icount, dis)
|
|||
if (sregs->pc == 0 || sregs->npc == 0)
|
||||
printf ("bogus pc or npc\n");
|
||||
#endif
|
||||
mexc = memory_read(sregs->asi, sregs->pc, &sregs->inst,
|
||||
2, &sregs->hold);
|
||||
#if 1 /* DELETE ME! for debugging purposes only */
|
||||
mexc = memory_iread (sregs->pc, &sregs->inst, &sregs->hold);
|
||||
#if 0 /* DELETE ME! for debugging purposes only */
|
||||
if (sis_verbose > 2)
|
||||
printf("pc %x, np %x, sp %x, fp %x, wm %x, cw %x, i %08x\n",
|
||||
sregs->pc, sregs->npc,
|
||||
|
|
|
@ -75,7 +75,7 @@ run_sim(sregs, icount, dis)
|
|||
uint64 icount;
|
||||
int dis;
|
||||
{
|
||||
int irq, mexc, deb, asi;
|
||||
int irq, mexc, deb;
|
||||
|
||||
sregs->starttime = get_time();
|
||||
init_stdio();
|
||||
|
@ -84,11 +84,7 @@ run_sim(sregs, icount, dis)
|
|||
irq = 0;
|
||||
while (icount > 0) {
|
||||
|
||||
if (sregs->psr & 0x080)
|
||||
asi = 9;
|
||||
else
|
||||
asi = 8;
|
||||
mexc = memory_read(asi, sregs->pc, &sregs->inst, 2, &sregs->hold);
|
||||
mexc = memory_iread (sregs->pc, &sregs->inst, &sregs->hold);
|
||||
sregs->icnt = 1;
|
||||
if (sregs->annul) {
|
||||
sregs->annul = 0;
|
||||
|
|
|
@ -169,6 +169,7 @@ 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 addr, uint32 *data, int32 *ws);
|
||||
extern int memory_read (int32 asi, uint32 addr, uint32 *data,
|
||||
int32 sz, int32 *ws);
|
||||
extern int memory_write (int32 asi, uint32 addr, uint32 *data,
|
||||
|
@ -179,6 +180,7 @@ extern int sis_memory_read (uint32 addr, char *data,
|
|||
uint32 length);
|
||||
|
||||
/* func.c */
|
||||
extern struct pstate sregs;
|
||||
extern void set_regi (struct pstate *sregs, int32 reg,
|
||||
uint32 rval);
|
||||
extern void get_regi (struct pstate *sregs, int32 reg, char *buf);
|
||||
|
|
Loading…
Reference in New Issue