diff --git a/headers/private/kernel/vm.h b/headers/private/kernel/vm.h index fffd9b5097..e82da57dd3 100644 --- a/headers/private/kernel/vm.h +++ b/headers/private/kernel/vm.h @@ -27,6 +27,7 @@ struct vnode; // area creation flags #define CREATE_AREA_DONT_WAIT 0x01 #define CREATE_AREA_UNMAP_ADDRESS_RANGE 0x02 +#define CREATE_AREA_DONT_CLEAR 0x04 #ifdef __cplusplus diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index eff22bbbaa..7f7f2437b5 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1768,6 +1768,8 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, page_num_t guardPages; bool canOvercommit = false; addr_t physicalBase = 0; + uint32 newPageState = (flags & CREATE_AREA_DONT_CLEAR) != 0 + ? PAGE_STATE_FREE : PAGE_STATE_CLEAR; TRACE(("create_anonymous_area [%d] %s: size 0x%lx\n", team, name, size)); @@ -1797,6 +1799,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, case B_PHYSICAL_BASE_ADDRESS: physicalBase = (addr_t)*address; addressSpec = B_ANY_KERNEL_ADDRESS; + wiring = B_CONTIGUOUS; break; default: @@ -1884,7 +1887,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, if (wiring == B_CONTIGUOUS) { // we try to allocate the page run here upfront as this may easily // fail for obvious reasons - page = vm_page_allocate_page_run(PAGE_STATE_CLEAR, physicalBase, + page = vm_page_allocate_page_run(newPageState, physicalBase, size / B_PAGE_SIZE); if (page == NULL) { status = B_NO_MEMORY; @@ -1957,7 +1960,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, # endif continue; #endif - vm_page* page = vm_page_allocate_page(PAGE_STATE_CLEAR, true); + vm_page* page = vm_page_allocate_page(newPageState, true); cache->InsertPage(page, offset); vm_map_page(area, page, address, protection);