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:
parent
d63c093e9d
commit
36dc99a323
21
headers/private/libroot/memory_private.h
Normal file
21
headers/private/libroot/memory_private.h
Normal 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
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -20,6 +20,7 @@ MergeObject os_main.o :
|
||||
fs_query.cpp
|
||||
fs_volume.c
|
||||
image.cpp
|
||||
memory.cpp
|
||||
parsedate.cpp
|
||||
port.c
|
||||
scheduler.c
|
||||
|
17
src/system/libroot/os/memory.cpp
Normal file
17
src/system/libroot/os/memory.cpp
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user