diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/arch/x86_64/page-mapping.h | 12 | ||||
-rw-r--r-- | include/arch/x86_64/page.h | 13 | ||||
-rw-r--r-- | include/elf.h | 110 | ||||
-rw-r--r-- | include/init.h | 19 | ||||
-rw-r--r-- | include/jove.h | 3 | ||||
-rw-r--r-- | include/memory.h | 8 | ||||
-rw-r--r-- | include/object.h | 19 |
7 files changed, 154 insertions, 30 deletions
diff --git a/include/arch/x86_64/page-mapping.h b/include/arch/x86_64/page-mapping.h index fd620ea..8389132 100644 --- a/include/arch/x86_64/page-mapping.h +++ b/include/arch/x86_64/page-mapping.h @@ -3,13 +3,19 @@ #include "arch/x86_64/page.h" -pmle_t *page_mapping_traverse(pmle_t *pml4, uint8_t depth, uint16_t *path); +pmle_t *pml4_traverse(pmle_t *pml4, uint8_t depth, uint16_t *path); /**@FUNC Get the pmle associated with this virtual address down to a given depth. * At depth=0, gets &pml4[pml4i] * At depth=1, gets &pml4[pml4i][pml3i] * At depth=2, gets &pml4[pml4i][pml3i][pml2i] - * etc...*/ -pmle_t *mem_mapping_vptr_mapping(pmle_t *pml4, uint8_t depth, uintptr_t vptr); + * etc... + * @PARAM pml4 table to get mapping from. + * @PARAM depth how deep to traverse for the mapping. + * @PARAM vptr address to get mapping for. + * @RETURN pointer to pmle (if exists)*/ +pmle_t *pml4_get_mapping(pmle_t *pml4, uint8_t depth, uintptr_t vptr); + +int pml4_try_map(pmle_t *pml4, uintptr_t pptr, uintptr_t vptr); #endif diff --git a/include/arch/x86_64/page.h b/include/arch/x86_64/page.h index 7c6186a..910b898 100644 --- a/include/arch/x86_64/page.h +++ b/include/arch/x86_64/page.h @@ -36,13 +36,16 @@ typedef uint16_t pmli_t; #define PML_SHL(l) (((l) * 9) + 3) #define PML_I_FOR_LAYER(v, l) (((v) >> PML_SHL(l)) % 512) -uintptr_t vmem_ident_tophys(void *vptr); -void *vmem_phys_tovirt(uintptr_t pptr); -uintptr_t vmem_tophys_koff(uintptr_t v); +uintptr_t vptr_tophys(void *vptr); +uintptr_t vptr_tophys_koff(uintptr_t v); + +void *pptr_tovirt_ident(uintptr_t pptr); void *pmle_get_page(pmle_t entry); -uint8_t pmle_level(pmle_t entry); -int untyped_retype_page(objdir_entry_t *untyped_entry, void **dest_ptr); +void pml4_setup_init(void); +void pml4_setup(pmle_t *pml4); + +void pml4_get_path(uintptr_t vptr, uint8_t depth, uint16_t *path); #endif diff --git a/include/elf.h b/include/elf.h new file mode 100644 index 0000000..05e3e83 --- /dev/null +++ b/include/elf.h @@ -0,0 +1,110 @@ +#ifndef _JOVE_ELF_H +#define _JOVE_ELF_H 1 + +#include <stdint.h> + +/*A subset of the SystemV ELF ABI that only loads statically linked binaries.*/ + +typedef uint16_t Elf32_Half; +typedef uint32_t Elf32_Word; +typedef uint32_t Elf32_Addr; +typedef uint32_t Elf32_Off; + +typedef Elf32_Half Elf64_Half; +typedef Elf32_Word Elf64_Word; +typedef uint64_t Elf64_Xword; +typedef uintptr_t Elf64_Addr; +typedef uint64_t Elf64_Off; + +enum { + EI_MAG0 = 0, + EI_MAG1, + EI_MAG2, + EI_MAG3, + EI_CLASS, + EI_DATA, + EI_VERSION, + EI_OSABI, + EI_ABIVERSION, + EI_PAD +}; +#define EI_NIDENT 16 + +#define ELFMAG0 0x7f +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' + +#define ELFCLASSNONE 0 +#define ELFCLASS64 2 + +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 + +#define ET_NONE 0 +#define ET_EXEC 2 + +#define EM_X86_64 62 + +#define EV_NONE 0 +#define EV_CURRENT 1 + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_NOBITS 8 + +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + +#define PT_NULL 0 +#define PT_LOAD 1 + +#define PF_X 1 +#define PF_W 2 +#define PF_R 4 + +typedef struct +{ + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + +int elf64_ehdr_valid(Elf64_Ehdr *ehdr); + +#endif diff --git a/include/init.h b/include/init.h index aa722b1..2174785 100644 --- a/include/init.h +++ b/include/init.h @@ -1,9 +1,24 @@ #ifndef _JOVE_INIT_H #define _JOVE_INIT_H 1 -#ifdef __x86_64__ +#include <stdint.h> -#endif +enum { + INIT_OBJECT_ROOTDIR = 0, + INIT_OBJECT_PAGEMAP, + INIT_OBJECT_PROCESSOR_DIR, + INIT_OBJECT_UNTYPED_DIR, + INIT_OBJECT_INITRD_DIR, + INIT_OBJECT_TCB, + INIT_OBJECT_MESSAGE, + INIT_OBJECT_LOG +}; + +#include "object.h" +extern objdir_t _initDirectory; + +uintptr_t init_alloc_pageframe(); +void init_map_pageframe(uintptr_t pptr, uintptr_t vptr, uint8_t pflags); void init_load(void); diff --git a/include/jove.h b/include/jove.h index 63d2ce9..fc4c91f 100644 --- a/include/jove.h +++ b/include/jove.h @@ -6,9 +6,6 @@ extern void (*_kernel_start)(void); extern void (*_kernel_end)(void); -#include "object.h" -extern objdir_t _initDirectory; - NORETURN void hcf(void); #endif diff --git a/include/memory.h b/include/memory.h index 2f75b60..901060c 100644 --- a/include/memory.h +++ b/include/memory.h @@ -9,11 +9,9 @@ typedef uintptr_t virtptr_t; #define KERNEL_STACK_SIZE 0x1000 -void vmem_setup(void); +void mapping_setup_init(void); +void mapping_setup(objdir_entry_t *mapping); -int untyped_retype_kernel_stack(objdir_entry_t *untyped_entry, objdir_entry_t *dest_entry); - -void *ko_entry_data(objdir_entry_t *entry); -uintptr_t ko_data_toentry(uintptr_t vptr); +int mapping_try_map_obj(objdir_entry_t *mapping, uintptr_t vptr, objdir_entry_t *obj); #endif diff --git a/include/object.h b/include/object.h index c8621ee..4cf5159 100644 --- a/include/object.h +++ b/include/object.h @@ -2,17 +2,7 @@ #define _JOVE_OBJECT_H #include <stdint.h> - -enum { - INIT_OBJECT_ROOTDIR = 0, - INIT_OBJECT_PAGEMAP, - INIT_OBJECT_PROCESSOR_DIR, - INIT_OBJECT_UNTYPED_DIR, - INIT_OBJECT_INITRD_DIR, - INIT_OBJECT_TCB, - INIT_OBJECT_MESSAGE, - INIT_OBJECT_LOG -}; +#include <stddef.h> enum { @@ -64,13 +54,18 @@ typedef struct jove_ObjectDirectory objdir_entry_t *objdir_seek(objdir_t *dir, uint8_t *path, unsigned long pathw); unsigned long objdir_pathw(objdir_t *dir, uint8_t *path); +void *ko_entry_data(objdir_entry_t *entry); +uintptr_t ko_data_toentry(uintptr_t vptr); + int ko_message_unmap(objdir_entry_t *message, uintptr_t *saveptr); int ko_message_remap(objdir_entry_t *message); void ko_message_move(objdir_entry_t *message, uintptr_t vptr); +int ko_untyped_split(objdir_entry_t *untyped, objdir_entry_t *dest, size_t bytes); + int ko_untyped_retype_objdir(objdir_entry_t *target); int ko_untyped_retype_memory_mapping(objdir_entry_t *target); int ko_untyped_retype_tcb(objdir_entry_t *target); -int ko_untyped_retype_message(objdir_entry_t *target); +int ko_untyped_retype_message(objdir_entry_t *target, uintptr_t vptr); #endif |