diff --git a/sandbox/vm/include/socks/vm.h b/sandbox/vm/include/socks/vm.h index ae22c19..2ab244d 100644 --- a/sandbox/vm/include/socks/vm.h +++ b/sandbox/vm/include/socks/vm.h @@ -19,6 +19,9 @@ #define VM_PAGE_IS_RESERVED(pg) ((pg)->p_flags & VM_PAGE_RESERVED) +#define vm_page_foreach(pg, i) \ + for (vm_page_t *i = (pg); i; i = vm_page_get_next_tail(i)) + typedef phys_addr_t vm_alignment_t; typedef unsigned int vm_node_id_t; @@ -138,6 +141,7 @@ extern void vm_page_free(vm_page_t *pg); extern int vm_page_split(vm_page_t *pg, vm_page_t **a, vm_page_t **b); extern vm_page_t *vm_page_merge(vm_page_t *a, vm_page_t *b); extern vm_page_t *vm_page_get_buddy(vm_page_t *pg); +extern vm_page_t *vm_page_get_next_tail(vm_page_t *pg); extern size_t vm_bytes_to_pages(size_t bytes); diff --git a/sandbox/vm/page.c b/sandbox/vm/page.c index 6b18841..0b01054 100644 --- a/sandbox/vm/page.c +++ b/sandbox/vm/page.c @@ -260,3 +260,13 @@ vm_page_t *vm_page_get_buddy(vm_page_t *pg) paddr = paddr ^ vm_page_order_to_bytes(pg->p_order); return vm_page_get(paddr); } + +vm_page_t *vm_page_get_next_tail(vm_page_t *pg) +{ + vm_page_t *next = pg + 1; + if (next->p_flags & VM_PAGE_HEAD || !(next->p_flags & VM_PAGE_HUGE)) { + return NULL; + } + + return next; +}