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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_52/] [or1ksim/] [cpu/] [common/] [parse.c] - Diff between revs 513 and 694

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

Rev 513 Rev 694
Line 32... Line 32...
#include "sim-config.h"
#include "sim-config.h"
 
 
#define MEMORY_LEN 0x100000000
#define MEMORY_LEN 0x100000000
#define MAXLINE_LEN 18000
#define MAXLINE_LEN 18000
 
 
 
/* Whether to do immediate statistics */
 
#define IMM_STATS 0
 
 
extern char *disassembled;
extern char *disassembled;
 
 
/* Unused mem memory marker. It is used when allocating program and data memory
/* Unused mem memory marker. It is used when allocating program and data memory
   during parsing */
   during parsing */
unsigned int freemem;
unsigned int freemem;
Line 141... Line 144...
  printf("can't translate\n", laddr);
  printf("can't translate\n", laddr);
  exit(1);
  exit(1);
  return -1;
  return -1;
}
}
 
 
 
#if IMM_STATS
 
int bcnt[33] = {0};
 
 
 
int bits (unsigned long val) {
 
  int i = 1;
 
  if (!val) return 0;
 
  while (val != 0 && val != 0xffffffff) {i++;val >>= 1;}
 
  return i;
 
}
 
 
 
void check_insn (unsigned long insn) {
 
  int insn_index = insn_decode (insn);
 
  struct insn_op_struct *opd = op_start[insn_index];
 
  unsigned long data = 0;
 
  int dis = 0;
 
  char *name;
 
  if (!insn || insn_index < 0) return;
 
  name = insn_name (insn_index);
 
  if (strcmp (name, "l.movhi") == 0 || strcmp (name, "l.nop") == 0 || strcmp (name, "l.sys") == 0) return;
 
 
 
  while (1)
 
    {
 
      unsigned long tmp = 0, nbits = 0;
 
      while (1)
 
        {
 
          tmp |= ((insn  >> (opd->type & OPTYPE_SHR)) & ((1 << opd->data) - 1)) << nbits;
 
          nbits += opd->data;
 
          if (opd->type & OPTYPE_OP)
 
            break;
 
          opd++;
 
        }
 
 
 
      /* Do we have to sign extend? */
 
      if (opd->type & OPTYPE_SIG)
 
        {
 
          int sbit = (opd->type & OPTYPE_SBIT) >> OPTYPE_SBIT_SHR;
 
          if (tmp & (1 << sbit))
 
            tmp |= 0xFFFFFFFF << sbit;
 
        }
 
      if (opd->type & OPTYPE_DIS) {
 
        /* We have to read register later.  */
 
        data += tmp;
 
        dis = 1;
 
      } else
 
        {
 
          if (!(opd->type & OPTYPE_REG) || dis) {
 
            if (!dis) data = tmp;
 
            //printf ("%08x %s\n", data, name);
 
            bcnt[bits(data)]++;
 
          }
 
          data = 0;
 
          dis = 0;
 
        }
 
      if(opd->type & OPTYPE_LAST) {
 
        return;
 
      }
 
      opd++;
 
    }
 
}
 
#endif
 
 
char null_str[1] = "\0";
char null_str[1] = "\0";
 
 
/* Modified by CZ 26/05/01 */
 
/* Replaced several calls to translate(freemem) with vaddr */
/* Replaced several calls to translate(freemem) with vaddr */
/* Added new mode execution code */
/* Added new mode execution code */
/* Changed parameters so address can be passed as argument */
/* Changed parameters so address can be passed as argument */
void addprogram(unsigned long address, unsigned long insn, int* breakpoint)
void addprogram(unsigned long address, unsigned long insn, int* breakpoint)
{
{
  char insn_first2_char[3];
  char insn_first2_char[3];
  int vaddr = (!runtime.sim.filename) ? translate(address,breakpoint) : translate(freemem,breakpoint);
  int vaddr = (!runtime.sim.filename) ? translate(address,breakpoint) : translate(freemem,breakpoint);
 
 
  debug(9,"addprogram 1\n");
 
 
 
  setsim_mem32 (vaddr, insn);
  setsim_mem32 (vaddr, insn);
 
#if IMM_STATS
 
  check_insn (insn);
 
#endif
  if(runtime.sim.filename)
  if(runtime.sim.filename)
    freemem += insn_len (insn_decode (insn));
    freemem += insn_len (insn_decode (insn));
}
}
 
 
/* Load big-endian COFF file. At the moment it doesn't load symbols yet. */
/* Load big-endian COFF file.  */
 
 
void readfile_coff(char *filename, short sections)
void readfile_coff(char *filename, short sections)
{
{
  FILE *inputfs;
  FILE *inputfs;
  char inputbuf[4];
  char inputbuf[4];
Line 420... Line 483...
  transl_error = 0;
  transl_error = 0;
  transl_table = virtphy_transl;
  transl_table = virtphy_transl;
  freemem = startaddr;
  freemem = startaddr;
  printf("loadcode: filename %s  startaddr=%x  virtphy_transl=%x", filename, startaddr, virtphy_transl);
  printf("loadcode: filename %s  startaddr=%x  virtphy_transl=%x", filename, startaddr, virtphy_transl);
  identifyfile(filename);
  identifyfile(filename);
 
 
 
#if IMM_STATS  
 
  {
 
    int i = 0;
 
    for (i = 0; i < 33; i++) printf ("%i:%i\t", i, bcnt[i]);
 
    printf ("\n");
 
  }
 
#endif
 
 
  if (transl_error)
  if (transl_error)
    return -1;
    return -1;
  else
  else
    return translate(freemem,&breakpoint);
    return translate(freemem,&breakpoint);
 
 
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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