aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-01-10 13:23:44 -0500
committerRaghuram Subramani <raghus2247@gmail.com>2025-01-10 13:23:44 -0500
commit350eb7ff40a007992d28fe597002bc1a3f76e585 (patch)
tree080265effc0c705d74b5cd73a917abc2b5c718b7
parent7ae57ec55f10967f591e10d30144610456985f9d (diff)
virtual_mm: Implement load_page_directory()
-rw-r--r--kernel/CMakeLists.txt1
-rw-r--r--kernel/include/mm/virtual_mm.h5
-rw-r--r--kernel/mm/virtual_mm/virtual_mm.c6
3 files changed, 12 insertions, 0 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 8238a5a..204295d 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -87,3 +87,4 @@ set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_COMPILER} <CMAKE_C_LINK_FLAGS> <FLAGS> <L
)
target_link_options(kernel PRIVATE ${LINKER_FLAGS})
+target_link_libraries(kernel PRIVATE gcc)
diff --git a/kernel/include/mm/virtual_mm.h b/kernel/include/mm/virtual_mm.h
index fa7f505..3f938d2 100644
--- a/kernel/include/mm/virtual_mm.h
+++ b/kernel/include/mm/virtual_mm.h
@@ -87,4 +87,9 @@ uint32_t *virtual_mm_lookup_table(uint32_t *page_table, uint32_t virtual_addr);
uint32_t *virtual_mm_lookup_directory(uint32_t *page_directory,
uint32_t virtual_addr);
+/*
+ * Loads a given page directory into CR0
+ */
+void virtual_mm_load_page_directory(uint32_t *page_directory);
+
#endif
diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c
index e53ff2b..6350c11 100644
--- a/kernel/mm/virtual_mm/virtual_mm.c
+++ b/kernel/mm/virtual_mm/virtual_mm.c
@@ -71,3 +71,9 @@ virtual_mm_lookup_directory(uint32_t *page_directory, uint32_t virtual_addr)
return NULL;
}
+
+ALWAYS_INLINE void
+virtual_mm_load_page_directory(uint32_t *page_directory)
+{
+ __asm__("movl %0, %%cr0" ::"r"(page_directory));
+}