From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 39967 invoked by alias); 17 Mar 2015 21:03:08 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 39911 invoked by uid 89); 17 Mar 2015 21:03:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 X-HELO: bin-vsp-out-03.atm.binero.net Received: from vsp-unauthed01.binero.net (HELO bin-vsp-out-03.atm.binero.net) (195.74.38.225) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 17 Mar 2015 21:03:04 +0000 X-Halon-ID: fd98b531-cce8-11e4-9958-0050569116f7 Authorized-sender: jiri@gaisler.se Received: from localhost.localdomain (unknown [46.246.62.93]) by bin-vsp-out-03.atm.binero.net (Halon Mail Gateway) with ESMTPSA; Tue, 17 Mar 2015 22:02:58 +0100 (CET) From: Jiri Gaisler To: gdb-patches@sourceware.org Cc: Jiri Gaisler Subject: [PATCH v4 04/13] sim/erc32: Use memory_iread() function for instruction fetching. Date: Tue, 17 Mar 2015 21:03:00 -0000 Message-Id: <1426626170-21401-5-git-send-email-jiri@gaisler.se> In-Reply-To: <1426626170-21401-1-git-send-email-jiri@gaisler.se> References: <1426626170-21401-1-git-send-email-jiri@gaisler.se> X-IsSubscribed: yes X-SW-Source: 2015-03/txt/msg00515.txt.bz2 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 | 38 ++++++++++++++++++++++++++++++++------ sim/erc32/interf.c | 5 ++--- sim/erc32/sis.c | 8 ++------ sim/erc32/sis.h | 2 ++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/sim/erc32/erc32.c b/sim/erc32/erc32.c index 8c0ddd3..c6d67ac 100644 --- a/sim/erc32/erc32.c +++ b/sim/erc32/erc32.c @@ -1083,7 +1083,7 @@ read_uart(addr) return tmp; #endif #else - return(0); + return 0; #endif break; @@ -1115,7 +1115,7 @@ read_uart(addr) return tmp; #endif #else - return(0); + return 0; #endif break; @@ -1155,7 +1155,7 @@ read_uart(addr) return (uart_stat_reg); #endif #else - return(0x00060006); + return 0x00060006; #endif break; default: @@ -1565,6 +1565,31 @@ store_bytes (mem, waddr, data, sz, ws) /* 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; @@ -1582,7 +1607,7 @@ memory_read(asi, addr, data, sz, ws) if (errmec == 5) mecparerror(); if (errmec == 6) iucomperr(); errmec = 0; - return(1); + return 1; } #endif @@ -1631,7 +1656,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); @@ -1661,7 +1687,7 @@ memory_write(asi, addr, data, sz, ws) if (errmec == 5) mecparerror(); if (errmec == 6) iucomperr(); errmec = 0; - return(1); + return 1; } #endif diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c index 97540a9..098b9ce 100644 --- a/sim/erc32/interf.c +++ b/sim/erc32/interf.c @@ -96,9 +96,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 dcb5ebf..b066a56 100644 --- a/sim/erc32/sis.c +++ b/sim/erc32/sis.c @@ -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; diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h index 74466ae..d21bf49 100644 --- a/sim/erc32/sis.h +++ b/sim/erc32/sis.h @@ -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); -- 1.9.1