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
|