diff options
Diffstat (limited to 'tools/4.11/gdb/sparc/7.9/0012-sim-erc32-Use-memory_iread-function-for-instruction-.patch')
-rw-r--r-- | tools/4.11/gdb/sparc/7.9/0012-sim-erc32-Use-memory_iread-function-for-instruction-.patch | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/tools/4.11/gdb/sparc/7.9/0012-sim-erc32-Use-memory_iread-function-for-instruction-.patch b/tools/4.11/gdb/sparc/7.9/0012-sim-erc32-Use-memory_iread-function-for-instruction-.patch new file mode 100644 index 0000000..73aa065 --- /dev/null +++ b/tools/4.11/gdb/sparc/7.9/0012-sim-erc32-Use-memory_iread-function-for-instruction-.patch @@ -0,0 +1,119 @@ +From d468feaaf511b29880faa297476ff98a9ef81b32 Mon Sep 17 00:00:00 2001 +From: Jiri Gaisler <jiri@gaisler.se> +Date: Sat, 30 Aug 2014 23:47:46 +0200 +Subject: [PATCH 12/23] 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. + + * erc32.c (memory_iread) New function to fetch instructions. + * interf.c (run_sim) Use memory_iread. + * sis.c (run_sim) As above. +--- + sim/erc32/erc32.c | 24 ++++++++++++++++++++++++ + sim/erc32/interf.c | 5 ++--- + sim/erc32/sis.c | 8 ++------ + sim/erc32/sis.h | 2 ++ + 4 files changed, 30 insertions(+), 9 deletions(-) + +diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c +index eac49f7..03b40dc 100644 +--- a/sim/erc32/erc32.c ++++ b/sim/erc32/erc32.c +@@ -1566,6 +1566,30 @@ store_bytes (mem, waddr, data, sz, ws) + /* Memory emulation */ + + int ++memory_iread(addr, data, ws) ++ uint32 addr; ++ uint32 *data; ++ int32 *ws; ++{ ++ uint32 asi; ++ if ((addr >= mem_ramstart) && (addr < (mem_ramstart + mem_ramsz))) { ++ *data = *((uint32 *) & (ramb[addr & mem_rammask & ~3])); ++ *ws = mem_ramr_ws; ++ return (0); ++ } else if (addr < mem_romsz) { ++ *data = *((uint32 *) & (romb[addr & ~3])); ++ *ws = mem_romr_ws; ++ return (0); ++ } ++ ++ 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; +diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c +index 3a72e7f..981aa11 100644 +--- a/sim/erc32/interf.c ++++ b/sim/erc32/interf.c +@@ -94,9 +94,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, +diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c +index 523d8aa..e109874 100644 +--- a/sim/erc32/sis.c ++++ b/sim/erc32/sis.c +@@ -84,7 +84,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(); +@@ -93,11 +93,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; +diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h +index ef5b149..fb733de 100644 +--- a/sim/erc32/sis.h ++++ b/sim/erc32/sis.h +@@ -176,6 +176,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, +@@ -186,6 +187,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); +-- +1.9.1 + |