From 6db6b628d6fdad197f44cc51fea342e888064575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 16 Jul 2008 23:32:25 +0000 Subject: [PATCH] * Added B_PHYSICAL_BASE_ADDRESS address specification for anonymous areas. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26456 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/drivers/KernelExport.h | 1 + headers/private/kernel/vm_page.h | 3 ++- src/system/kernel/vm/vm.cpp | 8 +++++++- src/system/kernel/vm/vm_page.cpp | 7 ++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/headers/os/drivers/KernelExport.h b/headers/os/drivers/KernelExport.h index 8bbf0755d3..039d96517b 100644 --- a/headers/os/drivers/KernelExport.h +++ b/headers/os/drivers/KernelExport.h @@ -86,6 +86,7 @@ typedef struct { /* address specifications for mapping physical memory */ #define B_ANY_KERNEL_BLOCK_ADDRESS (B_ANY_KERNEL_ADDRESS + 1) +#define B_PHYSICAL_BASE_ADDRESS (B_ANY_KERNEL_ADDRESS + 2) /* area protection flags for the kernel */ #define B_KERNEL_READ_AREA 16 diff --git a/headers/private/kernel/vm_page.h b/headers/private/kernel/vm_page.h index 06bbe69cba..dc916b3026 100644 --- a/headers/private/kernel/vm_page.h +++ b/headers/private/kernel/vm_page.h @@ -48,7 +48,8 @@ void vm_page_reserve_pages(uint32 count); struct vm_page *vm_page_allocate_page(int pageState, bool reserved); status_t vm_page_allocate_pages(int pageState, struct vm_page **pages, uint32 numPages); -struct vm_page *vm_page_allocate_page_run(int state, addr_t length); +struct vm_page *vm_page_allocate_page_run(int state, addr_t base, + addr_t length); struct vm_page *vm_page_at_index(int32 index); struct vm_page *vm_lookup_page(addr_t pageNumber); diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 4a5202e1ca..9bcbff6124 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1573,6 +1573,7 @@ vm_create_anonymous_area(team_id team, const char *name, void **address, vm_page *page = NULL; bool isStack = (protection & B_STACK_AREA) != 0; bool canOvercommit = false; + addr_t physicalBase = 0; TRACE(("create_anonymous_area %s: size 0x%lx\n", name, size)); @@ -1597,6 +1598,10 @@ vm_create_anonymous_area(team_id team, const char *name, void **address, case B_ANY_KERNEL_ADDRESS: case B_ANY_KERNEL_BLOCK_ADDRESS: break; + case B_PHYSICAL_BASE_ADDRESS: + physicalBase = (addr_t)*address; + addressSpec = B_ANY_KERNEL_ADDRESS; + break; default: return B_BAD_VALUE; @@ -1629,7 +1634,8 @@ 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, size / B_PAGE_SIZE); + page = vm_page_allocate_page_run(PAGE_STATE_CLEAR, physicalBase, + size / B_PAGE_SIZE); if (page == NULL) return B_NO_MEMORY; } diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index b1da712dca..088ef39881 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -1761,14 +1761,15 @@ vm_page_allocate_pages(int pageState, vm_page **pages, uint32 numPages) vm_page * -vm_page_allocate_page_run(int pageState, addr_t length) +vm_page_allocate_page_run(int pageState, addr_t base, addr_t length) { vm_page *firstPage = NULL; - uint32 start = 0; + uint32 start = base >> PAGE_SHIFT; InterruptsSpinLocker locker(sPageLock); - if (sFreePageQueue.count + sClearPageQueue.count - sReservedPages < length) { + if (sFreePageQueue.count + sClearPageQueue.count - sReservedPages + < length) { // TODO: add more tries, ie. free some inactive, ... // no free space return NULL;