diff options
author | Ian McFarlane <i.mcfarlane2002@gmail.com> | 2025-04-24 15:50:50 -0400 |
---|---|---|
committer | Ian McFarlane <i.mcfarlane2002@gmail.com> | 2025-04-24 15:51:29 -0400 |
commit | 3c213ce446c6547c79f683f035b191e92b4e914e (patch) | |
tree | d05d172ba28e5e6eb0e607b51e1db92d30003508 /kernel/memory/physalloc.h | |
parent | fix paging free fns (diff) | |
download | comus-3c213ce446c6547c79f683f035b191e92b4e914e.tar.gz comus-3c213ce446c6547c79f683f035b191e92b4e914e.tar.bz2 comus-3c213ce446c6547c79f683f035b191e92b4e914e.zip |
make alloc_pages_at() able to allocate noncontiguous physical pages
Diffstat (limited to '')
-rw-r--r-- | kernel/memory/physalloc.h | 33 |
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 */ |