OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_42/] [or1ksim/] [cpu/] [common/] [abstract.c] - Diff between revs 102 and 123

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 102 Rev 123
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)
{
{

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.