aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-01-29 04:34:46 -0500
committerRaghuram Subramani <raghus2247@gmail.com>2025-01-29 04:34:46 -0500
commit80dd2a5024ebb1ed2bba60bebb9c7ef00fa81114 (patch)
tree733eed8276bbfd5b1251af45207204212aaebc1f
parentb5be8161819bb0b9d133a4381d4bb9b66da42a25 (diff)
virtual_mm: find_free_virtual_addresses should return a (void *)
-rw-r--r--kernel/include/mm/virtual_mm.h9
-rw-r--r--kernel/mm/virtual_mm/virtual_mm.c16
2 files changed, 18 insertions, 7 deletions
diff --git a/kernel/include/mm/virtual_mm.h b/kernel/include/mm/virtual_mm.h
index 849b370..58b8692 100644
--- a/kernel/include/mm/virtual_mm.h
+++ b/kernel/include/mm/virtual_mm.h
@@ -19,11 +19,13 @@
#ifndef __mm_virtual_mm_h
#define __mm_virtual_mm_h
+#include <common.h>
#include <stdbool.h>
#include <stdint.h>
#define PAGE_DIRECTORY_SIZE 1024
#define PAGE_TABLE_SIZE 1024
+#define PAGE_SIZE (4 * KiB)
#define PDE_PRESENT(x) x
#define PDE_WRITABLE(x) ((x) << 1)
@@ -88,9 +90,14 @@ void virtual_mm_initialize(void);
void virtual_mm_map_page(void *physical_address, void *virtual_address);
/*
+ * Unmap a page starting at virtual address
+ */
+void virtual_mm_unmap_page(void *virtual_address);
+
+/*
* Find a virtual address with n consecutive free addresses.
*/
-uint32_t virtual_mm_find_free_virtual_addresses(uint32_t n_pages);
+void *virtual_mm_find_free_virtual_addresses(uint32_t n_pages);
/*
* Allocate and map n pages.
diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c
index 4acf7c7..4bdb4ab 100644
--- a/kernel/mm/virtual_mm/virtual_mm.c
+++ b/kernel/mm/virtual_mm/virtual_mm.c
@@ -138,7 +138,7 @@ virtual_mm_unmap_page(void *virtual_address)
*pt_entry = 0;
}
-uint32_t
+void *
virtual_mm_find_free_virtual_addresses(uint32_t n)
{
/* Skip the first page directory, we don't wanna touch the first 4MiB. */
@@ -181,7 +181,8 @@ virtual_mm_find_free_virtual_addresses(uint32_t n)
}
if (++count == n)
- return VIRTUAL_ADDRESS(starting_pd_index, starting_pt_index);
+ return (void *) VIRTUAL_ADDRESS(starting_pd_index,
+ starting_pt_index);
}
}
}
@@ -193,13 +194,16 @@ virtual_mm_find_free_virtual_addresses(uint32_t n)
void *
virtual_mm_alloc_pages(uint32_t n_pages)
{
- uint32_t starting_address = virtual_mm_find_free_virtual_addresses(n_pages);
+ uint32_t starting_address
+ = (uint32_t) virtual_mm_find_free_virtual_addresses(n_pages);
if (starting_address == 0)
return 0;
- for (uint32_t i = 0; i < n_pages; i++)
- virtual_mm_map_page(physical_mm_allocate_block(),
- (void *) (starting_address + (i * 4096)));
+ for (uint32_t i = 0; i < n_pages; i++) {
+ void *virtual_address = (void *) (starting_address + (i * PAGE_SIZE));
+ void *physical_address = physical_mm_allocate_block();
+ virtual_mm_map_page(physical_address, virtual_address);
+ }
return (void *) starting_address;
}