diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-26 17:50:11 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-26 17:50:11 +0200 |
| commit | d98ec57128628b81fcd32269a92742a037b7f713 (patch) | |
| tree | 0e3f8d78d8347ef0a6e69d41b9d9be20c822b642 /include | |
| parent | a64f3588ff5da7f148659ccb0eff844ccfb57088 (diff) | |
| download | kmi-d98ec57128628b81fcd32269a92742a037b7f713.tar.gz kmi-d98ec57128628b81fcd32269a92742a037b7f713.zip | |
First useful jump to userspace!
Diffstat (limited to 'include')
| -rw-r--r-- | include/apos/elf.h | 170 | ||||
| -rw-r--r-- | include/apos/initrd.h | 3 | ||||
| -rw-r--r-- | include/apos/proc.h | 2 | ||||
| -rw-r--r-- | include/apos/utils.h | 2 | ||||
| -rw-r--r-- | include/apos/vmem.h | 8 |
5 files changed, 174 insertions, 11 deletions
diff --git a/include/apos/elf.h b/include/apos/elf.h index 492c414..df07b7f 100644 --- a/include/apos/elf.h +++ b/include/apos/elf.h @@ -5,20 +5,67 @@ #include <apos/types.h> #include <apos/vmem.h> -__packed struct elf_header { - uint64_t ei_magic; +#define EI_MAGIC 0x7f454c46 + +#define ELFCLASSNONE 0x0 +#define ELFCLASS32 0x1 +#define ELFCLASS64 0x2 + +#define ELFDATANONE 0x0 +#define ELFDATA2LSB 0x1 +#define ELFDATA2MSB 0x2 + +#define ELFOSABI_NONE 0x0 +#define ELFOSABI_SYSV 0x0 +#define ELFOSABI_NETBSD 0x2 +#define ELFOSABI_LINUX 0x3 +#define ELFOSABI_HURD 0x4 +#define ELFOSABI_FREEBSD 0x9 +#define ELFOSABI_OPENBSD 0xc + +#define ET_NONE 0x0 +#define ET_REL 0x1 +#define ET_EXEC 0x2 +#define ET_DYN 0x3 +#define ET_CORE 0x4 + +#define EM_RISCV 0xf3 + +__packed struct elf_ident { + uint32_t ei_magic; uint8_t ei_class; uint8_t ei_data; uint8_t ei_version; uint8_t ei_osabi; uint8_t ei_abiversion; - uint8_t e_pad; + uint8_t ei_pad[7]; +}; + +__packed struct elf32_header { + struct elf_ident e_ident; + uint16_t e_type; + uint16_t e_machine; + uint32_t e_version; + uint32_t e_entry; + uint32_t e_phoff; + uint32_t e_shoff; + uint32_t e_flags; + uint16_t e_ehsize; + uint16_t e_phentsize; + uint16_t e_phnum; + uint16_t e_shentsize; + uint16_t e_shnum; + uint16_t e_shstrndx; +}; + +__packed struct elf64_header { + struct elf_ident e_ident; uint16_t e_type; uint16_t e_machine; uint32_t e_version; - void *e_entry; - void *e_phoff; - void *e_shoff; + uint64_t e_entry; + uint64_t e_phoff; + uint64_t e_shoff; uint32_t e_flags; uint16_t e_ehsize; uint16_t e_phentsize; @@ -28,6 +75,115 @@ __packed struct elf_header { uint16_t e_shstrndx; }; -vm_t bin_entry(vm_t bin); +#define PT_NULL 0x0 +#define PT_LOAD 0x1 +#define PT_DYNAMIC 0x2 +#define PT_INTERP 0x3 +#define PT_NOTE 0x4 +#define PT_SHLIB 0x5 +#define PT_PHDR 0x6 +#define PT_TLS 0x7 +#define PT_LOOS 0x60000000 +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + +#define PF_X (1 << 0) +#define PF_W (1 << 1) +#define PF_R (1 << 2) + +__packed struct program32_header { + uint32_t p_type; + uint32_t p_offset; + uint32_t p_vaddr; + uint32_t p_paddr; + uint32_t p_filesz; + uint32_t p_memsz; + uint32_t p_flags; + uint32_t p_align; +}; + +__packed struct program64_header { + uint32_t p_type; + uint32_t p_flags; + uint64_t p_offset; + uint64_t p_vaddr; + uint64_t p_paddr; + uint64_t p_filesz; + uint64_t p_memsz; + uint64_t p_align; +}; + +#define SHT_NULL 0x0 +#define SH_PROGBITS 0x1 +#define SHT_SYMTAB 0x2 +#define SHT_STRTAB 0x3 +#define SHT_RELA 0x4 +#define SHT_HASH 0x5 +#define SHT_DYNAMIC 0x6 +#define SHT_NOTE 0x7 +#define SHT_NOBITS 0x8 +#define SHT_REL 0x9 +#define SHT_SHLIB 0x0a +#define SHT_DYNSYM 0x0b +#define SHT_INIT_ARRAY 0x0e +#define SHT_FINI_ARRAY 0x0f +#define SHT_PREINIT_ARRAY 0x10 +#define SHT_GROUP 0x11 +#define SHT_SYMTAB_SHNDX 0x12 +#define SHT_NUM 0x13 + +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 +#define SHF_EXECINSTR 0x4 +#define SHF_MERGE 0x10 +#define SHF_STRINGS 0x20 +#define SHF_INFO_LINK 0x40 +#define SHF_LINK_ODER 0x80 +#define SHF_OS_NONCONFORMING 0x100 +#define SHF_GROUP 0x200 +#define SHF_TLS 0x400 +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 + +__packed struct section32_header { + uint32_t sh_name; + uint32_t sh_type; + uint32_t sh_flags; + uint32_t sh_addr; + uint32_t sh_offset; + uint32_t sh_size; + uint32_t sh_link; + uint32_t sh_info; + uint32_t sh_addralign; + uint32_t sh_entsize; +}; + +__packed struct section64_header { + uint32_t sh_name; + uint32_t sh_type; + uint64_t sh_flags; + uint64_t sh_addr; + uint64_t sh_offset; + uint64_t sh_size; + uint32_t sh_link; + uint32_t sh_info; + uint64_t sh_addralign; + uint64_t s_entsize; +}; + +#define elf_indent(e) ((struct elf_ident *)e) +#define elf64_header(e) ((struct elf64_header *)e) +#define elf32_header(e) ((struct elf32_header *)e) +#define program64_header(p) ((struct program64_header *)p) +#define program32_header(p) ((struct program32_header *)p) +#define section64_header(s) ((struct section64_header *)s) +#define section32_header(s) ((struct section32_header *)s) + +#define elf_header_prop(c, e, p) (c == ELFCLASS64 ? elf64_header(e)->p : elf32_header(e)->p) +#define program_header_prop(c, e, p) (c == ELFCLASS64 ? program64_header(e)->p : program32_header(e)->p) +#define section_header_prop(c, e, p) (c == ELFCLASS64 ? section64_header(e)->p : section32_header(e)->p) + +vm_t prepare_proc(struct tcb *t, vm_t p); #endif /* APOS_ELF_H */ diff --git a/include/apos/initrd.h b/include/apos/initrd.h index 1e1129c..4b28ba8 100644 --- a/include/apos/initrd.h +++ b/include/apos/initrd.h @@ -3,9 +3,10 @@ #include <apos/types.h> #include <apos/pmem.h> +#include <apos/vmem.h> size_t get_init_size(void *fdt); -void move_init(void *fdt, void *target); +vm_t get_init_base(void *fdt); pm_t get_initrdtop(void *fdt); pm_t get_initrdbase(void *fdt); diff --git a/include/apos/proc.h b/include/apos/proc.h index 7506b10..8071dda 100644 --- a/include/apos/proc.h +++ b/include/apos/proc.h @@ -2,6 +2,6 @@ #define APOS_PROC_H #include <apos/tcb.h> -void jump_to_userspace(struct tcb *t, char **argv, int argc); +void jump_to_userspace(struct tcb *t, vm_t bin, int argc, char **argv); #endif /* APOS_PROC_H */ diff --git a/include/apos/utils.h b/include/apos/utils.h index f1e79fa..eff473f 100644 --- a/include/apos/utils.h +++ b/include/apos/utils.h @@ -33,6 +33,8 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define ALIGNED(x, a) ((x) % a == 0) +#define ptradd(x, y) (((vm_t)(x)) + ((vm_t)(y))) + #include <apos/types.h> static inline size_t align_up(size_t val, size_t a) diff --git a/include/apos/vmem.h b/include/apos/vmem.h index 4cc4895..b7522d2 100644 --- a/include/apos/vmem.h +++ b/include/apos/vmem.h @@ -30,7 +30,7 @@ struct sp_mem { #define __pa(x) (((char *)(x)) + RAM_BASE - VM_DMAP) #define __page(x) ((x) / BASE_PAGE_SIZE) #define __addr(x) ((x) * BASE_PAGE_SIZE) -#define __pages(x) (__page(x)) +#define __pages(x) (aligned((x), BASE_PAGE_SIZE) ? __page((x)) : __page((x) + BASE_PAGE_SIZE)) #define __bytes(x) (__addr(x)) /* general overview of the different functions: @@ -49,7 +49,11 @@ int stat_vmem(struct vm_branch_t *branch, vm_t vaddr, pm_t *paddr, int sp_mem_init(struct sp_reg_root *r, vm_t start, size_t nums); -vm_t alloc_uvmem(struct tcb *r, size_t s, uint8_t flags); +vm_t alloc_region(struct sp_reg_root *r, size_t size, size_t *actual_size); +vm_t alloc_fixed_region(struct sp_reg_root *r, vm_t start, size_t size, size_t *actual_size); +void free_region(struct sp_reg_root *r, vm_t start); + +vm_t alloc_uvmem(struct tcb *r, size_t size, uint8_t flags); void free_uvmem(struct tcb *r, vm_t a); vm_t map_fill_region(struct vm_branch_t *b, vm_t start, size_t bytes, uint8_t flags); |
