summaryrefslogtreecommitdiff
path: root/kernel/memory/physalloc.h
diff options
context:
space:
mode:
authorIan McFarlane <i.mcfarlane2002@gmail.com>2025-04-24 15:50:50 -0400
committerIan McFarlane <i.mcfarlane2002@gmail.com>2025-04-24 15:51:29 -0400
commit3c213ce446c6547c79f683f035b191e92b4e914e (patch)
treed05d172ba28e5e6eb0e607b51e1db92d30003508 /kernel/memory/physalloc.h
parentfix paging free fns (diff)
downloadcomus-3c213ce446c6547c79f683f035b191e92b4e914e.tar.gz
comus-3c213ce446c6547c79f683f035b191e92b4e914e.tar.bz2
comus-3c213ce446c6547c79f683f035b191e92b4e914e.zip
make alloc_pages_at() able to allocate noncontiguous physical pages
Diffstat (limited to 'kernel/memory/physalloc.h')
-rw-r--r--kernel/memory/physalloc.h33
1 files changed, 30 insertions, 3 deletions
diff --git a/kernel/memory/physalloc.h b/kernel/memory/physalloc.h
index d91c57a..e279409 100644
--- a/kernel/memory/physalloc.h
+++ b/kernel/memory/physalloc.h
@@ -11,11 +11,31 @@
#include <comus/memory.h>
+/// Represents some contiguous physical pages
+struct phys_page_slice {
+ void *pagestart;
+ size_t num_pages;
+};
+
+#define PHYS_PAGE_SLICE_NULL \
+ ((struct phys_page_slice){ .pagestart = NULL, .num_pages = 0 })
+
/**
* Initalize the physical page allocator
*/
void physalloc_init(struct memory_map *map);
+/*
+ * Allocates the first page(s) it finds. Returns a pointer to that page
+ * and, if there are (up to max_pages) extra pages free after it, it allocates
+ * them as well.
+ *
+ * @param max_pages - the maximum number of pages to mark as allocated
+ * @returns a slice of all of the allocated pages, num_pages will be
+ * <= max_pages
+ */
+struct phys_page_slice alloc_phys_page_withextra(size_t max_pages);
+
/**
* Allocates a single physical page in memory
* @preturns the physical address of the page
@@ -23,10 +43,11 @@ void physalloc_init(struct memory_map *map);
void *alloc_phys_page(void);
/**
- * Allocates count physical pages in memory
- * @returns the physical address of the first page
+ * Allocates count contiguous physical pages in memory
+ * @returns the physical address of the first page, or NULL if no
+ * contiguous pages exist.
*/
-void *alloc_phys_pages(size_t count);
+void *alloc_phys_pages_exact(size_t count);
/**
* Frees a single physical page in memory
@@ -41,4 +62,10 @@ void free_phys_page(void *ptr);
*/
void free_phys_pages(void *ptr, size_t count);
+/**
+ * Frees a slice of physical pages in memory
+ * @param slice - the pages to free
+ */
+void free_phys_pages_slice(struct phys_page_slice slice);
+
#endif /* physalloc.h */