summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-09-10 13:28:28 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-09-10 13:28:28 -0400
commit7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5 (patch)
treeaef9904e2495ce840319f2815cd859c47294c88a /include
parent032a7bc4d79efea100a00cf3464bea3249a07ff6 (diff)
downloadjove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.tar.gz
jove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.tar.bz2
jove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.zip
refactor paging code. regression on loading init program
Diffstat (limited to 'include')
-rw-r--r--include/arch/x86_64/page-mapping.h12
-rw-r--r--include/arch/x86_64/page.h13
-rw-r--r--include/elf.h110
-rw-r--r--include/init.h19
-rw-r--r--include/jove.h3
-rw-r--r--include/memory.h8
-rw-r--r--include/object.h19
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