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