/* mem.c --- memory for RX simulator.
-Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+Copyright (C) 2005, 2007-2012 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
This file is part of the GNU simulators.
#include <stdlib.h>
#include <string.h>
+#include "opcode/rx.h"
#include "mem.h"
#include "cpu.h"
#include "syscalls.h"
static unsigned char **pt[L1_LEN];
static unsigned char **ptr[L1_LEN];
+static RX_Opcode_Decoded ***ptdc[L1_LEN];
/* [ get=0/put=1 ][ byte size ] */
static unsigned int mem_counters[2][5];
{
pt[pt1] = (unsigned char **) calloc (L2_LEN, sizeof (char **));
ptr[pt1] = (unsigned char **) calloc (L2_LEN, sizeof (char **));
+ ptdc[pt1] = (RX_Opcode_Decoded ***) calloc (L2_LEN, sizeof (RX_Opcode_Decoded ***));
}
if (pt[pt1][pt2] == 0)
{
if (action == MPA_READING)
execution_error (SIM_ERR_READ_UNWRITTEN_PAGES, address);
- pt[pt1][pt2] = (unsigned char *) malloc (OFF_LEN);
- memset (pt[pt1][pt2], 0, OFF_LEN);
- ptr[pt1][pt2] = (unsigned char *) malloc (OFF_LEN);
- memset (ptr[pt1][pt2], MC_UNINIT, OFF_LEN);
+ pt[pt1][pt2] = (unsigned char *) calloc (OFF_LEN, 1);
+ ptr[pt1][pt2] = (unsigned char *) calloc (OFF_LEN, 1);
+ ptdc[pt1][pt2] = (RX_Opcode_Decoded **) calloc (OFF_LEN, sizeof(RX_Opcode_Decoded *));
}
else if (action == MPA_READING
&& ptr[pt1][pt2][pto] == MC_UNINIT)
if (action == MPA_WRITING)
{
+ int pto_dc;
if (ptr[pt1][pt2][pto] == MC_PUSHED_PC)
execution_error (SIM_ERR_CORRUPT_STACK, address);
ptr[pt1][pt2][pto] = MC_DATA;
+
+ /* The instruction decoder doesn't store it's decoded instructions
+ at word swapped addresses. Therefore, when clearing the decode
+ cache, we have to account for that here. */
+ pto_dc = pto ^ (rx_big_endian ? 3 : 0);
+ if (ptdc[pt1][pt2][pto_dc])
+ {
+ free (ptdc[pt1][pt2][pto_dc]);
+ ptdc[pt1][pt2][pto_dc] = NULL;
+ }
}
if (action == MPA_CONTENT_TYPE)
- return ptr[pt1][pt2] + pto;
+ return (unsigned char *) (ptr[pt1][pt2] + pto);
+
+ if (action == MPA_DECODE_CACHE)
+ return (unsigned char *) (ptdc[pt1][pt2] + pto);
return pt[pt1][pt2] + pto;
}
+RX_Opcode_Decoded **
+rx_mem_decode_cache (unsigned long address)
+{
+ return (RX_Opcode_Decoded **) rx_mem_ptr (address, MPA_DECODE_CACHE);
+}
+
static inline int
is_reserved_address (unsigned int address)
{
COUNT (1, 1);
}
+#ifdef CYCLE_ACCURATE
static int tpu_base;
+#endif
void
mem_put_hi (int address, unsigned short value)