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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [cpu/] [common/] [parse.c] - Diff between revs 1419 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 1419 Rev 1765
/* parce.c -- Architecture independent load
/* parce.c -- Architecture independent load
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
 
 
This file is part of OpenRISC 1000 Architectural Simulator.
This file is part of OpenRISC 1000 Architectural Simulator.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 
#include <stdio.h>
#include <stdio.h>
#include <ctype.h>
#include <ctype.h>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
 
 
#include "config.h"
#include "config.h"
 
 
#ifdef HAVE_INTTYPES_H
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#include <inttypes.h>
#endif
#endif
 
 
#include "port.h"
#include "port.h"
#include "arch.h"
#include "arch.h"
#include "abstract.h"
#include "abstract.h"
#include "dmmu.h"
#include "dmmu.h"
#include "coff.h"
#include "coff.h"
#include "elf.h"
#include "elf.h"
#include "debug_unit.h"
#include "debug_unit.h"
#include "opcode/or32.h"
#include "opcode/or32.h"
#include "parse.h"
#include "parse.h"
#include "sim-config.h"
#include "sim-config.h"
#include "labels.h"
#include "labels.h"
#include "debug.h"
#include "debug.h"
 
 
#define MEMORY_LEN 0x100000000
#define MEMORY_LEN 0x100000000
#define MAXLINE_LEN 18000
#define MAXLINE_LEN 18000
 
 
/* Whether to do immediate statistics */
/* Whether to do immediate statistics */
#define IMM_STATS 0
#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;
 
 
/* Translation table provided by microkernel. Only used if simulating microkernel. */
/* Translation table provided by microkernel. Only used if simulating microkernel. */
static oraddr_t transl_table;
static oraddr_t transl_table;
 
 
/* Used to signal whether during loading of programs a translation fault occured. */
/* Used to signal whether during loading of programs a translation fault occured. */
static unsigned long transl_error;
static unsigned long transl_error;
 
 
char *
char *
stripwhite (string)
stripwhite (string)
     char *string;
     char *string;
{
{
  register char *s, *t;
  register char *s, *t;
 
 
  for (s = string; whitespace (*s); s++)
  for (s = string; whitespace (*s); s++)
    ;
    ;
 
 
  if (*s == 0)
  if (*s == 0)
    return (s);
    return (s);
 
 
  t = s + strlen (s) - 1;
  t = s + strlen (s) - 1;
  while (t > s && whitespace (*t))
  while (t > s && whitespace (*t))
    t--;
    t--;
  *++t = '\0';
  *++t = '\0';
 
 
  return s;
  return s;
}
}
 
 
/* This function is very similar to strncpy, except it null terminates the string */
/* This function is very similar to strncpy, except it null terminates the string */
char *strstrip (char *dst, const char *src, int n)
char *strstrip (char *dst, const char *src, int n)
{
{
  strncpy (dst, src, n);
  strncpy (dst, src, n);
  *(dst + n) = '\0';
  *(dst + n) = '\0';
  return dst;
  return dst;
}
}
 
 
/* Used only by the simulator loader to translate logical addresses into physical.
/* Used only by the simulator loader to translate logical addresses into physical.
   If loadcode() is called with valid virtphy_transl pointer to a table of
   If loadcode() is called with valid virtphy_transl pointer to a table of
   translations then translate() performs translation otherwise phy address is
   translations then translate() performs translation otherwise phy address is
   equal to logical. */
   equal to logical. */
static oraddr_t translate(oraddr_t laddr,int* breakpoint)
static oraddr_t translate(oraddr_t laddr,int* breakpoint)
{
{
  int i;
  int i;
 
 
  /* No translation (i.e. when loading kernel into simulator) */
  /* No translation (i.e. when loading kernel into simulator) */
/*  PRINTF("transl_table=%x  laddr=%x\n", transl_table, laddr);
/*  PRINTF("transl_table=%x  laddr=%x\n", transl_table, laddr);
  PRINTF("laddr=%x\n", laddr);*/
  PRINTF("laddr=%x\n", laddr);*/
  if (transl_table == 0)
  if (transl_table == 0)
    return laddr;
    return laddr;
 
 
  /* Try to find our translation in the table. */
  /* Try to find our translation in the table. */
  for(i = 0; i < (MEMORY_LEN / PAGE_SIZE) * 16; i += 16)
  for(i = 0; i < (MEMORY_LEN / PAGE_SIZE) * 16; i += 16)
    if ((laddr & ~(PAGE_SIZE - 1)) == evalsim_mem32(transl_table + i)) {
    if ((laddr & ~(PAGE_SIZE - 1)) == evalsim_mem32(transl_table + i)) {
      setsim_mem32(transl_table + i + 8, -2); /* Page modified */
      setsim_mem32(transl_table + i + 8, -2); /* Page modified */
      PRINTF("found paddr=%"PRIx32"\n",
      PRINTF("found paddr=%"PRIx32"\n",
             evalsim_mem32(transl_table + i + 4) | (laddr & (PAGE_SIZE - 1)));
             evalsim_mem32(transl_table + i + 4) | (laddr & (PAGE_SIZE - 1)));
      return (oraddr_t)evalsim_mem32(transl_table + i + 4) | (laddr & (oraddr_t)(PAGE_SIZE - 1));
      return (oraddr_t)evalsim_mem32(transl_table + i + 4) | (laddr & (oraddr_t)(PAGE_SIZE - 1));
    }
    }
 
 
  /* Allocate new phy page for us. */
  /* Allocate new phy page for us. */
  for(i = 0; i < (MEMORY_LEN / PAGE_SIZE) * 16; i += 16)
  for(i = 0; i < (MEMORY_LEN / PAGE_SIZE) * 16; i += 16)
    if (evalsim_mem32(transl_table + i + 8) == 0) {
    if (evalsim_mem32(transl_table + i + 8) == 0) {
      setsim_mem32(transl_table + i, laddr & ~(PAGE_SIZE - 1)); /* VPN */
      setsim_mem32(transl_table + i, laddr & ~(PAGE_SIZE - 1)); /* VPN */
      setsim_mem32(transl_table + i + 4, (i/16) * PAGE_SIZE); /* PPN */
      setsim_mem32(transl_table + i + 4, (i/16) * PAGE_SIZE); /* PPN */
      setsim_mem32(transl_table + i + 8, -2); /* Page modified */
      setsim_mem32(transl_table + i + 8, -2); /* Page modified */
      PRINTF("newly allocated ppn=%"PRIx32"\n",
      PRINTF("newly allocated ppn=%"PRIx32"\n",
             evalsim_mem32(transl_table + i + 4));
             evalsim_mem32(transl_table + i + 4));
      PRINTF("newly allocated .ppn=%"PRIxADDR"\n", transl_table + i + 4);
      PRINTF("newly allocated .ppn=%"PRIxADDR"\n", transl_table + i + 4);
      PRINTF("newly allocated ofs=%"PRIxADDR"\n", (laddr & (PAGE_SIZE - 1)));
      PRINTF("newly allocated ofs=%"PRIxADDR"\n", (laddr & (PAGE_SIZE - 1)));
      PRINTF("newly allocated paddr=%"PRIx32"\n",
      PRINTF("newly allocated paddr=%"PRIx32"\n",
             evalsim_mem32(transl_table + i + 4) | (laddr & (PAGE_SIZE - 1)));
             evalsim_mem32(transl_table + i + 4) | (laddr & (PAGE_SIZE - 1)));
      return (oraddr_t)evalsim_mem32(transl_table + i + 4) | (laddr & (oraddr_t)(PAGE_SIZE - 1));
      return (oraddr_t)evalsim_mem32(transl_table + i + 4) | (laddr & (oraddr_t)(PAGE_SIZE - 1));
    }
    }
  /* If we come this far then all phy memory is used and we can't find our page
  /* If we come this far then all phy memory is used and we can't find our page
     nor allocate new page. */
     nor allocate new page. */
  transl_error = 1;
  transl_error = 1;
 
 
  PRINTF("can't translate %"PRIxADDR"\n", laddr);
  PRINTF("can't translate %"PRIxADDR"\n", laddr);
  exit(1);
  exit(1);
  return -1;
  return -1;
}
}
 
 
#if IMM_STATS
#if IMM_STATS
int bcnt[33][3] = {0};
int bcnt[33][3] = {0};
int bsum[3] = {0};
int bsum[3] = {0};
unsigned long movhi = 0;
unsigned long movhi = 0;
 
 
int bits (unsigned long val) {
int bits (unsigned long val) {
  int i = 1;
  int i = 1;
  if (!val) return 0;
  if (!val) return 0;
  while (val != 0 && (signed long)val != -1) {i++; val = (signed long)val >> 1;}
  while (val != 0 && (signed long)val != -1) {i++; val = (signed long)val >> 1;}
  return i;
  return i;
}
}
 
 
void check_insn (uint32_t insn) {
void check_insn (uint32_t insn) {
  int insn_index = insn_decode (insn);
  int insn_index = insn_decode (insn);
  struct insn_op_struct *opd = op_start[insn_index];
  struct insn_op_struct *opd = op_start[insn_index];
  uint32_t data = 0;
  uint32_t data = 0;
  int dis = 0;
  int dis = 0;
  const char *name;
  const char *name;
  if (!insn || insn_index < 0) return;
  if (!insn || insn_index < 0) return;
  name = insn_name (insn_index);
  name = insn_name (insn_index);
  if (strcmp (name, "l.nop") == 0 || strcmp (name, "l.sys") == 0) return;
  if (strcmp (name, "l.nop") == 0 || strcmp (name, "l.sys") == 0) return;
 
 
  while (1)
  while (1)
    {
    {
      uint32_t tmp = 0
      uint32_t tmp = 0
      unsigned int nbits = 0;
      unsigned int nbits = 0;
      while (1)
      while (1)
        {
        {
          tmp |= ((insn >> (opd->type & OPTYPE_SHR)) & ((1 << opd->data) - 1)) << nbits;
          tmp |= ((insn >> (opd->type & OPTYPE_SHR)) & ((1 << opd->data) - 1)) << nbits;
          nbits += opd->data;
          nbits += opd->data;
          if (opd->type & OPTYPE_OP)
          if (opd->type & OPTYPE_OP)
            break;
            break;
          opd++;
          opd++;
        }
        }
 
 
      /* Do we have to sign extend? */
      /* Do we have to sign extend? */
      if (opd->type & OPTYPE_SIG)
      if (opd->type & OPTYPE_SIG)
        {
        {
          int sbit = (opd->type & OPTYPE_SBIT) >> OPTYPE_SBIT_SHR;
          int sbit = (opd->type & OPTYPE_SBIT) >> OPTYPE_SBIT_SHR;
          if (tmp & (1 << sbit))
          if (tmp & (1 << sbit))
            tmp |= 0xFFFFFFFF << sbit;
            tmp |= 0xFFFFFFFF << sbit;
        }
        }
      if (opd->type & OPTYPE_DIS) {
      if (opd->type & OPTYPE_DIS) {
        /* We have to read register later.  */
        /* We have to read register later.  */
        data += tmp;
        data += tmp;
        dis = 1;
        dis = 1;
      } else
      } else
        {
        {
          if (!(opd->type & OPTYPE_REG) || dis) {
          if (!(opd->type & OPTYPE_REG) || dis) {
            if (!dis) data = tmp;
            if (!dis) data = tmp;
            if (strcmp (name, "l.movhi") == 0) {
            if (strcmp (name, "l.movhi") == 0) {
              movhi = data << 16;
              movhi = data << 16;
            } else {
            } else {
              data |= movhi;
              data |= movhi;
              //PRINTF ("%08x %s\n", data, name);
              //PRINTF ("%08x %s\n", data, name);
              if (!(or32_opcodes[insn_index].flags & OR32_IF_DELAY)) {
              if (!(or32_opcodes[insn_index].flags & OR32_IF_DELAY)) {
                bcnt[bits(data)][0]++; bsum[0]++;
                bcnt[bits(data)][0]++; bsum[0]++;
              } else {
              } else {
                if (strcmp (name, "l.bf") == 0 || strcmp (name, "l.bnf") == 0) {
                if (strcmp (name, "l.bf") == 0 || strcmp (name, "l.bnf") == 0) {
                  bcnt[bits(data)][1]++; bsum[1]++;
                  bcnt[bits(data)][1]++; bsum[1]++;
                } else {
                } else {
                  bcnt[bits(data)][2]++; bsum[2]++;
                  bcnt[bits(data)][2]++; bsum[2]++;
                }
                }
              }
              }
            }
            }
          }
          }
          data = 0;
          data = 0;
          dis = 0;
          dis = 0;
        }
        }
      if(opd->type & OPTYPE_LAST) {
      if(opd->type & OPTYPE_LAST) {
        return;
        return;
      }
      }
      opd++;
      opd++;
    }
    }
}
}
#endif
#endif
 
 
/* 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(oraddr_t address, uint32_t insn, int* breakpoint)
void addprogram(oraddr_t address, uint32_t insn, int* breakpoint)
{
{
  int vaddr = (!runtime.sim.filename) ? translate(address,breakpoint) : translate(freemem,breakpoint);
  int vaddr = (!runtime.sim.filename) ? translate(address,breakpoint) : translate(freemem,breakpoint);
 
 
  setsim_mem32 (vaddr, insn);
  setsim_mem32 (vaddr, insn);
#if IMM_STATS
#if IMM_STATS
  check_insn (insn);
  check_insn (insn);
#endif
#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.  */
/* 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];
  uint32_t insn;
  uint32_t insn;
  signed long sectsize;
  signed long sectsize;
  COFF_AOUTHDR coffaouthdr;
  COFF_AOUTHDR coffaouthdr;
  struct COFF_scnhdr coffscnhdr;
  struct COFF_scnhdr coffscnhdr;
  int len;
  int len;
  int firstthree = 0;
  int firstthree = 0;
  int breakpoint = 0;
  int breakpoint = 0;
 
 
  if (!(inputfs = fopen(filename, "r"))) {
  if (!(inputfs = fopen(filename, "r"))) {
    perror("readfile_coff");
    perror("readfile_coff");
    exit(1);
    exit(1);
  }
  }
 
 
  if (fseek(inputfs, sizeof(struct COFF_filehdr), SEEK_SET) == -1) {
  if (fseek(inputfs, sizeof(struct COFF_filehdr), SEEK_SET) == -1) {
    fclose(inputfs);
    fclose(inputfs);
    perror("readfile_coff");
    perror("readfile_coff");
    exit(1);
    exit(1);
  }
  }
 
 
  if (fread(&coffaouthdr, sizeof(coffaouthdr), 1, inputfs) != 1) {
  if (fread(&coffaouthdr, sizeof(coffaouthdr), 1, inputfs) != 1) {
    fclose(inputfs);
    fclose(inputfs);
    perror("readfile_coff");
    perror("readfile_coff");
    exit(1);
    exit(1);
  }
  }
 
 
  while(sections--) {
  while(sections--) {
    long scnhdr_pos = sizeof(struct COFF_filehdr) + sizeof(coffaouthdr)
    long scnhdr_pos = sizeof(struct COFF_filehdr) + sizeof(coffaouthdr)
        + sizeof(struct COFF_scnhdr) * firstthree;
        + sizeof(struct COFF_scnhdr) * firstthree;
    if (fseek(inputfs, scnhdr_pos, SEEK_SET) == -1) {
    if (fseek(inputfs, scnhdr_pos, SEEK_SET) == -1) {
      fclose(inputfs);
      fclose(inputfs);
      perror("readfile_coff");
      perror("readfile_coff");
      exit(1);
      exit(1);
    }
    }
    if (fread(&coffscnhdr, sizeof(struct COFF_scnhdr), 1, inputfs) != 1) {
    if (fread(&coffscnhdr, sizeof(struct COFF_scnhdr), 1, inputfs) != 1) {
      fclose(inputfs);
      fclose(inputfs);
      perror("readfile_coff");
      perror("readfile_coff");
      exit(1);
      exit(1);
    }
    }
    PRINTF("Section: %s,", coffscnhdr.s_name);
    PRINTF("Section: %s,", coffscnhdr.s_name);
    PRINTF(" paddr: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_paddr));
    PRINTF(" paddr: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_paddr));
    PRINTF(" vaddr: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_vaddr));
    PRINTF(" vaddr: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_vaddr));
    PRINTF(" size: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_size));
    PRINTF(" size: 0x%.8lx,", COFF_LONG_H(coffscnhdr.s_size));
    PRINTF(" scnptr: 0x%.8lx\n", COFF_LONG_H(coffscnhdr.s_scnptr));
    PRINTF(" scnptr: 0x%.8lx\n", COFF_LONG_H(coffscnhdr.s_scnptr));
 
 
    sectsize = COFF_LONG_H(coffscnhdr.s_size);
    sectsize = COFF_LONG_H(coffscnhdr.s_size);
#if 0
#if 0
    /* A couple of sanity checks. */
    /* A couple of sanity checks. */
    if (translate(COFF_LONG_H(coffscnhdr.s_vaddr),&breakpoint) < MEMORY_START) {
    if (translate(COFF_LONG_H(coffscnhdr.s_vaddr),&breakpoint) < MEMORY_START) {
      PRINTF("Section %s starts out of ", coffscnhdr.s_name);
      PRINTF("Section %s starts out of ", coffscnhdr.s_name);
      PRINTF("memory (at %x)\n", COFF_LONG_H(coffscnhdr.s_vaddr));
      PRINTF("memory (at %x)\n", COFF_LONG_H(coffscnhdr.s_vaddr));
      exit(1);
      exit(1);
    }
    }
    if (translate(COFF_LONG_H(coffscnhdr.s_vaddr) + sectsize,&breakpoint) >
    if (translate(COFF_LONG_H(coffscnhdr.s_vaddr) + sectsize,&breakpoint) >
        MEMORY_START + MEMORY_LEN) {
        MEMORY_START + MEMORY_LEN) {
      PRINTF("Section %s ends out of ", coffscnhdr.s_name);
      PRINTF("Section %s ends out of ", coffscnhdr.s_name);
      PRINTF("memory.\n");
      PRINTF("memory.\n");
      exit(1);
      exit(1);
    }
    }
#endif
#endif
#if 0
#if 0
    if (++firstthree == 1 && strcmp(coffscnhdr.s_name, ".text") != 0) {
    if (++firstthree == 1 && strcmp(coffscnhdr.s_name, ".text") != 0) {
      PRINTF("First section should be .text (%s instead)\n", coffscnhdr.s_name);
      PRINTF("First section should be .text (%s instead)\n", coffscnhdr.s_name);
      exit(1);
      exit(1);
    }
    }
    if (firstthree == 2 && strcmp(coffscnhdr.s_name, ".data") != 0) {
    if (firstthree == 2 && strcmp(coffscnhdr.s_name, ".data") != 0) {
      PRINTF("Second section should be .data (%s instead)\n", coffscnhdr.s_name);
      PRINTF("Second section should be .data (%s instead)\n", coffscnhdr.s_name);
      exit(1);
      exit(1);
    }
    }
    if (firstthree == 3 && strcmp(coffscnhdr.s_name, ".bss") != 0) {
    if (firstthree == 3 && strcmp(coffscnhdr.s_name, ".bss") != 0) {
      PRINTF("Third section should be .bss (%s instead)\n", coffscnhdr.s_name);
      PRINTF("Third section should be .bss (%s instead)\n", coffscnhdr.s_name);
      exit(1);
      exit(1);
    }
    }
#else
#else
    ++firstthree;
    ++firstthree;
#endif
#endif
 
 
    /* loading section */
    /* loading section */
    freemem = COFF_LONG_H(coffscnhdr.s_paddr);
    freemem = COFF_LONG_H(coffscnhdr.s_paddr);
    debug(2,"Starting to load at 0x%x\n", freemem);
    debug(2,"Starting to load at 0x%x\n", freemem);
    if (fseek(inputfs, COFF_LONG_H(coffscnhdr.s_scnptr), SEEK_SET) == -1) {
    if (fseek(inputfs, COFF_LONG_H(coffscnhdr.s_scnptr), SEEK_SET) == -1) {
      fclose(inputfs);
      fclose(inputfs);
      perror("readfile_coff");
      perror("readfile_coff");
      exit(1);
      exit(1);
    }
    }
    while (sectsize > 0 && (len = fread(&inputbuf, sizeof(inputbuf), 1, inputfs))) {
    while (sectsize > 0 && (len = fread(&inputbuf, sizeof(inputbuf), 1, inputfs))) {
      insn = COFF_LONG_H(inputbuf);
      insn = COFF_LONG_H(inputbuf);
      len = insn_len (insn_decode (insn));
      len = insn_len (insn_decode (insn));
      if (len == 2)
      if (len == 2)
        {
        {
          fseek(inputfs, -2, SEEK_CUR);
          fseek(inputfs, -2, SEEK_CUR);
          debug(8,"readfile_coff: %lx 0x%x   \n", sectsize, insn >> 16);
          debug(8,"readfile_coff: %lx 0x%x   \n", sectsize, insn >> 16);
        }
        }
      else
      else
        debug(8,"readfile_coff: %lx 0x%x   \n", sectsize, insn);
        debug(8,"readfile_coff: %lx 0x%x   \n", sectsize, insn);
      addprogram (freemem, insn, &breakpoint);
      addprogram (freemem, insn, &breakpoint);
      sectsize -= len;
      sectsize -= len;
    }
    }
  }
  }
  if (firstthree < 3) {
  if (firstthree < 3) {
    PRINTF("One or more missing sections. At least");
    PRINTF("One or more missing sections. At least");
    PRINTF(" three sections expected (.text, .data, .bss).\n");
    PRINTF(" three sections expected (.text, .data, .bss).\n");
    exit(1);
    exit(1);
  }
  }
  if (firstthree > 3) {
  if (firstthree > 3) {
    PRINTF("Warning: one or more extra sections. These");
    PRINTF("Warning: one or more extra sections. These");
    PRINTF(" sections were handled as .data sections.\n");
    PRINTF(" sections were handled as .data sections.\n");
  }
  }
 
 
  fclose(inputfs);
  fclose(inputfs);
  PRINTF("Finished loading COFF.\n");
  PRINTF("Finished loading COFF.\n");
  return;
  return;
}
}
 
 
/* Load symbols from big-endian COFF file. */
/* Load symbols from big-endian COFF file. */
 
 
void readsyms_coff(char *filename, unsigned long symptr, long syms)
void readsyms_coff(char *filename, unsigned long symptr, long syms)
{
{
  FILE *inputfs;
  FILE *inputfs;
  struct COFF_syment coffsymhdr;
  struct COFF_syment coffsymhdr;
  int count = 0;
  int count = 0;
  long nsyms = syms;
  long nsyms = syms;
  if (!(inputfs = fopen(filename, "r"))) {
  if (!(inputfs = fopen(filename, "r"))) {
    perror("readsyms_coff");
    perror("readsyms_coff");
    exit(1);
    exit(1);
  }
  }
 
 
  if (fseek(inputfs, symptr, SEEK_SET) == -1) {
  if (fseek(inputfs, symptr, SEEK_SET) == -1) {
    fclose(inputfs);
    fclose(inputfs);
    perror("readsyms_coff");
    perror("readsyms_coff");
    exit(1);
    exit(1);
  }
  }
 
 
  while(syms--) {
  while(syms--) {
    int i, n;
    int i, n;
    if (fread(&coffsymhdr, COFF_SYMESZ, 1, inputfs) != 1) {
    if (fread(&coffsymhdr, COFF_SYMESZ, 1, inputfs) != 1) {
      fclose(inputfs);
      fclose(inputfs);
      perror("readsyms_coff");
      perror("readsyms_coff");
      exit(1);
      exit(1);
    }
    }
 
 
    n = (unsigned char)coffsymhdr.e_numaux[0];
    n = (unsigned char)coffsymhdr.e_numaux[0];
 
 
    /* check whether this symbol belongs to a section and is external symbol; ignore all others */
    /* check whether this symbol belongs to a section and is external symbol; ignore all others */
    if (COFF_SHORT_H(coffsymhdr.e_scnum) >= 0 && coffsymhdr.e_sclass[0] == C_EXT) {
    if (COFF_SHORT_H(coffsymhdr.e_scnum) >= 0 && coffsymhdr.e_sclass[0] == C_EXT) {
#if 0
#if 0
    /* If not important or not in text, skip. */
    /* If not important or not in text, skip. */
    if(COFF_SHORT_H(coffsymhdr.e_type) & COFF_N_TMASK & COFF_STYP_TEXT) {
    if(COFF_SHORT_H(coffsymhdr.e_type) & COFF_N_TMASK & COFF_STYP_TEXT) {
#endif
#endif
 
 
      if (*((unsigned long *)coffsymhdr.e.e.e_zeroes)) {
      if (*((unsigned long *)coffsymhdr.e.e.e_zeroes)) {
        if (strlen(coffsymhdr.e.e_name) && strlen(coffsymhdr.e.e_name) < 9)
        if (strlen(coffsymhdr.e.e_name) && strlen(coffsymhdr.e.e_name) < 9)
          add_label(COFF_LONG_H(coffsymhdr.e_value), coffsymhdr.e.e_name);
          add_label(COFF_LONG_H(coffsymhdr.e_value), coffsymhdr.e.e_name);
        debug(8, "[%i] Symbol: %s,", count++, coffsymhdr.e.e_name);
        debug(8, "[%i] Symbol: %s,", count++, coffsymhdr.e.e_name);
      } else {
      } else {
        long fpos = ftell (inputfs);
        long fpos = ftell (inputfs);
 
 
        if (fseek(inputfs, symptr + nsyms * COFF_SYMESZ + COFF_LONG_H(coffsymhdr.e.e.e_offset), SEEK_SET) == 0) {
        if (fseek(inputfs, symptr + nsyms * COFF_SYMESZ + COFF_LONG_H(coffsymhdr.e.e.e_offset), SEEK_SET) == 0) {
          char tmp[33], *s = &tmp[0];
          char tmp[33], *s = &tmp[0];
          while (s != &tmp[32])
          while (s != &tmp[32])
            if ((*(s++) = fgetc(inputfs)) == 0) break;
            if ((*(s++) = fgetc(inputfs)) == 0) break;
          tmp[32] = 0;
          tmp[32] = 0;
          add_label(COFF_LONG_H(coffsymhdr.e_value), &tmp[0]);
          add_label(COFF_LONG_H(coffsymhdr.e_value), &tmp[0]);
          debug(8, "[%i] Symbol: %s,", count++, &tmp[0]);
          debug(8, "[%i] Symbol: %s,", count++, &tmp[0]);
        }
        }
        fseek(inputfs, fpos, SEEK_SET);
        fseek(inputfs, fpos, SEEK_SET);
      }
      }
 
 
      debug(9, " val: 0x%.8lx,", COFF_LONG_H(coffsymhdr.e_value));
      debug(9, " val: 0x%.8lx,", COFF_LONG_H(coffsymhdr.e_value));
      debug(9, " type: %x, %x, auxs: %i\n", COFF_SHORT_H(coffsymhdr.e_type), *((unsigned short *)coffsymhdr.e_type), n);
      debug(9, " type: %x, %x, auxs: %i\n", COFF_SHORT_H(coffsymhdr.e_type), *((unsigned short *)coffsymhdr.e_type), n);
    }
    }
 
 
    for (i = 0; i < n; i++)
    for (i = 0; i < n; i++)
      if (fread(&coffsymhdr, COFF_SYMESZ, 1, inputfs) != 1) {
      if (fread(&coffsymhdr, COFF_SYMESZ, 1, inputfs) != 1) {
        fclose(inputfs);
        fclose(inputfs);
        perror("readsyms_coff3");
        perror("readsyms_coff3");
        exit(1);
        exit(1);
      }
      }
    syms -= n;
    syms -= n;
    count += n;
    count += n;
  }
  }
 
 
  fclose(inputfs);
  fclose(inputfs);
  PRINTF("Finished loading symbols.\n");
  PRINTF("Finished loading symbols.\n");
  return;
  return;
}
}
 
 
void readfile_elf(char *filename)
void readfile_elf(char *filename)
{
{
 
 
  FILE *inputfs;
  FILE *inputfs;
  struct elf32_hdr elfhdr;
  struct elf32_hdr elfhdr;
  struct elf32_phdr *elf_phdata;
  struct elf32_phdr *elf_phdata;
  struct elf32_shdr *elf_spnt, *elf_shdata;
  struct elf32_shdr *elf_spnt, *elf_shdata;
  struct elf32_sym *sym_tbl = (struct elf32_sym *)0;
  struct elf32_sym *sym_tbl = (struct elf32_sym *)0;
  unsigned long syms = 0;
  unsigned long syms = 0;
  char *str_tbl = (char *)0;
  char *str_tbl = (char *)0;
  char *s_str = (char *)0;
  char *s_str = (char *)0;
  int breakpoint = 0;
  int breakpoint = 0;
  unsigned long inputbuf;
  unsigned long inputbuf;
  unsigned long padd;
  unsigned long padd;
  uint32_t insn;
  uint32_t insn;
  int i, j, sectsize, len;
  int i, j, sectsize, len;
 
 
  if (!(inputfs = fopen(filename, "r"))) {
  if (!(inputfs = fopen(filename, "r"))) {
    perror("readfile_elf");
    perror("readfile_elf");
    exit(1);
    exit(1);
  }
  }
 
 
  if (fread(&elfhdr, sizeof(elfhdr), 1, inputfs) != 1) {
  if (fread(&elfhdr, sizeof(elfhdr), 1, inputfs) != 1) {
    perror("readfile_elf");
    perror("readfile_elf");
    exit(1);
    exit(1);
  }
  }
 
 
  if ((elf_shdata = (struct elf32_shdr *)malloc(ELF_SHORT_H(elfhdr.e_shentsize) * ELF_SHORT_H(elfhdr.e_shnum))) == NULL) {
  if ((elf_shdata = (struct elf32_shdr *)malloc(ELF_SHORT_H(elfhdr.e_shentsize) * ELF_SHORT_H(elfhdr.e_shnum))) == NULL) {
     perror("readfile_elf");
     perror("readfile_elf");
     exit(1);
     exit(1);
  }
  }
 
 
  if (fseek(inputfs, ELF_LONG_H(elfhdr.e_shoff), SEEK_SET) != 0) {
  if (fseek(inputfs, ELF_LONG_H(elfhdr.e_shoff), SEEK_SET) != 0) {
    perror("readfile_elf");
    perror("readfile_elf");
    exit(1);
    exit(1);
  }
  }
 
 
  if (fread(elf_shdata, ELF_SHORT_H(elfhdr.e_shentsize) * ELF_SHORT_H(elfhdr.e_shnum), 1, inputfs) != 1) {
  if (fread(elf_shdata, ELF_SHORT_H(elfhdr.e_shentsize) * ELF_SHORT_H(elfhdr.e_shnum), 1, inputfs) != 1) {
    perror("readfile_elf");
    perror("readfile_elf");
    exit(1);
    exit(1);
  }
  }
 
 
  if (ELF_LONG_H(elfhdr.e_phoff)) {
  if (ELF_LONG_H(elfhdr.e_phoff)) {
 
 
    if((elf_phdata = (struct elf32_phdr *)malloc(ELF_SHORT_H(elfhdr.e_phnum) * ELF_SHORT_H(elfhdr.e_phentsize))) == NULL) {
    if((elf_phdata = (struct elf32_phdr *)malloc(ELF_SHORT_H(elfhdr.e_phnum) * ELF_SHORT_H(elfhdr.e_phentsize))) == NULL) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
 
 
    if (fseek(inputfs, ELF_LONG_H(elfhdr.e_phoff), SEEK_SET) != 0) {
    if (fseek(inputfs, ELF_LONG_H(elfhdr.e_phoff), SEEK_SET) != 0) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
 
 
    if (fread(elf_phdata, ELF_SHORT_H(elfhdr.e_phnum) * ELF_SHORT_H(elfhdr.e_phentsize), 1, inputfs) != 1) {
    if (fread(elf_phdata, ELF_SHORT_H(elfhdr.e_phnum) * ELF_SHORT_H(elfhdr.e_phentsize), 1, inputfs) != 1) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
  }
  }
 
 
  for(i = 0, elf_spnt = elf_shdata; i < ELF_SHORT_H(elfhdr.e_shnum); i++, elf_spnt++) {
  for(i = 0, elf_spnt = elf_shdata; i < ELF_SHORT_H(elfhdr.e_shnum); i++, elf_spnt++) {
 
 
    if(ELF_LONG_H(elf_spnt->sh_type) == SHT_STRTAB) {
    if(ELF_LONG_H(elf_spnt->sh_type) == SHT_STRTAB) {
 
 
      if((str_tbl = (char *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
      if((str_tbl = (char *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      if (fread(str_tbl, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
      if (fread(str_tbl, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
    }
    }
    else if(ELF_LONG_H(elf_spnt->sh_type) == SHT_SYMTAB) {
    else if(ELF_LONG_H(elf_spnt->sh_type) == SHT_SYMTAB) {
 
 
      if((sym_tbl = (struct elf32_sym *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
      if((sym_tbl = (struct elf32_sym *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      if (fread(sym_tbl, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
      if (fread(sym_tbl, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      syms = ELF_LONG_H(elf_spnt->sh_size) / ELF_LONG_H(elf_spnt->sh_entsize);
      syms = ELF_LONG_H(elf_spnt->sh_size) / ELF_LONG_H(elf_spnt->sh_entsize);
    }
    }
  }
  }
 
 
  if (ELF_SHORT_H(elfhdr.e_shstrndx) != SHN_UNDEF) {
  if (ELF_SHORT_H(elfhdr.e_shstrndx) != SHN_UNDEF) {
    elf_spnt = &elf_shdata[ELF_SHORT_H(elfhdr.e_shstrndx)];
    elf_spnt = &elf_shdata[ELF_SHORT_H(elfhdr.e_shstrndx)];
 
 
    if((s_str = (char *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
    if((s_str = (char *)malloc(ELF_LONG_H(elf_spnt->sh_size))) == NULL) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
 
 
    if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
    if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
 
 
    if (fread(s_str, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
    if (fread(s_str, ELF_LONG_H(elf_spnt->sh_size), 1, inputfs) != 1) {
      perror("readfile_elf");
      perror("readfile_elf");
      exit(1);
      exit(1);
    }
    }
  }
  }
 
 
 
 
  for(i = 0, elf_spnt = elf_shdata; i < ELF_SHORT_H(elfhdr.e_shnum); i++, elf_spnt++) {
  for(i = 0, elf_spnt = elf_shdata; i < ELF_SHORT_H(elfhdr.e_shnum); i++, elf_spnt++) {
 
 
    if((ELF_LONG_H(elf_spnt->sh_type) & SHT_PROGBITS) && (ELF_LONG_H(elf_spnt->sh_flags) & SHF_ALLOC)) {
    if((ELF_LONG_H(elf_spnt->sh_type) & SHT_PROGBITS) && (ELF_LONG_H(elf_spnt->sh_flags) & SHF_ALLOC)) {
 
 
      padd = ELF_LONG_H(elf_spnt->sh_addr);
      padd = ELF_LONG_H(elf_spnt->sh_addr);
      for(j = 0; j < ELF_SHORT_H(elfhdr.e_phnum); j++) {
      for(j = 0; j < ELF_SHORT_H(elfhdr.e_phnum); j++) {
        if(ELF_LONG_H(elf_phdata[j].p_offset) &&
        if(ELF_LONG_H(elf_phdata[j].p_offset) &&
           ELF_LONG_H(elf_phdata[j].p_offset) <= ELF_LONG_H(elf_spnt->sh_offset) &&
           ELF_LONG_H(elf_phdata[j].p_offset) <= ELF_LONG_H(elf_spnt->sh_offset) &&
          (ELF_LONG_H(elf_phdata[j].p_offset) + ELF_LONG_H(elf_phdata[j].p_memsz)) > ELF_LONG_H(elf_spnt->sh_offset))
          (ELF_LONG_H(elf_phdata[j].p_offset) + ELF_LONG_H(elf_phdata[j].p_memsz)) > ELF_LONG_H(elf_spnt->sh_offset))
          padd = ELF_LONG_H(elf_phdata[j].p_paddr) + ELF_LONG_H(elf_spnt->sh_offset) - ELF_LONG_H(elf_phdata[j].p_offset);
          padd = ELF_LONG_H(elf_phdata[j].p_paddr) + ELF_LONG_H(elf_spnt->sh_offset) - ELF_LONG_H(elf_phdata[j].p_offset);
      }
      }
 
 
 
 
 
 
      if (ELF_LONG_H(elf_spnt->sh_name) && s_str)
      if (ELF_LONG_H(elf_spnt->sh_name) && s_str)
        PRINTF("Section: %s,", &s_str[ELF_LONG_H(elf_spnt->sh_name)]);
        PRINTF("Section: %s,", &s_str[ELF_LONG_H(elf_spnt->sh_name)]);
      else
      else
        PRINTF("Section: noname,");
        PRINTF("Section: noname,");
      PRINTF(" vaddr: 0x%.8lx,", ELF_LONG_H(elf_spnt->sh_addr));
      PRINTF(" vaddr: 0x%.8lx,", ELF_LONG_H(elf_spnt->sh_addr));
      PRINTF(" paddr: 0x%.8lx,", padd);
      PRINTF(" paddr: 0x%.8lx,", padd);
      PRINTF(" offset: 0x%.8lx,", ELF_LONG_H(elf_spnt->sh_offset));
      PRINTF(" offset: 0x%.8lx,", ELF_LONG_H(elf_spnt->sh_offset));
      PRINTF(" size: 0x%.8lx\n", ELF_LONG_H(elf_spnt->sh_size));
      PRINTF(" size: 0x%.8lx\n", ELF_LONG_H(elf_spnt->sh_size));
 
 
      freemem = padd;
      freemem = padd;
      sectsize = ELF_LONG_H(elf_spnt->sh_size);
      sectsize = ELF_LONG_H(elf_spnt->sh_size);
 
 
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
      if (fseek(inputfs, ELF_LONG_H(elf_spnt->sh_offset), SEEK_SET) != 0) {
        perror("readfile_elf");
        perror("readfile_elf");
        exit(1);
        exit(1);
      }
      }
 
 
      while (sectsize > 0 && (len = fread(&inputbuf, sizeof(inputbuf), 1, inputfs))) {
      while (sectsize > 0 && (len = fread(&inputbuf, sizeof(inputbuf), 1, inputfs))) {
        insn = ELF_LONG_H(inputbuf);
        insn = ELF_LONG_H(inputbuf);
        len = insn_len (insn_decode (insn));
        len = insn_len (insn_decode (insn));
        if (len == 2)
        if (len == 2)
          {
          {
            fseek(inputfs, -2, SEEK_CUR);
            fseek(inputfs, -2, SEEK_CUR);
            debug(8, "readfile_elf: %x 0x%x   \n", sectsize, insn >> 16);
            debug(8, "readfile_elf: %x 0x%x   \n", sectsize, insn >> 16);
          }
          }
        else
        else
          debug(8, "readfile_elf: %x 0x%x   \n", sectsize, insn);
          debug(8, "readfile_elf: %x 0x%x   \n", sectsize, insn);
        addprogram (freemem, insn, &breakpoint);
        addprogram (freemem, insn, &breakpoint);
        sectsize -= len;
        sectsize -= len;
      }
      }
    }
    }
  }
  }
 
 
  if (str_tbl) {
  if (str_tbl) {
    i = 0;
    i = 0;
    while(syms--) {
    while(syms--) {
      if (sym_tbl[i].st_name && sym_tbl[i].st_info && ELF_SHORT_H(sym_tbl[i].st_shndx) < 0x8000) {
      if (sym_tbl[i].st_name && sym_tbl[i].st_info && ELF_SHORT_H(sym_tbl[i].st_shndx) < 0x8000) {
        add_label(ELF_LONG_H(sym_tbl[i].st_value), &str_tbl[ELF_LONG_H(sym_tbl[i].st_name)]);
        add_label(ELF_LONG_H(sym_tbl[i].st_value), &str_tbl[ELF_LONG_H(sym_tbl[i].st_name)]);
        debug (8, "%08lx(%s): %x %x %x\n", ELF_LONG_H(sym_tbl[i].st_value), &str_tbl[ELF_LONG_H(sym_tbl[i].st_name)], sym_tbl[i].st_info, sym_tbl[i].st_other, ELF_SHORT_H(sym_tbl[i].st_shndx));
        debug (8, "%08lx(%s): %x %x %x\n", ELF_LONG_H(sym_tbl[i].st_value), &str_tbl[ELF_LONG_H(sym_tbl[i].st_name)], sym_tbl[i].st_info, sym_tbl[i].st_other, ELF_SHORT_H(sym_tbl[i].st_shndx));
      }
      }
      i++;
      i++;
    }
    }
  }
  }
}
}
 
 
/* Identify file type and call appropriate readfile_X routine. It only
/* Identify file type and call appropriate readfile_X routine. It only
handles orX-coff-big executables at the moment. */
handles orX-coff-big executables at the moment. */
 
 
void identifyfile(char *filename)
void identifyfile(char *filename)
{
{
  FILE *inputfs;
  FILE *inputfs;
  struct COFF_filehdr coffhdr;
  struct COFF_filehdr coffhdr;
  struct elf32_hdr elfhdr;
  struct elf32_hdr elfhdr;
 
 
  if (!(inputfs = fopen(filename, "r"))) {
  if (!(inputfs = fopen(filename, "r"))) {
    perror(filename);
    perror(filename);
    fflush(stdout);
    fflush(stdout);
    fflush(stderr);
    fflush(stderr);
    exit(1);
    exit(1);
  }
  }
 
 
  if (fread(&coffhdr, sizeof(coffhdr), 1, inputfs) == 1) {
  if (fread(&coffhdr, sizeof(coffhdr), 1, inputfs) == 1) {
    if (COFF_SHORT_H(coffhdr.f_magic) == 0x17a) {
    if (COFF_SHORT_H(coffhdr.f_magic) == 0x17a) {
          unsigned long opthdr_size;
          unsigned long opthdr_size;
      PRINTF("COFF magic: 0x%.4x\n", COFF_SHORT_H(coffhdr.f_magic));
      PRINTF("COFF magic: 0x%.4x\n", COFF_SHORT_H(coffhdr.f_magic));
      PRINTF("COFF flags: 0x%.4x\n", COFF_SHORT_H(coffhdr.f_flags));
      PRINTF("COFF flags: 0x%.4x\n", COFF_SHORT_H(coffhdr.f_flags));
      PRINTF("COFF symptr: 0x%.8lx\n", COFF_LONG_H(coffhdr.f_symptr));
      PRINTF("COFF symptr: 0x%.8lx\n", COFF_LONG_H(coffhdr.f_symptr));
      if ((COFF_SHORT_H(coffhdr.f_flags) & COFF_F_EXEC) != COFF_F_EXEC) {
      if ((COFF_SHORT_H(coffhdr.f_flags) & COFF_F_EXEC) != COFF_F_EXEC) {
        PRINTF("This COFF is not an executable.\n");
        PRINTF("This COFF is not an executable.\n");
        exit(1);
        exit(1);
      }
      }
      opthdr_size = COFF_SHORT_H(coffhdr.f_opthdr);
      opthdr_size = COFF_SHORT_H(coffhdr.f_opthdr);
      if (opthdr_size != sizeof(COFF_AOUTHDR)) {
      if (opthdr_size != sizeof(COFF_AOUTHDR)) {
        PRINTF("COFF optional header is missing or not recognized.\n");
        PRINTF("COFF optional header is missing or not recognized.\n");
        PRINTF("COFF f_opthdr: 0x%.2lx\n", opthdr_size);
        PRINTF("COFF f_opthdr: 0x%.2lx\n", opthdr_size);
        exit(1);
        exit(1);
      }
      }
      fclose(inputfs);
      fclose(inputfs);
      readfile_coff(filename, COFF_SHORT_H(coffhdr.f_nscns));
      readfile_coff(filename, COFF_SHORT_H(coffhdr.f_nscns));
      readsyms_coff(filename, COFF_LONG_H(coffhdr.f_symptr), COFF_LONG_H(coffhdr.f_nsyms));
      readsyms_coff(filename, COFF_LONG_H(coffhdr.f_symptr), COFF_LONG_H(coffhdr.f_nsyms));
      return;
      return;
    }
    }
    else {
    else {
      PRINTF("Not COFF file format\n");
      PRINTF("Not COFF file format\n");
      fseek(inputfs, 0, SEEK_SET);
      fseek(inputfs, 0, SEEK_SET);
    }
    }
  }
  }
  if (fread(&elfhdr, sizeof(elfhdr), 1, inputfs) == 1) {
  if (fread(&elfhdr, sizeof(elfhdr), 1, inputfs) == 1) {
    if (elfhdr.e_ident[0] == 0x7f && elfhdr.e_ident[1] == 0x45 && elfhdr.e_ident[2] == 0x4c && elfhdr.e_ident[3] == 0x46) {
    if (elfhdr.e_ident[0] == 0x7f && elfhdr.e_ident[1] == 0x45 && elfhdr.e_ident[2] == 0x4c && elfhdr.e_ident[3] == 0x46) {
      PRINTF("ELF type: 0x%.4x\n", ELF_SHORT_H(elfhdr.e_type));
      PRINTF("ELF type: 0x%.4x\n", ELF_SHORT_H(elfhdr.e_type));
      PRINTF("ELF machine: 0x%.4x\n", ELF_SHORT_H(elfhdr.e_machine));
      PRINTF("ELF machine: 0x%.4x\n", ELF_SHORT_H(elfhdr.e_machine));
      PRINTF("ELF version: 0x%.8lx\n", ELF_LONG_H(elfhdr.e_version));
      PRINTF("ELF version: 0x%.8lx\n", ELF_LONG_H(elfhdr.e_version));
      PRINTF("ELF sec = %d\n", ELF_SHORT_H(elfhdr.e_shnum));
      PRINTF("ELF sec = %d\n", ELF_SHORT_H(elfhdr.e_shnum));
      if (ELF_SHORT_H(elfhdr.e_type) != ET_EXEC ) {
      if (ELF_SHORT_H(elfhdr.e_type) != ET_EXEC ) {
        PRINTF("This ELF is not an executable.\n");
        PRINTF("This ELF is not an executable.\n");
        exit(1);
        exit(1);
      }
      }
      fclose(inputfs);
      fclose(inputfs);
      readfile_elf(filename);
      readfile_elf(filename);
      return;
      return;
    }
    }
    else {
    else {
      PRINTF("Not ELF file format.\n");
      PRINTF("Not ELF file format.\n");
      fseek(inputfs, 0, SEEK_SET);
      fseek(inputfs, 0, SEEK_SET);
    }
    }
  }
  }
 
 
  perror("identifyfile2");
  perror("identifyfile2");
  fclose(inputfs);
  fclose(inputfs);
 
 
  return;
  return;
}
}
 
 
 
 
/* Loads file to memory starting at address startaddr and returns freemem. */
/* Loads file to memory starting at address startaddr and returns freemem. */
unsigned long loadcode(char *filename, oraddr_t startaddr, oraddr_t virtphy_transl)
unsigned long loadcode(char *filename, oraddr_t startaddr, oraddr_t virtphy_transl)
{
{
  int breakpoint = 0;
  int breakpoint = 0;
 
 
  transl_error = 0;
  transl_error = 0;
  transl_table = virtphy_transl;
  transl_table = virtphy_transl;
  freemem = startaddr;
  freemem = startaddr;
  PRINTF("loadcode: filename %s  startaddr=%"PRIxADDR"  virtphy_transl=%"PRIxADDR"\n",
  PRINTF("loadcode: filename %s  startaddr=%"PRIxADDR"  virtphy_transl=%"PRIxADDR"\n",
         filename, startaddr, virtphy_transl);
         filename, startaddr, virtphy_transl);
  identifyfile(filename);
  identifyfile(filename);
 
 
#if IMM_STATS  
#if IMM_STATS  
  {
  {
    int i = 0, a = 0, b = 0, c = 0;
    int i = 0, a = 0, b = 0, c = 0;
    PRINTF ("index:arith/branch/jump\n");
    PRINTF ("index:arith/branch/jump\n");
    for (i = 0; i < 33; i++)
    for (i = 0; i < 33; i++)
      PRINTF ("%2i:\t%3.0f%% / %3.0f%%/ %3.0f%%\t%5i / %5i / %5i\n", i,
      PRINTF ("%2i:\t%3.0f%% / %3.0f%%/ %3.0f%%\t%5i / %5i / %5i\n", i,
              100.* (a += bcnt[i][0])/bsum[0], 100.* (b += bcnt[i][1])/bsum[1],
              100.* (a += bcnt[i][0])/bsum[0], 100.* (b += bcnt[i][1])/bsum[1],
              100.* (c += bcnt[i][2])/bsum[2], bcnt[i][0], bcnt[i][1], bcnt[i][2]);
              100.* (c += bcnt[i][2])/bsum[2], bcnt[i][0], bcnt[i][1], bcnt[i][2]);
    PRINTF ("\nsum %i %i %i\n", bsum[0], bsum[1], bsum[2]);
    PRINTF ("\nsum %i %i %i\n", bsum[0], bsum[1], bsum[2]);
  }
  }
#endif
#endif
 
 
  if (transl_error)
  if (transl_error)
    return -1;
    return -1;
  else
  else
    return translate(freemem,&breakpoint);
    return translate(freemem,&breakpoint);
 
 
}
}
 
 

powered by: WebSVN 2.1.0

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