Line 34... |
Line 34... |
#include "trace.h"
|
#include "trace.h"
|
#include "execute.h"
|
#include "execute.h"
|
#include "sprs.h"
|
#include "sprs.h"
|
#include "stats.h"
|
#include "stats.h"
|
#include "except.h"
|
#include "except.h"
|
|
#include "debug_unit.h"
|
|
#include "or32.h"
|
|
|
extern unsigned long reg[];
|
extern unsigned long reg[];
|
|
|
/* This is an abstract+physical memory array rather than only physical
|
/* This is an abstract+physical memory array rather than only physical
|
memory array */
|
memory array */
|
Line 49... |
Line 51... |
|
|
void dumpmemory(unsigned int from, unsigned int to)
|
void dumpmemory(unsigned int from, unsigned int to)
|
{
|
{
|
unsigned int i, done = 0;
|
unsigned int i, done = 0;
|
struct label_entry *tmp;
|
struct label_entry *tmp;
|
|
int breakpoint = 0;
|
|
|
for(i = from; i < to && i < (MEMORY_START + MEMORY_LEN); i++) {
|
for(i = from; i < to && i < (MEMORY_START + MEMORY_LEN); i++) {
|
if (mem[i].insn) {
|
if (mem[i].insn) {
|
printf("\n%4x:", i);
|
printf("\n%4x:", i);
|
|
|
Line 64... |
Line 67... |
printf("\n%4x:", i);
|
printf("\n%4x:", i);
|
|
|
printf("\t%.2x%.2x", mem[i].data, mem[i+1].data);
|
printf("\t%.2x%.2x", mem[i].data, mem[i+1].data);
|
printf("%.2x%.2x: ", mem[i+2].data, mem[i+3].data);
|
printf("%.2x%.2x: ", mem[i+2].data, mem[i+3].data);
|
if (mem[i].insn)
|
if (mem[i].insn)
|
printf("\t%s\t%s", mem[i].insn->insn, mem[i].insn->op1);
|
printf("\t%s\t%s", insn_name (mem[i].insn->insn_index), mem[i].insn->op1);
|
if (strlen(mem[i].insn->op2))
|
if (strlen(mem[i].insn->op2))
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op2);
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op2);
|
if (strlen(mem[i].insn->op3))
|
if (strlen(mem[i].insn->op3))
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op3);
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op3);
|
if (strlen(mem[i].insn->op4))
|
if (strlen(mem[i].insn->op4))
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op4);
|
printf("%s%s", OPERAND_DELIM, mem[i].insn->op4);
|
i += (insn_len(mem[i].insn->insn) - 1);
|
i += insn_len(mem[i].insn->insn_index) - 1;
|
} else
|
} else
|
{
|
{
|
if (i % 8 == 0)
|
if (i % 8 == 0)
|
printf("\n%.8x: ", i);
|
printf("\n%.8x: ", i);
|
|
|
Line 95... |
Line 98... |
for(i = from; i < to; i++) {
|
for(i = from; i < to; i++) {
|
if (i % 8 == 0)
|
if (i % 8 == 0)
|
printf("\n%.8x: ", i);
|
printf("\n%.8x: ", i);
|
|
|
/* don't print ascii chars below 0x20. */
|
/* don't print ascii chars below 0x20. */
|
if (eval_mem32(i) < 0x20)
|
if (eval_mem32(i,&breakpoint) < 0x20)
|
printf("0x%.2x ", (unsigned char)eval_mem32(i));
|
printf("0x%.2x ", (unsigned char)eval_mem32(i,&breakpoint));
|
else
|
else
|
printf("0x%.2x'%c' ", (unsigned char)eval_mem32(i), (unsigned char)eval_mem32(i));
|
printf("0x%.2x'%c' ", (unsigned char)eval_mem32(i,&breakpoint), (unsigned char)eval_mem32(i,&breakpoint));
|
|
|
}
|
}
|
}
|
}
|
|
|
/* Searches mem array for a particular label and returns label's address.
|
/* Searches mem array for a particular label and returns label's address.
|
Line 251... |
Line 254... |
return ptmp;
|
return ptmp;
|
return NULL;
|
return NULL;
|
}
|
}
|
|
|
/* Returns 32-bit values from mem array. Big endian version. */
|
/* Returns 32-bit values from mem array. Big endian version. */
|
unsigned long eval_mem32(unsigned long memaddr)
|
unsigned long eval_mem32(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
|
|
unsigned long temp;
|
unsigned long temp;
|
struct dev_memarea *dev;
|
struct dev_memarea *dev;
|
|
|
|
|
slp_checkaccess(memaddr, SLP_MEMREAD);
|
slp_checkaccess(memaddr, SLP_MEMREAD);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
|
|
return evalsim_mem32(memaddr);
|
return evalsim_mem32(memaddr,breakpoint);
|
}
|
}
|
|
|
unsigned long evalsim_mem32(unsigned long memaddr)
|
unsigned long evalsim_mem32(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
unsigned long temp;
|
unsigned long temp;
|
struct dev_memarea *dev;
|
struct dev_memarea *dev;
|
|
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
Line 279... |
Line 285... |
} else {
|
} else {
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
cont_run = 0;
|
cont_run = 0;
|
temp = 0;
|
temp = 0;
|
}
|
}
|
|
|
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* 28/05/01 CZ */
|
|
|
return temp;
|
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)
|
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
|
|
|
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
|
|
return evalsim_mem16(memaddr);
|
return evalsim_mem16(memaddr,breakpoint);
|
}
|
}
|
|
|
unsigned short evalsim_mem16(unsigned long memaddr)
|
unsigned short evalsim_mem16(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
unsigned short temp;
|
unsigned short temp;
|
|
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
temp = ((unsigned short)(mem[memaddr].data << 8) & 0xff00);
|
temp = ((unsigned short)(mem[memaddr].data << 8) & 0xff00);
|
Line 303... |
Line 315... |
} else {
|
} else {
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
cont_run = 0;
|
cont_run = 0;
|
temp = 0;
|
temp = 0;
|
}
|
}
|
|
|
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* 28/05/01 CZ */
|
|
|
return temp;
|
return temp;
|
}
|
}
|
|
|
|
|
/* Returns 8-bit values from mem array. */
|
/* Returns 8-bit values from mem array. */
|
|
|
unsigned char eval_mem8(unsigned long memaddr)
|
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
|
|
memaddr = simulate_dc_mmu_load(memaddr);
|
memaddr = simulate_dc_mmu_load(memaddr);
|
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
|
|
return evalsim_mem8(memaddr);
|
return evalsim_mem8(memaddr,breakpoint);
|
}
|
}
|
|
|
unsigned char evalsim_mem8(unsigned long memaddr)
|
unsigned char evalsim_mem8(unsigned long memaddr,int* breakpoint)
|
{
|
{
|
|
unsigned char temp;
|
|
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
if (memaddr < (MEMORY_START + MEMORY_LEN)) {
|
return (unsigned char)mem[memaddr].data;
|
temp = (unsigned char)mem[memaddr].data;
|
} else {
|
} else {
|
printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
cont_run = 0;
|
cont_run = 0;
|
return 0;
|
temp = 0;
|
}
|
}
|
|
|
|
*breakpoint += CheckDebugUnit(DebugLoadData,temp); /* 28/05/01 CZ */
|
|
|
|
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)
|
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
|
{
|
{
|
slp_checkaccess(memaddr, SLP_MEMWRITE);
|
slp_checkaccess(memaddr, SLP_MEMWRITE);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
|
*breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr); /* 28/05/01 CZ */
|
|
*breakpoint += CheckDebugUnit(DebugStoreData,value);
|
|
|
setsim_mem32(memaddr, value);
|
setsim_mem32(memaddr, value);
|
|
|
return;
|
return;
|
}
|
}
|
|
|
void setsim_mem32(unsigned long memaddr, unsigned long value)
|
void setsim_mem32(unsigned long memaddr, unsigned long value)
|
{
|
{
|
Line 359... |
Line 386... |
return;
|
return;
|
}
|
}
|
|
|
/* Set mem, 16-bit. Big endian version. */
|
/* Set mem, 16-bit. Big endian version. */
|
|
|
void set_mem16(unsigned long memaddr, unsigned short value)
|
void set_mem16(unsigned long memaddr, unsigned short value,int* breakpoint)
|
{
|
{
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
|
*breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr); /* 28/05/01 CZ */
|
|
*breakpoint += CheckDebugUnit(DebugStoreData,value);
|
|
|
setsim_mem16(memaddr, value);
|
setsim_mem16(memaddr, value);
|
|
|
return;
|
return;
|
}
|
}
|
|
|
void setsim_mem16(unsigned long memaddr, unsigned short value)
|
void setsim_mem16(unsigned long memaddr, unsigned short value)
|
{
|
{
|
Line 382... |
Line 413... |
return;
|
return;
|
}
|
}
|
|
|
/* Set mem, 8-bit. */
|
/* Set mem, 8-bit. */
|
|
|
void set_mem8(unsigned long memaddr, unsigned char value)
|
void set_mem8(unsigned long memaddr, unsigned char value,int* breakpoint)
|
{
|
{
|
memaddr = simulate_dc_mmu_store(memaddr);
|
memaddr = simulate_dc_mmu_store(memaddr);
|
|
|
|
*breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr); /* 28/05/01 CZ */
|
|
*breakpoint += CheckDebugUnit(DebugStoreData,value);
|
|
|
setsim_mem8(memaddr, value);
|
setsim_mem8(memaddr, value);
|
|
|
return;
|
return;
|
}
|
}
|
|
|
void setsim_mem8(unsigned long memaddr, unsigned char value)
|
void setsim_mem8(unsigned long memaddr, unsigned char value)
|
{
|
{
|