diff options
author | Jiri Gaisler <jiri@gaisler.se> | 2015-03-17 22:02:41 +0100 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-03-28 03:00:19 -0400 |
commit | 102b920e11b6cd95addd59ea0eb08fac964fa8ad (patch) | |
tree | 7d0e005d17a7c9dcdd80e5dbbcbb9ed48b84c74e /sim/erc32/erc32.c | |
parent | 5831e29bc1a17115b96141bf72fbc44200c6e014 (diff) | |
download | gdb-102b920e11b6cd95addd59ea0eb08fac964fa8ad.zip gdb-102b920e11b6cd95addd59ea0eb08fac964fa8ad.tar.gz gdb-102b920e11b6cd95addd59ea0eb08fac964fa8ad.tar.bz2 |
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.
Diffstat (limited to 'sim/erc32/erc32.c')
-rw-r--r-- | sim/erc32/erc32.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c index 740d778..7f24fb0 100644 --- a/sim/erc32/erc32.c +++ b/sim/erc32/erc32.c @@ -1648,6 +1648,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; uint32 addr; @@ -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; |