Line 221... |
Line 221... |
readfunc, writefunc);
|
readfunc, writefunc);
|
}
|
}
|
|
|
|
|
/* Check if access is to registered area of memory. */
|
/* Check if access is to registered area of memory. */
|
struct dev_memarea *verify_memoryarea(unsigned long addr)
|
inline struct dev_memarea *verify_memoryarea(unsigned long addr)
|
{
|
{
|
struct dev_memarea *ptmp;
|
struct dev_memarea *ptmp;
|
|
|
|
/* Check cached value first */
|
|
if (cur_area && (addr & cur_area->addr_mask) == (cur_area->addr_compare & cur_area->addr_mask))
|
|
return cur_area;
|
|
|
|
/* When mc is enabled, we must check valid also, otherwise we assume it is nonzero */
|
|
IFF (config.mc.enabled) {
|
/* Check list of registered devices. */
|
/* Check list of registered devices. */
|
for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
|
for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
|
if (ptmp->valid && ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask)))
|
if ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask) && ptmp->valid)
|
return cur_area = ptmp;
|
return cur_area = ptmp;
|
|
} else {
|
|
/* Check list of registered devices. */
|
|
for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
|
|
if ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask))
|
|
return cur_area = ptmp;
|
|
}
|
return cur_area = NULL;
|
return cur_area = NULL;
|
}
|
}
|
|
|
|
inline unsigned long evalsim_mem32(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 4:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr) << 24;
|
|
temp |= cur_area->readfunc(memaddr + 1) << 16;
|
|
temp |= cur_area->readfunc(memaddr + 2) << 8;
|
|
temp |= cur_area->readfunc(memaddr + 3);
|
|
mem_cycles += cur_area->delayr * 4;
|
|
break;
|
|
case 2:
|
|
temp = cur_area->readfunc(memaddr) << 16;
|
|
temp |= cur_area->readfunc(memaddr + 2);
|
|
mem_cycles += cur_area->delayr * 2;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
unsigned short evalsim_mem16(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr) << 8;
|
|
temp |= cur_area->readfunc(memaddr + 1);
|
|
mem_cycles += cur_area->delayr * 2;
|
|
break;
|
|
case 2:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 4:
|
|
temp = evalsim_mem32 (memaddr & ~3ul);
|
|
if (memaddr & 2)
|
|
temp &= 0xffff;
|
|
else
|
|
temp >>= 16;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
unsigned char evalsim_mem8(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 2:
|
|
temp = evalsim_mem16 (memaddr & ~1ul);
|
|
if (memaddr & 1)
|
|
temp &= 0xff;
|
|
else
|
|
temp >>= 8;
|
|
break;
|
|
case 4:
|
|
temp = evalsim_mem32 (memaddr & ~3ul);
|
|
temp >>= 8 * (3 - (memaddr & 3));
|
|
temp &= 0xff;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
/* Returns 32-bit values from mem array. Big endian version. */
|
/* Returns 32-bit values from mem array. Big endian version. */
|
unsigned long read_mem(unsigned long memaddr,int* breakpoint)
|
unsigned long read_mem(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
unsigned long temp;
|
unsigned long temp;
|
struct dev_memarea *dev;
|
struct dev_memarea *dev;
|
Line 258... |
Line 369... |
|
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_32 | MPROF_READ);
|
mprofile (memaddr, MPROF_32 | MPROF_READ);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
if (pending.valid)
|
if (pending.valid)
|
return 0;
|
return 0;
|
|
|
if (memaddr & 3) {
|
if (memaddr & 3) {
|
Line 285... |
Line 397... |
|
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_32 | MPROF_FETCH);
|
mprofile (memaddr, MPROF_32 | MPROF_FETCH);
|
// memaddr = simulate_ic_mmu_fetch(memaddr);
|
// memaddr = simulate_ic_mmu_fetch(memaddr);
|
cur_vadd = pc;
|
cur_vadd = pc;
|
ic_simulate_fetch(memaddr);
|
IFF (config.ic.enabled) ic_simulate_fetch(memaddr);
|
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
temp = evalsim_mem32(memaddr);
|
temp = evalsim_mem32(memaddr);
|
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
return temp;
|
return temp;
|
}
|
}
|
|
|
unsigned long evalsim_mem32(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 4:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr) << 24;
|
|
temp |= cur_area->readfunc(memaddr + 1) << 16;
|
|
temp |= cur_area->readfunc(memaddr + 2) << 8;
|
|
temp |= cur_area->readfunc(memaddr + 3);
|
|
mem_cycles += cur_area->delayr * 4;
|
|
break;
|
|
case 2:
|
|
temp = cur_area->readfunc(memaddr) << 16;
|
|
temp |= cur_area->readfunc(memaddr + 2);
|
|
mem_cycles += cur_area->delayr * 2;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
/* Returns 16-bit values from mem array. Big endian version. */
|
/* Returns 16-bit values from mem array. Big endian version. */
|
|
|
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
|
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
unsigned short temp;
|
unsigned short temp;
|
|
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_16 | MPROF_READ);
|
mprofile (memaddr, MPROF_16 | MPROF_READ);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
if (pending.valid)
|
if (pending.valid)
|
return 0;
|
return 0;
|
|
|
if (memaddr & 1) {
|
if (memaddr & 1) {
|
Line 355... |
Line 435... |
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
return temp;
|
return temp;
|
}
|
}
|
|
|
unsigned short evalsim_mem16(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr) << 8;
|
|
temp |= cur_area->readfunc(memaddr + 1);
|
|
mem_cycles += cur_area->delayr * 2;
|
|
break;
|
|
case 2:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 4:
|
|
temp = evalsim_mem32 (memaddr & ~3ul);
|
|
if (memaddr & 2)
|
|
temp &= 0xffff;
|
|
else
|
|
temp >>= 16;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
|
|
/* Returns 8-bit values from mem array. */
|
/* Returns 8-bit values from mem array. */
|
|
|
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
|
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
unsigned long temp;
|
unsigned long temp;
|
|
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_8 | MPROF_READ);
|
mprofile (memaddr, MPROF_8 | MPROF_READ);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
if (pending.valid)
|
if (pending.valid)
|
return 0;
|
return 0;
|
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
Line 411... |
Line 458... |
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* MM170901 */
|
return temp;
|
return temp;
|
}
|
}
|
|
|
unsigned char evalsim_mem8(unsigned long memaddr)
|
|
{
|
|
unsigned long temp;
|
|
|
|
if (verify_memoryarea(memaddr)) {
|
|
switch(cur_area->granularity) {
|
|
case 1:
|
|
temp = cur_area->readfunc(memaddr);
|
|
mem_cycles += cur_area->delayr;
|
|
break;
|
|
case 2:
|
|
temp = evalsim_mem16 (memaddr & ~1ul);
|
|
if (memaddr & 1)
|
|
temp &= 0xff;
|
|
else
|
|
temp >>= 8;
|
|
break;
|
|
case 4:
|
|
temp = evalsim_mem32 (memaddr & ~3ul);
|
|
temp >>= 8 * (3 - (memaddr & 3));
|
|
temp &= 0xff;
|
|
break;
|
|
}
|
|
if (cur_area->log)
|
|
fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
|
|
} else {
|
|
printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
|
temp = 0;
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
/* Set mem, 32-bit. Big endian version. */
|
/* Set mem, 32-bit. Big endian version. */
|
|
|
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
|
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
|
{
|
{
|
|
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_32 | MPROF_WRITE);
|
mprofile (memaddr, MPROF_32 | MPROF_WRITE);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
/* If we produced exception don't set anything */
|
/* If we produced exception don't set anything */
|
if (pending.valid == 1)
|
if (pending.valid)
|
return;
|
return;
|
|
|
if (memaddr & 3) {
|
if (memaddr & 3) {
|
except_handle (EXCEPT_ALIGN, memaddr);
|
except_handle (EXCEPT_ALIGN, memaddr);
|
return;
|
return;
|
Line 511... |
Line 525... |
{
|
{
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_16 | MPROF_WRITE);
|
mprofile (memaddr, MPROF_16 | MPROF_WRITE);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
/* If we produced exception don't set anything */
|
/* If we produced exception don't set anything */
|
if (pending.valid == 1)
|
if (pending.valid)
|
return;
|
return;
|
|
|
if (memaddr & 1) {
|
if (memaddr & 1) {
|
except_handle (EXCEPT_ALIGN, memaddr);
|
except_handle (EXCEPT_ALIGN, memaddr);
|
return;
|
return;
|
Line 567... |
Line 582... |
{
|
{
|
if (config.sim.mprofile)
|
if (config.sim.mprofile)
|
mprofile (memaddr, MPROF_8 | MPROF_WRITE);
|
mprofile (memaddr, MPROF_8 | MPROF_WRITE);
|
|
|
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
|
if (config.dmmu.enabled)
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
/* If we produced exception don't set anything */
|
/* If we produced exception don't set anything */
|
if (pending.valid == 1)
|
if (pending.valid) return;
|
return;
|
|
|
|
if (config.debug.enabled) {
|
if (config.debug.enabled) {
|
*breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr); /* 28/05/01 CZ */
|
*breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr); /* 28/05/01 CZ */
|
*breakpoint += CheckDebugUnit(DebugStoreData,value);
|
*breakpoint += CheckDebugUnit(DebugStoreData,value);
|
}
|
}
|