Add private get_memory_properties() syscall which allows one to retrieve the

address protection bits as well as the wiring flags for an arbitrary address
in a team's address space. Will be used in the debugger for the purposes
of the memory inspector/editor, in order to determine whether it can in fact
allow editing for the currently inspected address range.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42129 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rene Gollent 2011-06-12 20:17:14 +00:00
parent d63c093e9d
commit 36dc99a323
5 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1,21 @@
/*
* Copyright 2011, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#ifndef _LIBROOT_MEMORY_PRIVATE_H
#define _LIBROOT_MEMORY_PRIVATE_H
#include <OS.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
status_t get_memory_properties(team_id teamID, const void* address,
uint32* _protected, uint32* _lock);
__END_DECLS
#endif // _LIBROOT_MEMORY_PRIVATE_H

View File

@ -435,6 +435,11 @@ extern status_t _kern_sync_memory(void *address, size_t size, int flags);
extern status_t _kern_memory_advice(void *address, size_t size,
uint32 advice);
extern status_t _kern_get_memory_properties(team_id teamID,
const void *address,
uint32* _protected,
uint32* _lock);
/* kernel port functions */
extern port_id _kern_create_port(int32 queue_length, const char *name);
extern status_t _kern_close_port(port_id id);

View File

@ -6303,6 +6303,41 @@ _user_memory_advice(void* address, size_t size, uint32 advice)
}
status_t
_user_get_memory_properties(team_id teamID, const void* address,
uint32* _protected, uint32* _lock)
{
if (!IS_USER_ADDRESS(_protected) || !IS_USER_ADDRESS(_lock))
return B_BAD_ADDRESS;
AddressSpaceReadLocker locker;
status_t error = locker.SetTo(teamID);
if (error != B_OK)
return error;
VMArea* area = locker.AddressSpace()->LookupArea((addr_t)address);
if (area == NULL)
return B_NO_MEMORY;
uint32 protection = area->protection;
if (area->page_protections != NULL)
protection = get_area_page_protection(area, (addr_t)address);
uint32 wiring = area->wiring;
locker.Unlock();
error = user_memcpy(_protected, &protection, sizeof(protection));
if (error != B_OK)
return error;
error = user_memcpy(_lock, &wiring, sizeof(wiring));
return error;
}
// #pragma mark -- compatibility

View File

@ -20,6 +20,7 @@ MergeObject os_main.o :
fs_query.cpp
fs_volume.c
image.cpp
memory.cpp
parsedate.cpp
port.c
scheduler.c

View File

@ -0,0 +1,17 @@
/*
* Copyright 2011, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include <memory_private.h>
#include <OS.h>
#include <syscalls.h>
status_t
get_memory_properties(team_id teamID, const void* address, uint32* _protected,
uint32* _lock)
{
return _kern_get_memory_properties(teamID, address, _protected, _lock);
}