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 557 and 560

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

Rev 557 Rev 560
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);
  }
  }

powered by: WebSVN 2.1.0

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