Implement a vm_block_address_range() function which creates an area with no
mapped pages and a non-read and non-write protection to block a certain address range from being used by anything. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33030 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
425cb3d716
commit
0f4242de40
@ -60,6 +60,7 @@ area_id create_area_etc(team_id team, const char *name, void **address,
|
|||||||
area_id transfer_area(area_id id, void** _address, uint32 addressSpec,
|
area_id transfer_area(area_id id, void** _address, uint32 addressSpec,
|
||||||
team_id target, bool kernel);
|
team_id target, bool kernel);
|
||||||
|
|
||||||
|
status_t vm_block_address_range(const char* name, void* address, addr_t size);
|
||||||
status_t vm_unreserve_address_range(team_id team, void *address, addr_t size);
|
status_t vm_unreserve_address_range(team_id team, void *address, addr_t size);
|
||||||
status_t vm_reserve_address_range(team_id team, void **_address,
|
status_t vm_reserve_address_range(team_id team, void **_address,
|
||||||
uint32 addressSpec, addr_t size, uint32 flags);
|
uint32 addressSpec, addr_t size, uint32 flags);
|
||||||
|
@ -1672,6 +1672,46 @@ err1:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
vm_block_address_range(const char* name, void* address, addr_t size)
|
||||||
|
{
|
||||||
|
if (!arch_vm_supports_protection(0))
|
||||||
|
return B_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
AddressSpaceWriteLocker locker;
|
||||||
|
status_t status = locker.SetTo(vm_kernel_address_space_id());
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
vm_address_space* addressSpace = locker.AddressSpace();
|
||||||
|
|
||||||
|
// create an anonymous cache
|
||||||
|
vm_cache* cache;
|
||||||
|
status = VMCacheFactory::CreateAnonymousCache(cache, false, 0, 0, false);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
cache->temporary = 1;
|
||||||
|
cache->virtual_end = size;
|
||||||
|
cache->scan_skip = 1;
|
||||||
|
cache->Lock();
|
||||||
|
|
||||||
|
vm_area* area;
|
||||||
|
void *areaAddress = address;
|
||||||
|
status = map_backing_store(addressSpace, cache, &areaAddress, 0, size,
|
||||||
|
B_EXACT_ADDRESS, B_ALREADY_WIRED, 0, REGION_NO_PRIVATE_MAP, &area, name,
|
||||||
|
false, true);
|
||||||
|
if (status != B_OK) {
|
||||||
|
cache->ReleaseRefAndUnlock();
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
cache->Unlock();
|
||||||
|
area->cache_type = CACHE_TYPE_RAM;
|
||||||
|
return area->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
vm_unreserve_address_range(team_id team, void* address, addr_t size)
|
vm_unreserve_address_range(team_id team, void* address, addr_t size)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user