URL
https://opencores.org/ocsvn/mlite/mlite/trunk
Subversion Repositories mlite
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 26 to Rev 27
- ↔ Reverse comparison
Rev 26 → Rev 27
/trunk/tools/convert.c
1,17 → 1,57
//convert.c by Steve Rhoads 4/26/01 |
//This program strips off the first 0x1000 bytes |
//set $gp and zero .sbss and .bss |
#include <stdio.h> |
#include <stdlib.h> |
|
#define BUF_SIZE (1024*1024) |
#define CODE_OFFSET 0x1000 |
#define ntohl(A) ((A>>24)|((A&0x00ff0000)>>8)|((A&0xff00)<<8)|(A<<24)) |
|
enum { |
TEXT_OFFSET, TEXT_LENGTH, |
RDATA_OFFSET, RDATA_LENGTH, |
DATA_OFFSET, DATA_LENGTH, |
SDATA_OFFSET, SDATA_LENGTH, |
SBSS_OFFSET, SBSS_LENGTH, |
BSS_OFFSET, BSS_LENGTH |
}; |
|
long code_start_offset=0x60; |
unsigned long map[12]; |
long offset[]={ |
0x58, 0x5c, //.text offset,length |
0x80, 0x84, //.rdata offset,length |
0xa8, 0xac, //.data offset,length |
0xd0, 0xd4, //.sdata offset,length |
0xf8, 0xfc, //.sbss offset,length |
0x120,0x124 //.bss offset,length |
}; |
|
unsigned long load(char *ptr,unsigned long address) |
{ |
unsigned long value; |
value=*(unsigned long*)(ptr+address); |
value=ntohl(value); |
return value; |
} |
|
void set_low(char *ptr,unsigned long address,unsigned long value) |
{ |
unsigned long opcode; |
opcode=*(unsigned long*)(ptr+address); |
opcode=ntohl(opcode); |
opcode=(opcode&0xffff0000)|(value&0xffff); |
opcode=ntohl(opcode); |
*(unsigned long*)(ptr+address)=opcode; |
} |
|
int main(int argc,char *argv[]) |
{ |
FILE *infile,*outfile,*txtfile; |
unsigned char *buf; |
long size,i,j; |
unsigned long d; |
unsigned char *buf,*code; |
long size,code_offset; |
unsigned long i,d,gp_ptr; |
|
printf("test.exe -> code.txt & test2.exe\n"); |
infile=fopen("test.exe","rb"); |
if(infile==NULL) { |
printf("Can't open test.exe"); |
20,20 → 60,57
buf=(unsigned char*)malloc(BUF_SIZE); |
size=fread(buf,1,BUF_SIZE,infile); |
fclose(infile); |
|
code_offset=load(buf,code_start_offset); |
printf("code_offset=0x%x\n",code_offset); |
code=buf+code_offset; |
/*load all of the segment offsets and lengths*/ |
for(i=0;i<12;++i) { |
map[i]=load(buf,offset[i]); |
} |
if(code_offset<0x120) { |
printf("no .sdata\n"); |
for(i=6;i<12;i+=2) { |
map[i]=map[4]; |
map[i+1]=map[5]; |
} |
} else if(code_offset<0x140) { |
printf("no .rdata\n"); |
for(i=11;i>4;--i) { |
map[i]=map[i-2]; |
} |
} |
for(i=0;i<12;i+=2) { |
printf("0x%x 0x%x\n",map[i],map[i+1]); |
} |
|
/*Initialize the $gp register for sdata and sbss*/ |
gp_ptr=map[SDATA_OFFSET]+0x8000; |
printf("gp_ptr=0x%x\n",gp_ptr); |
/*modify the first opcodes in boot.asm*/ |
/*modify the lui opcode*/ |
set_low(code,0,gp_ptr>>16); |
/*modify the ori opcode*/ |
set_low(code,4,gp_ptr&0xffff); |
|
/*Clear .sbss and .bss*/ |
printf(".sbss=0x%x .bss_end=0x%x\n", |
map[SBSS_OFFSET],map[BSS_OFFSET]+map[BSS_LENGTH]); |
set_low(code,8,map[SBSS_OFFSET]); |
set_low(code,12,map[BSS_OFFSET]+map[BSS_LENGTH]); |
|
/*write out code.txt*/ |
outfile=fopen("test2.exe","wb"); |
txtfile=fopen("code.txt","w"); |
for(i=CODE_OFFSET;i<size;i+=4) { |
d=(buf[i]<<24)|(buf[i+1]<<16)|(buf[i+2]<<8)|buf[i+3]; |
// if((d>>24)==0x0c) { //JAL |
// j=(d&0xfffff)-0x400-((i-CODE_OFFSET)>>2)-1; //BGEZAL |
// d=0x04110000+(j&0xffff); |
// } |
for(i=0;i<=map[SDATA_OFFSET]+map[SDATA_LENGTH];i+=4) { |
d=load(code,i); |
fprintf(txtfile,"%8.8x\n",d); |
fwrite(buf+i,4,1,outfile); |
fwrite(code+i,4,1,outfile); |
} |
fclose(outfile); |
fclose(txtfile); |
free(buf); |
|
return 0; |
} |
|