aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/paging/paging.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/paging/paging.h')
-rw-r--r--src/kernel/paging/paging.h120
1 files changed, 52 insertions, 68 deletions
diff --git a/src/kernel/paging/paging.h b/src/kernel/paging/paging.h
index 681b84e..85ef120 100644
--- a/src/kernel/paging/paging.h
+++ b/src/kernel/paging/paging.h
@@ -2,73 +2,57 @@
#define MELVIX_PAGING_H
#include <stdint.h>
-#include "../interrupts/interrupts.h"
-
-typedef struct page {
- uint32_t present : 1; // Page present in memory
- uint32_t rw : 1; // Read-only if clear, readwrite if set
- uint32_t user : 1; // Supervisor level only if clear
- uint32_t accessed : 1; // Has the page been accessed since last refresh?
- uint32_t dirty : 1; // Has the page been written to since last refresh?
- uint32_t unused : 7; // Amalgamation of unused and reserved bits
- uint32_t frame : 20; // Frame address (shifted right 12 bits)
-} page_t;
-
-typedef struct page_table {
- page_t pages[1024];
-} page_table_t;
-
-typedef struct page_directory {
- page_table_t *tables[1024];
- uint32_t tablesPhysical[1024];
- uint32_t physicalAddr;
-} page_directory_t;
-
-/**
- * Initialize the environment and enable paging
- */
-void initialise_paging();
-
-/**
- * Enable paging bit in CR0 (without initializing)
- */
-void enable_paging();
-
-/**
- * Disable paging bit in CR0
- */
-void disable_paging();
-
-/**
- * Load the page directory into the CR3 register
- * @param new The page directory
- */
-void switch_page_directory(page_directory_t *new);
-
-/**
- * Get a specific page pointer
- * @param address The page address
- * @param make If 1 create the page first
- * @param dir The page directory
- * @return The page pointer
- */
-page_t *get_page(uint32_t address, int make, page_directory_t *dir);
-
-/**
- * Page fault handler
- * @param r The IRQ registers
- */
-void page_fault(struct regs *r);
-
-void alloc_frame(page_t *page, int is_kernel, int is_writeable);
-
-void free_frame(page_t *page);
-
-/**
- * Copy/clone a page directory
- * @param src The page directory
- * @return A new page directory pointer
- */
-page_directory_t *clone_directory(page_directory_t *src);
+
+#define PD_PRESENT 1 << 0
+#define PD_RW 1 << 1
+#define PD_ALL_PRIV 1 << 2
+#define PD_WRITETHR 1 << 3
+#define PD_CACHE_D 1 << 4
+#define PD_ACCESSED 1 << 5
+#define PD_4M_PAGE 1 << 7
+
+#define PT_PRESENT 1 << 0
+#define PT_RW 1 << 1
+#define PT_ALL_PRIV 1 << 2
+#define PT_WRITETHR 1 << 3
+#define PT_CACHE_D 1 << 4
+#define PT_ACCESSED 1 << 5
+#define PT_DIRTY 1 << 6
+#define PT_GLOBAL 1 << 8
+#define PT_USED 1 << 9
+
+void paging_install();
+
+void paging_enable();
+
+void paging_disable();
+
+void paging_map(uint32_t phy, uint32_t virt, uint16_t flags);
+
+uint32_t paging_get_phys(uint32_t virt);
+
+uint16_t paging_get_flags(uint32_t virt);
+
+void paging_set_flags(uint32_t virt, uint32_t count, uint16_t flags);
+
+void paging_set_flag_up(uint32_t virt, uint32_t count, uint32_t flag);
+
+void paging_set_flag_down(uint32_t virt, uint32_t count, uint32_t flag);
+
+void paging_set_present(uint32_t virt, uint32_t count);
+
+void paging_set_absent(uint32_t virt, uint32_t count);
+
+void paging_set_used(uint32_t virt, uint32_t count);
+
+void paging_set_free(uint32_t virt, uint32_t count);
+
+void paging_set_user(uint32_t virt, uint32_t count);
+
+uint32_t paging_find_pages(uint32_t count);
+
+uint32_t paging_alloc_pages(uint32_t count);
+
+uint32_t paging_get_used_pages();
#endif