OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / pinoc_gcc / bootloader / read_elf.c
1 /*
2  * read_elf.c
3  *
4  *  Created on: 2011/04/25
5  *      Author: mizu
6  */
7
8 #include "read_elf.h"
9 #include "3069f_sci.h"
10 #include "string.h"
11
12 char* gen_xval(unsigned long val, int column)
13 {
14         int i;
15         static char buf[9];
16         char* p;
17
18 //      for(i = 0; i < 9; i++)
19 //              buf[i] = 0;
20
21         p = buf + sizeof buf - 1;
22         *(p--) = 0x00;
23
24         if(!val && !column)
25                 column++;
26
27         while(val || column)
28         {
29                 *(p--) = "0123456789abcdef"[val & 0x0f];
30                 val >>= 4;
31                 if(column) column--;
32         }
33         return buf;
34 }
35
36 static int elf_check(struct elf_header *header)
37 {
38         if(memcmp(header->id.magic, "\x7f" "ELF", 4))
39                 return -1;
40
41         // ヘッダ情報チェック
42         if(header->id.class             != 1) return -1;        // ELF32
43         if(header->id.format    != 2) return -1;        // Big endian
44         if(header->id.version   != 1) return -1;        // version 1
45         if(header->type                 != 2) return -1;        // Exe file
46         if(header->version              != 1) return -1;        // version 1
47
48         // H8アーキテクチャ Exe file
49         if((header->arch != 46) && (header->arch != 47)) return -1;
50
51         return 0;
52 }
53
54 // elfをRAMへ展開する
55 char* elf_develop(char* p)
56 {
57         struct elf_header* header;
58         header = (struct elf_header*) p;
59         struct elf_program_header *program;
60
61         if(elf_check(header))
62         {
63                 sci_write_str(SCI_NO_1, "It's not ELF...\r\n");
64                 return 0;
65         }else
66         {
67                 sci_write_str(SCI_NO_1, "It's ELF Data!!\r\n");
68         }
69
70         sci_write_str(SCI_NO_1, "EntryPoint  >>> ");
71         sci_write_str(SCI_NO_1, gen_xval(header->entry_point, 8));
72
73         int i;
74         for (i = 0; i < header->program_header_num; i++)
75         {
76
77                 program = (struct elf_program_header*) ((char*) header
78                                 + header->program_header_offset + header->program_header_size
79                                 * i);
80
81                 sci_write_str(SCI_NO_1, "\r\noffset        -> ");
82                 sci_write_str(SCI_NO_1, gen_xval(program->offset,                       6));
83                 sci_write_str(SCI_NO_1, "\r\nvirtual_addr  -> ");
84                 sci_write_str(SCI_NO_1, gen_xval(program->virtual_addr,         8));
85                 sci_write_str(SCI_NO_1, "\r\nphysical_addr -> ");
86                 sci_write_str(SCI_NO_1, gen_xval(program->physical_addr,        8));
87                 sci_write_str(SCI_NO_1, "\r\nfile_size     -> ");
88                 sci_write_str(SCI_NO_1, gen_xval(program->file_size,            5));
89                 sci_write_str(SCI_NO_1, "\r\nmemory_size   -> ");
90                 sci_write_str(SCI_NO_1, gen_xval(program->memory_size,          5));
91                 sci_write_str(SCI_NO_1, "\r\nflags         -> ");
92                 sci_write_str(SCI_NO_1, gen_xval(program->flags,                        2));
93                 sci_write_str(SCI_NO_1, "\r\nalign         -> ");
94                 sci_write_str(SCI_NO_1, gen_xval(program->align,                        2));
95                 sci_write_str(SCI_NO_1, "\r\n");
96
97                 // ロード可能かどうか
98                 if (program->type != 1)
99                 {
100                         sci_write_str(SCI_NO_1, "can not load...\r\n");
101                         continue;
102                 }else
103                 {
104                         sci_write_str(SCI_NO_1, "loading...\r\n");
105                 }
106
107                 sci_write_str(SCI_NO_1, "program headers devloping...\r\n");
108                 // メモリへセクション展開
109                 memcpy((char*) program->physical_addr, (char*) header + program->offset, program->file_size);
110                 sci_write_str(SCI_NO_1, "program headers devloped...\r\n");
111
112                 sci_write_str(SCI_NO_1, "initing...\r\n");
113                 // メモリサイズとファイルサイズの隙間を0で埋める
114                 memset((char*) program->physical_addr + program->file_size, 0, program->memory_size - program->file_size);
115                 sci_write_str(SCI_NO_1, "inited...\r\n");
116
117         }
118
119         return (char*)header->entry_point;
120 }
121
122 int elf_analysis(char* p)
123 {
124         struct elf_header* header;
125
126         header = (struct elf_header*) p;
127
128         int i;
129         for (i = 0; i < header->section_header_num; i++)
130         {
131
132                 struct elf_program_header *program =
133                                 (struct elf_program_header*) ((char*) header
134                                                 + header->program_header_offset
135                                                 + header->program_header_size * i);
136
137                 // ロード可能かどうか
138                 if (program->type != 1)
139                         return -1;
140
141         }
142
143         return 0;
144
145
146 //      sci_write(SCI1, );
147 }
148
149 int elf_read(char* p)
150 {
151         struct elf_header* header;
152
153         header = (struct elf_header*)p;
154
155         // ELFかチェック
156         if(elf_check(header))
157         {
158                 return -1;
159         }
160
161         return 0;
162
163 }