cosmetic change. removing unnecessary elf_info struct.
[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 Elf {
16         uint32_t e_magic;       // must equal ELF_MAGIC
17         uint8_t e_elf[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 } elf_t;
32
33 typedef struct Proghdr {
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 } proghdr_t;
43
44 typedef struct Secthdr {
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 } secthdr_t;
56
57 typedef struct
58 {
59         long entry;
60         long highest_addr;
61         long phdr;
62         int phnum;
63         int dynamic;
64         char interp[256];
65 } elf_info_t;
66
67 typedef long elf_aux_t[2];
68
69 // Values for Proghdr::p_type
70 #define ELF_PROG_LOAD           1
71 #define ELF_PROG_INTERP         3
72 #define ELF_PROG_PHDR           6
73
74 // Flag bits for Proghdr::p_flags
75 #define ELF_PROG_FLAG_EXEC      1
76 #define ELF_PROG_FLAG_WRITE     2
77 #define ELF_PROG_FLAG_READ      4
78
79 // Values for Secthdr::sh_type
80 #define ELF_SHT_NULL            0
81 #define ELF_SHT_PROGBITS        1
82 #define ELF_SHT_SYMTAB          2
83 #define ELF_SHT_STRTAB          3
84
85 // Values for Secthdr::sh_name
86 #define ELF_SHN_UNDEF           0
87
88 // Values for auxiliary fields
89 #define ELF_AUX_PHDR            3
90 #define ELF_AUX_PHENT           4
91 #define ELF_AUX_PHNUM           5
92 #define ELF_AUX_ENTRY           9
93 #define ELF_AUX_HWCAP           16
94
95 // Hardware capabilities (for use with ELF_AUX_HWCAP)
96 #define ELF_HWCAP_SPARC_FLUSH   1
97
98 struct file;
99 int load_elf(struct proc* p, struct file* f);
100
101 #endif /* !ROS_INC_ELF_H */