summaryrefslogtreecommitdiff
path: root/kernel/memory/physalloc.h
diff options
context:
space:
mode:
authorGalen Sagarin <gps5307@rit.edu>2025-04-29 14:18:40 -0400
committerGalen Sagarin <gps5307@rit.edu>2025-04-29 14:18:40 -0400
commitae2cdd83ba4a0cae161db0b29031d5591005fa34 (patch)
tree82fbdfcbb1fe4e3b5e232db195c8c331d69489fd /kernel/memory/physalloc.h
parentStarted writing fat.c (diff)
parentfs header changes (diff)
downloadcomus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.gz
comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.tar.bz2
comus-ae2cdd83ba4a0cae161db0b29031d5591005fa34.zip
Merge branch 'main' of https://github.com/kenshineto/kern into fat32
Merging main into here
Diffstat (limited to 'kernel/memory/physalloc.h')
-rw-r--r--kernel/memory/physalloc.h35
1 files changed, 31 insertions, 4 deletions
diff --git a/kernel/memory/physalloc.h b/kernel/memory/physalloc.h
index 7afe998..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(int count);
+void *alloc_phys_pages_exact(size_t count);
/**
* Frees a single physical page in memory
@@ -39,6 +60,12 @@ void free_phys_page(void *ptr);
* @param ptr - the physical address of the first page
* @param count - the number of pages in the list
*/
-void free_phys_pages(void *ptr, int count);
+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 */