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