summaryrefslogtreecommitdiff
path: root/src/include/paging.h
diff options
context:
space:
mode:
authorBrett Weiland <brett_weiland@bpcspace.com>2021-03-24 15:42:20 -0500
committerBrett Weiland <brett_weiland@bpcspace.com>2021-03-24 15:42:20 -0500
commitf90c075d5061b3a89316d6bf3d5b190d49049ccd (patch)
tree36265da568b852ca5c0a8b4affe706cda80c4a9d /src/include/paging.h
parent14b109ea24dc5cb1db948de57a2a44c80ef4622e (diff)
renamed: kernel/include/acpi.h -> include/acpi.h
renamed: kernel/include/libc.h -> include/libc.h renamed: kernel/include/paging.h -> include/paging.h renamed: kernel/include/printf.h -> include/printf.h renamed: kernel/include/serial.h -> include/serial.h renamed: kernel/include/video.h -> include/video.h new file: indigo_os renamed: kernel/libs/acpi.c -> kernel/acpi.c renamed: kernel/libs/drivers/serial.c -> kernel/drivers/serial.c renamed: kernel/libs/drivers/video.c -> kernel/drivers/video.c renamed: kernel/libs/libc.c -> kernel/libc.c renamed: kernel/libs/page.c -> kernel/page.c renamed: kernel/libs/printf.c -> kernel/printf.c renamed: kernel/libs/printf.h -> kernel/printf.h modified: makefile
Diffstat (limited to 'src/include/paging.h')
-rw-r--r--src/include/paging.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/include/paging.h b/src/include/paging.h
new file mode 100644
index 0000000..267da43
--- /dev/null
+++ b/src/include/paging.h
@@ -0,0 +1,71 @@
+#include <stdbool.h>
+//paging errors
+#define PAGEMAP_LOCATION 0x4000
+#ifndef _PAGE_H_
+#define _PAGE_H_
+#include <stdint.h>
+
+#define PAGE_VIRT_UNALIGNED 0x01
+#define PAGE_PHYS_UNALIGNED 0x02
+#define PAGE_PHYS_INVALID 0x03
+#define PAGE_VIRT_INVALID 0x04
+
+//*
+typedef struct __attribute__((packed)) {
+ unsigned int present : 1; // present, must be one when accessed.
+ unsigned int read_write : 1; // if set to one, read and write is set
+ unsigned int user : 1; // another bit we'll never use, for seperating CPL 0-2 and 3+
+ unsigned int writethrough_cache : 1; // honestly maybe I should look into caching
+ unsigned int cachable : 1; // hardware chaching. 0 is enabled, whats the worst that could happen?
+ unsigned int accessed : 1; // we'll never use any of these!
+ unsigned int zg0 : 1; // needs to be (and will be) zero'd
+ unsigned int size : 1;
+ unsigned int zg1 : 1; // needs to be (and will be) zero'd
+ unsigned int software_marks : 3; // available for our own use, I doubt we'll use it in such a simple thing
+
+ uintptr_t base_ptr : 40;
+ unsigned int sign:11;
+} page_entry;
+
+
+typedef struct __attribute__((packed)) {
+ page_entry pml4e[512];
+ page_entry pdpe[512];
+ page_entry pde[512];
+ page_entry pte[512];
+} page_table;
+
+#define MEM_AVAILABLE 1
+#define MEM_RESERVED 2
+#define MEM_APCI_RECLAIMABLE 3
+#define MEM_APCI_NVS 4
+#define MEM_BAD 5
+
+#define PAGE_SIZE_4K 12
+#define PAGE_SIZE_2M 21
+#define PAGE_SIZE_1G 30
+
+struct memory_table {
+ uint64_t base;
+ uint64_t length;
+ uint32_t type;
+ uint32_t ACPI;
+} __attribute__((packed));
+
+struct phys_map {
+ uint64_t map_size; //this way we won't have to calculate it every time
+ void *chunk_start;
+ uint64_t chunk_size;
+ uint64_t *buddies;
+} __attribute__((packed));
+
+
+extern void* _meminfo_loc;
+extern void* _stage2_pagetable;
+
+bool map_page(void *virtual_addr, void *physical_addr, uint8_t PAGE_SIZE);
+void debug_print_memory();
+void create_pagetable_stage2(uint64_t free_mem);
+void init_memory();
+#endif
+