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

Subversion Repositories yacc

[/] [yacc/] [trunk/] [tool_source_by_tak/] [convert_mips.c] - Rev 4

Compare with Previous | Blame | View Log

//convert.c by Steve Rhoads 4/26/01
//Now uses the ELF format (get gccmips_elf.zip) 
//set $gp and zero .sbss and .bss
//May.15.2004 add code0.hex code1.hex code2.hex code3.hex 8bitIntelHex File Generation by Tak.Sugawara
//Jan.6.2005 add Xilinx *.coe file code0.coe, code1.coe,code2.coe,code3.coe
//Apr.3.2005 -sp16k flag addition
//Apr.5.2005 -mif file addition
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define BUF_SIZE (1024*1024)
/*Assumes running on PC little endian*/
#define ntohl(A) (((A)>>24)|(((A)&0x00ff0000)>>8)|(((A)&0xff00)<<8)|((A)<<24))
#define ntohs(A) ((((A)&0xff00)>>8)|((A)<<8))
 
#define EI_NIDENT 16
#define SHT_PROGBITS 1
#define SHT_STRTAB 3
#define SHT_NOBITS 8
 
typedef struct {
   unsigned char  e_ident[EI_NIDENT];
   unsigned short e_e_type;
   unsigned short e_machine;
   unsigned long  e_version;
   unsigned long  e_entry;
   unsigned long  e_phoff;
   unsigned long  e_shoff;
   unsigned long  e_flags;
   unsigned short e_ehsize;
   unsigned short e_phentsize;
   unsigned short e_phnum;
   unsigned short e_shentsize;
   unsigned short e_shnum;
   unsigned short e_shstrndx;
} ElfHeader;
 
typedef struct {
   unsigned long p_type;
   unsigned long p_offset;
   unsigned long p_vaddr;
   unsigned long p_paddr;
   unsigned long p_filesz;
   unsigned long p_memsz;
   unsigned long p_flags;
   unsigned long p_align;
} Elf32_Phdr;
 
typedef struct {
   unsigned long sh_name;
   unsigned long sh_type;
   unsigned long sh_flags;
   unsigned long sh_addr;
   unsigned long sh_offset;
   unsigned long sh_size;
   unsigned long sh_link;
   unsigned long sh_info;
   unsigned long sh_addralign;
   unsigned long sh_entsize;
} Elf32_Shdr;
 
#if 0
unsigned long load(unsigned char *ptr,unsigned long address)
{
   unsigned long value;
   value=*(unsigned long*)(ptr+address);
   value=ntohl(value);
   return value;
}
 
unsigned short load_short(unsigned char *ptr,unsigned long address)
{
   return (ptr[address]<<8)+ptr[address+1];
}
#endif
 
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,*code;
   long size,stack_pointer;
   unsigned long length,d,i,gp_ptr=0;
   unsigned long bss_start=0,bss_end=0;
 char filename[80];//TAK May.10.2004
 char filename_coe[80];//TAK Jan.6.2005
 char filename_mif[80];//TAK Apr.5.2005
   FILE *file;//TAK May.10.2004
   FILE *file_coe;//TAK Jan.6.2005
   FILE *file_mif;
   unsigned long j,k,sum;
   int m;
   ElfHeader *elfHeader;
   Elf32_Phdr *elfProgram;
   Elf32_Shdr *elfSection;
   int stack_ptr16KB_flag=0;
   char* ptr=argv[1];
   if (argc==2){
		if(!strcmp( argv[1],"-sp16k")){
				stack_ptr16KB_flag=1;
		}
   }	
   printf("test.exe -> code.txt & test2.exe\n");
   infile=fopen("test.exe","rb");
   if(infile==NULL) {
      printf("Can't open test.exe");
      return 0;
   }
   buf=(unsigned char*)malloc(BUF_SIZE);
   size=fread(buf,1,BUF_SIZE,infile);
   fclose(infile);
   code=(unsigned char*)malloc(BUF_SIZE);
   memset(code,0,BUF_SIZE);
 
   elfHeader=(ElfHeader*)buf;
   if(strncmp(elfHeader->e_ident+1,"ELF",3)) {
      printf("Error:  Not an ELF file!\n");
      printf("Use the gccmips_elf.zip from opencores/projects/plasma!\n");
      return -1;
   }
 
   elfHeader->e_entry=ntohl(elfHeader->e_entry);
   elfHeader->e_phoff=ntohl(elfHeader->e_phoff);
   elfHeader->e_shoff=ntohl(elfHeader->e_shoff);
   elfHeader->e_phentsize=ntohs(elfHeader->e_phentsize);
   elfHeader->e_phnum=ntohs(elfHeader->e_phnum);
   elfHeader->e_shentsize=ntohs(elfHeader->e_shentsize);
   elfHeader->e_shnum=ntohs(elfHeader->e_shnum);
   length=0;
 
   for(i=0;i<elfHeader->e_phnum;++i) {
      elfProgram=(Elf32_Phdr*)(buf+elfHeader->e_phoff+elfHeader->e_phentsize*i);
      elfProgram->p_offset=ntohl(elfProgram->p_offset);
      elfProgram->p_vaddr=ntohl(elfProgram->p_vaddr);
      elfProgram->p_filesz=ntohl(elfProgram->p_filesz);
      elfProgram->p_memsz=ntohl(elfProgram->p_memsz);
//      printf("[0x%x,0x%x,0x%x]\n",elfProgram->p_vaddr,elfProgram->p_offset,elfProgram->p_filesz);
      memcpy(code+elfProgram->p_vaddr,buf+elfProgram->p_offset,elfProgram->p_filesz);
      length=elfProgram->p_vaddr+elfProgram->p_memsz;
   }
 
   for(i=0;i<elfHeader->e_shnum;++i) {
      elfSection=(Elf32_Shdr*)(buf+elfHeader->e_shoff+elfHeader->e_shentsize*i);
      elfSection->sh_name=ntohl(elfSection->sh_name);
      elfSection->sh_type=ntohl(elfSection->sh_type);
      elfSection->sh_addr=ntohl(elfSection->sh_addr);
      elfSection->sh_offset=ntohl(elfSection->sh_offset);
      elfSection->sh_size=ntohl(elfSection->sh_size);
#if 0
      printf("{0x%x,0x%x:0x%x,0x%x,0x%x}\n",
         elfSection->sh_name,elfSection->sh_type,elfSection->sh_addr,
         elfSection->sh_offset,elfSection->sh_size);
#endif
#if 0
      if(elfSection->sh_type==SHT_PROGBITS||elfSection->sh_type==SHT_STRTAB) {
//         memcpy(code+elfSection->sh_addr,buf+elfSection->sh_offset,elfSection->sh_size);
         length=elfSection->sh_addr+elfSection->sh_size;
         bss_start=length;
      }
#endif
      if(elfSection->sh_type==SHT_PROGBITS) {
         gp_ptr=elfSection->sh_addr;
      }
      if(elfSection->sh_type==SHT_NOBITS) {
         if(bss_start==0) {
            bss_start=elfSection->sh_addr;
         }
         bss_end=elfSection->sh_addr+elfSection->sh_size;
      }
   }
 
   if(bss_start==length) {
      bss_start=length;
      bss_end=length+4;
   }
 
   /*Initialize the $gp register for sdata and sbss*/   
   gp_ptr+=0x7ff0;
   printf("gp_ptr=0x%x ",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",bss_start,bss_end);
   set_low(code,8,bss_start>>16);
   set_low(code,12,bss_start&0xffff);
   set_low(code,16,bss_end>>16);
   set_low(code,20,bss_end&0xffff);
   /*Set stack pointer*/
   stack_pointer=bss_end+512;
   if(stack_ptr16KB_flag) stack_pointer=0x3f80;//Apr.4.2005
   printf("Stack pointer=0x%x\n",stack_pointer);
 
   set_low(code,24,stack_pointer>>16);//TAK
   set_low(code,28,stack_pointer&0xffff);//TAK
   /*write out code.txt*/
   outfile=fopen("test2.exe","wb");
   fwrite(code,length,1,outfile);
   fclose(outfile);
 
   txtfile=fopen("code.txt","w");
   for(i=0;i<=length;i+=4) {
      d=ntohl(*(unsigned long*)(code+i));
      fprintf(txtfile,"%8.8x\n",d);
   }
   fclose(txtfile);
   //TAK May.10.2004 
    strcpy(filename,"codeX.hex");
    strcpy(filename_coe,"codeX.coe");
	strcpy(filename_mif,"ram1kX.mif");
   for(i=0;i<4;++i) {
      filename[4]='0'+i;
      filename_coe[4]='0'+i;//Jan.6.2005
	  filename_mif[5]='0'+i;
      file=fopen(filename,"wb");
      file_coe=fopen(filename_coe,"wb");//Jan.6.2005
	  file_mif=fopen(filename_mif,"wb");
	  fprintf(file_coe,"memory_initialization_radix=16;\n");//Jan.6.2005
	  fprintf(file_coe,"memory_initialization_vector=\n");//Jan.6.2005
 
      for(j=0;i+j*4*16<length;++j) {
         k=j*16;
         fprintf(file,":10%4.4x00",k);
         sum=0x10+(k>>8)+(k&0xff);
         for(k=0;k<16;++k) {
            fprintf(file,"%2.2x",code[i+j*4*16+k*4]);
            fprintf(file_coe,"%2.2x",code[i+j*4*16+k*4]);//Jan.6.2005
			for (m=7;m>=0;m--){
				fprintf(file_mif,"%1x",(code[i+j*4*16+k*4] >> m) & 1);
			}
			fprintf(file_mif,"\n");
			if (k==15 && (j+1)*4*16>=length) fprintf(file_coe,";\n");//Jan.6.2005
   			else fprintf(file_coe,",\n");//Jan.6.2005
            sum+=code[i+j*4*16+k*4];
 
         }
         sum&=0xff;
         sum=0x100-sum;
         sum&=0xff;
         fprintf(file,"%2.2x\n",sum);
      }
      fprintf(file,":00000001ff\n");
      fclose(file);
      fclose(file_coe);//Jan.6.2005
	  fclose(file_mif);
   }
 
 
 
 
 
 
 
 
 
 
   free(buf);
 
   return 0;
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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