diff options
Diffstat (limited to 'src/kernel/paging/paging.h')
-rw-r--r-- | src/kernel/paging/paging.h | 120 |
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 |