elf loader now mostly supports 64b elfs
[akaros.git] / kern / include / elf.h
1 #ifndef ROS_INC_ELF_H
2 #define ROS_INC_ELF_H
3
4 #include <process.h>
5 #include <ros/common.h>
6
7 #if defined(LITTLE_ENDIAN)
8 #  define ELF_MAGIC 0x464C457FU /* "\x7FELF" in little endian */
9 #elif defined(BIG_ENDIAN)
10 #  define ELF_MAGIC 0x7F454C46U /* "\x7FELF" in big endian */
11 #else
12 #  error I know not my endianness!
13 #endif
14
15 typedef struct Elf32 {
16         uint32_t e_magic;       // must equal ELF_MAGIC
17         uint8_t e_ident[12];
18         uint16_t e_type;
19         uint16_t e_machine;
20         uint32_t e_version;
21         uint32_t e_entry;
22         uint32_t e_phoff;
23         uint32_t e_shoff;
24         uint32_t e_flags;
25         uint16_t e_ehsize;
26         uint16_t e_phentsize;
27         uint16_t e_phnum;
28         uint16_t e_shentsize;
29         uint16_t e_shnum;
30         uint16_t e_shstrndx;
31 } elf32_t;
32
33 typedef struct Proghdr32 {
34         uint32_t p_type;
35         uint32_t p_offset;
36         uint32_t p_va;
37         uint32_t p_pa;
38         uint32_t p_filesz;
39         uint32_t p_memsz;
40         uint32_t p_flags;
41         uint32_t p_align;
42 } proghdr32_t;
43
44 typedef struct Secthdr32 {
45         uint32_t sh_name;
46         uint32_t sh_type;
47         uint32_t sh_flags;
48         uint32_t sh_addr;
49         uint32_t sh_offset;
50         uint32_t sh_size;
51         uint32_t sh_link;
52         uint32_t sh_info;
53         uint32_t sh_addralign;
54         uint32_t sh_entsize;
55 } secthdr32_t;
56
57 typedef struct Elf64 {
58         uint32_t e_magic;       // must equal ELF_MAGIC
59         uint8_t e_ident[12];
60         uint16_t e_type;
61         uint16_t e_machine;
62         uint32_t e_version;
63         uint64_t e_entry;
64         uint64_t e_phoff;
65         uint64_t e_shoff;
66         uint32_t e_flags;
67         uint16_t e_ehsize;
68         uint16_t e_phentsize;
69         uint16_t e_phnum;
70         uint16_t e_shentsize;
71         uint16_t e_shnum;
72         uint16_t e_shstrndx;
73 } elf64_t;
74
75 typedef struct Proghdr64 {
76         uint32_t p_type;
77         uint32_t p_flags;
78         uint64_t p_offset;
79         uint64_t p_va;
80         uint64_t p_pa;
81         uint64_t p_filesz;
82         uint64_t p_memsz;
83         uint64_t p_align;
84 } proghdr64_t;
85
86 typedef struct Secthdr64 {
87         uint32_t sh_name;
88         uint32_t sh_type;
89         uint64_t sh_flags;
90         uint64_t sh_addr;
91         uint64_t sh_offset;
92         uint64_t sh_size;
93         uint32_t sh_link;
94         uint32_t sh_info;
95         uint64_t sh_addralign;
96         uint64_t sh_entsize;
97 } secthdr64_t;
98
99 typedef struct
100 {
101         long entry;
102         long highest_addr;
103         long phdr;
104         int phnum;
105         int dynamic;
106         bool elf64;
107         char interp[256];
108 } elf_info_t;
109
110 typedef long elf_aux_t[2];
111
112 #define ELF_IDENT_CLASS 0
113 // Values for Elf::e_ident[ELF_IDENT_CLASS]
114 #define ELFCLASS32 1
115 #define ELFCLASS64 2
116
117 // Values for Proghdr::p_type
118 #define ELF_PROG_LOAD           1
119 #define ELF_PROG_INTERP         3
120 #define ELF_PROG_PHDR           6
121
122 // Flag bits for Proghdr::p_flags
123 #define ELF_PROG_FLAG_EXEC      1
124 #define ELF_PROG_FLAG_WRITE     2
125 #define ELF_PROG_FLAG_READ      4
126
127 // Values for Secthdr::sh_type
128 #define ELF_SHT_NULL            0
129 #define ELF_SHT_PROGBITS        1
130 #define ELF_SHT_SYMTAB          2
131 #define ELF_SHT_STRTAB          3
132
133 // Values for Secthdr::sh_name
134 #define ELF_SHN_UNDEF           0
135
136 // Values for auxiliary fields
137 #define ELF_AUX_PHDR            3
138 #define ELF_AUX_PHENT           4
139 #define ELF_AUX_PHNUM           5
140 #define ELF_AUX_ENTRY           9
141 #define ELF_AUX_HWCAP           16
142
143 // Hardware capabilities (for use with ELF_AUX_HWCAP)
144 #define ELF_HWCAP_SPARC_FLUSH   1
145
146 struct file;
147 int load_elf(struct proc* p, struct file* f);
148
149 #endif /* !ROS_INC_ELF_H */