feat: wrapper function for bootstraping user program
[lunaix-os.git] / lunaix-os / includes / lunaix / elf.h
1 #ifndef __LUNAIX_ELF_H
2 #define __LUNAIX_ELF_H
3
4 #include <lunaix/types.h>
5
6 typedef unsigned int elf32_ptr_t;
7 typedef unsigned short elf32_hlf_t;
8 typedef unsigned int elf32_off_t;
9 typedef unsigned int elf32_swd_t;
10 typedef unsigned int elf32_wrd_t;
11
12 #define ET_NONE 0
13 #define ET_EXEC 2
14
15 #define PT_LOAD 1
16
17 #define PF_X 0x1
18 #define PF_W 0x2
19 #define PF_R 0x4
20
21 #define EM_NONE 0
22 #define EM_386 3
23
24 #define EV_CURRENT 1
25
26 // [0x7f, 'E', 'L', 'F']
27 #define ELFMAGIC 0x464c457fU
28 #define ELFCLASS32 1
29 #define ELFCLASS64 2
30 #define ELFDATA2LSB 1
31 #define ELFDATA2MSB 2
32
33 #define EI_CLASS 4
34 #define EI_DATA 5
35
36 struct elf32_ehdr
37 {
38     u8_t e_ident[16];
39     elf32_hlf_t e_type;
40     elf32_hlf_t e_machine;
41     elf32_wrd_t e_version;
42     elf32_ptr_t e_entry;
43     elf32_off_t e_phoff;
44     elf32_off_t e_shoff;
45     elf32_wrd_t e_flags;
46     elf32_hlf_t e_ehsize;
47     elf32_hlf_t e_phentsize;
48     elf32_hlf_t e_phnum;
49     elf32_hlf_t e_shentsize;
50     elf32_hlf_t e_shnum;
51     elf32_hlf_t e_shstrndx;
52 };
53
54 struct elf32_phdr
55 {
56     elf32_wrd_t p_type;
57     elf32_off_t p_offset;
58     elf32_ptr_t p_va;
59     elf32_ptr_t p_pa;
60     elf32_wrd_t p_filesz;
61     elf32_wrd_t p_memsz;
62     elf32_wrd_t p_flags;
63     elf32_wrd_t p_align;
64 };
65
66 #define SIZE_EHDR sizeof(struct elf32_ehdr)
67 #define SIZE_PHDR sizeof(struct elf32_phdr)
68
69 static inline int
70 elf_check_exec(struct elf32_ehdr* ehdr)
71 {
72     return *(u32_t*)(ehdr->e_ident) == ELFMAGIC &&
73            ehdr->e_ident[EI_CLASS] == ELFCLASS32 &&
74            ehdr->e_ident[EI_DATA] == ELFDATA2LSB && ehdr->e_type == ET_EXEC &&
75            ehdr->e_machine == EM_386;
76 }
77 #endif /* __LUNAIX_ELF_H */