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

Subversion Repositories plasma

[/] [plasma/] [trunk/] [tools/] [convert.c] - Blame information for rev 47

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 rhoads
//convert.c by Steve Rhoads 4/26/01
2 27 rhoads
//set $gp and zero .sbss and .bss
3 2 rhoads
#include <stdio.h>
4
#include <stdlib.h>
5
 
6
#define BUF_SIZE (1024*1024)
7 34 rhoads
/*Assumes running on PC little endian*/
8 27 rhoads
#define ntohl(A) ((A>>24)|((A&0x00ff0000)>>8)|((A&0xff00)<<8)|(A<<24))
9 2 rhoads
 
10 34 rhoads
#define CODE_START 0x60
11
#define SECTION_START 0x4c
12
#define SECTION_END 0x160
13
#define SECTION_SIZE 0x28
14
#define SECTION_OFFSET 0xc
15
#define SECTION_LENGTH 0x10
16 27 rhoads
 
17 34 rhoads
struct header_t {
18
   unsigned long text_offset,text_length;
19
   unsigned long rdata_offset,rdata_length;
20
   unsigned long data_offset,data_length;
21
   unsigned long sdata_offset,sdata_length;
22
   unsigned long sbss_offset,sbss_length;
23
   unsigned long bss_offset,bss_length;
24
} header;
25 27 rhoads
 
26
unsigned long load(char *ptr,unsigned long address)
27
{
28
   unsigned long value;
29
   value=*(unsigned long*)(ptr+address);
30
   value=ntohl(value);
31
   return value;
32
}
33
 
34
void set_low(char *ptr,unsigned long address,unsigned long value)
35
{
36
   unsigned long opcode;
37
   opcode=*(unsigned long*)(ptr+address);
38
   opcode=ntohl(opcode);
39
   opcode=(opcode&0xffff0000)|(value&0xffff);
40
   opcode=ntohl(opcode);
41
   *(unsigned long*)(ptr+address)=opcode;
42
}
43
 
44 2 rhoads
int main(int argc,char *argv[])
45
{
46 26 rhoads
   FILE *infile,*outfile,*txtfile;
47 27 rhoads
   unsigned char *buf,*code;
48 47 rhoads
   long size,stack_pointer;
49 34 rhoads
   unsigned long code_offset,index,name,offset,length,d,i,gp_ptr;
50 27 rhoads
 
51
   printf("test.exe -> code.txt & test2.exe\n");
52 2 rhoads
   infile=fopen("test.exe","rb");
53
   if(infile==NULL) {
54
      printf("Can't open test.exe");
55
      return 0;
56
   }
57
   buf=(unsigned char*)malloc(BUF_SIZE);
58
   size=fread(buf,1,BUF_SIZE,infile);
59
   fclose(infile);
60 27 rhoads
 
61 34 rhoads
   code_offset=load(buf,CODE_START);
62
   printf("code_offset=0x%x ",code_offset);
63 27 rhoads
   code=buf+code_offset;
64 34 rhoads
 
65 27 rhoads
   /*load all of the segment offsets and lengths*/
66 34 rhoads
   for(index=SECTION_START;index<code_offset-0x20;index+=SECTION_SIZE) {
67
      name=load(buf,index);
68
      offset=load(buf,index+SECTION_OFFSET);
69
      length=load(buf,index+SECTION_LENGTH);
70
      switch(name) {
71
      case 0x2e746578: /*.text*/
72
         header.text_offset=offset;
73
         header.text_length=length;
74
         offset+=length;
75
         length=0;
76
         header.rdata_offset=offset;
77
         header.rdata_length=length;
78
         header.data_offset=offset;
79
         header.data_length=length;
80
         header.sdata_offset=offset;
81
         header.sdata_length=length;
82
         header.sbss_offset=offset;
83
         header.sbss_length=length;
84
         header.bss_offset=offset;
85
         header.bss_length=length;
86
         break;
87
      case 0x2e726461: /*.rdata*/
88
         header.rdata_offset=offset;
89
         header.rdata_length=length;
90
         offset+=length;
91
         length=0;
92
         header.data_offset=offset;
93
         header.data_length=length;
94
         header.sdata_offset=offset;
95
         header.sdata_length=length;
96
         header.sbss_offset=offset;
97
         header.sbss_length=length;
98
         header.bss_offset=offset;
99
         header.bss_length=length;
100
         break;
101
      case 0x2e646174: /*.data*/
102
         header.data_offset=offset;
103
         header.data_length=length;
104
         offset+=length;
105
         length=0;
106
         header.sdata_offset=offset;
107
         header.sdata_length=length;
108
         header.sbss_offset=offset;
109
         header.sbss_length=length;
110
         header.bss_offset=offset;
111
         header.bss_length=length;
112
         break;
113
      case 0x2e736461: /*.sdata*/
114
         header.sdata_offset=offset;
115
         header.sdata_length=length;
116
         offset+=length;
117
         length=0;
118
         header.sbss_offset=offset;
119
         header.sbss_length=length;
120
         header.bss_offset=offset;
121
         header.bss_length=length;
122
         break;
123
      case 0x2e736273: /*.sbss*/
124
         header.sbss_offset=offset;
125
         header.sbss_length=length;
126
         offset+=length;
127
         length=0;
128
         header.bss_offset=offset;
129
         header.bss_length=length;
130
         break;
131
      case 0x2e627373:  /*.bss*/
132
         header.bss_offset=offset;
133
         header.bss_length=length;
134
         break;
135
      default: printf("unknown 0x%x\n",name);
136 27 rhoads
      }
137
   }
138
 
139
   /*Initialize the $gp register for sdata and sbss*/
140 34 rhoads
   gp_ptr=header.sdata_offset+0x8000;
141
   printf("gp_ptr=0x%x ",gp_ptr);
142 27 rhoads
   /*modify the first opcodes in boot.asm*/
143
   /*modify the lui opcode*/
144
   set_low(code,0,gp_ptr>>16);
145
   /*modify the ori opcode*/
146
   set_low(code,4,gp_ptr&0xffff);
147
 
148
   /*Clear .sbss and .bss*/
149
   printf(".sbss=0x%x .bss_end=0x%x\n",
150 34 rhoads
      header.sbss_offset,header.bss_offset+header.bss_length);
151
   set_low(code,8,header.sbss_offset);
152
   set_low(code,12,header.bss_offset+header.bss_length);
153 27 rhoads
 
154 47 rhoads
   /*Set stack pointer*/
155
   stack_pointer=header.bss_offset+header.bss_length+512;
156
   printf("Stack pointer=0x%x\n",stack_pointer);
157
   set_low(code,16,stack_pointer);
158
 
159 27 rhoads
   /*write out code.txt*/
160 26 rhoads
   outfile=fopen("test2.exe","wb");
161
   txtfile=fopen("code.txt","w");
162 34 rhoads
   for(i=0;i<=header.sdata_offset+header.sdata_length;i+=4) {
163 27 rhoads
      d=load(code,i);
164 26 rhoads
      fprintf(txtfile,"%8.8x\n",d);
165 27 rhoads
      fwrite(code+i,4,1,outfile);
166 2 rhoads
   }
167
   fclose(outfile);
168 26 rhoads
   fclose(txtfile);
169 2 rhoads
   free(buf);
170 27 rhoads
 
171 2 rhoads
   return 0;
172
}
173
 

powered by: WebSVN 2.1.0

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