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:
Jiri Gaisler 2015-03-17 22:02:41 +01:00 committed by Mike Frysinger
parent 5831e29bc1
commit 102b920e11
5 changed files with 42 additions and 10 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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);