Added vm_[un]wire_page(), which are essentially versions of
[un]lock_memory_etc() optimized for a single page. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36156 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -43,6 +43,10 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
|
||||
bool implicit; // range created automatically
|
||||
VMAreaUnwiredWaiterList waiters;
|
||||
|
||||
VMAreaWiredRange()
|
||||
{
|
||||
}
|
||||
|
||||
VMAreaWiredRange(addr_t base, size_t size, bool writable, bool implicit)
|
||||
:
|
||||
area(NULL),
|
||||
@@ -53,6 +57,15 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
|
||||
{
|
||||
}
|
||||
|
||||
void SetTo(addr_t base, size_t size, bool writable, bool implicit)
|
||||
{
|
||||
this->area = NULL;
|
||||
this->base = base;
|
||||
this->size = size;
|
||||
this->writable = writable;
|
||||
this->implicit = implicit;
|
||||
}
|
||||
|
||||
bool IntersectsWith(addr_t base, size_t size) const
|
||||
{
|
||||
return this->base + this->size - 1 >= base
|
||||
@@ -63,6 +76,16 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
|
||||
typedef SinglyLinkedList<VMAreaWiredRange> VMAreaWiredRangeList;
|
||||
|
||||
|
||||
struct VMPageWiringInfo {
|
||||
VMAreaWiredRange range;
|
||||
addr_t physicalAddress;
|
||||
// the actual physical address corresponding to
|
||||
// the virtual address passed to vm_wire_page()
|
||||
// (i.e. with in-page offset)
|
||||
vm_page* page;
|
||||
};
|
||||
|
||||
|
||||
struct VMArea {
|
||||
char* name;
|
||||
area_id id;
|
||||
|
||||
@@ -24,6 +24,7 @@ struct VMArea;
|
||||
struct VMCache;
|
||||
struct vm_page;
|
||||
struct vnode;
|
||||
struct VMPageWiringInfo;
|
||||
|
||||
|
||||
// area creation flags
|
||||
@@ -113,6 +114,9 @@ void vm_clear_map_flags(struct vm_page *page, uint32 flags);
|
||||
void vm_remove_all_page_mappings(struct vm_page *page);
|
||||
int32 vm_clear_page_mapping_accessed_flags(struct vm_page *page);
|
||||
int32 vm_remove_all_page_mappings_if_unaccessed(struct vm_page *page);
|
||||
status_t vm_wire_page(team_id team, addr_t address, bool writable,
|
||||
struct VMPageWiringInfo* info);
|
||||
void vm_unwire_page(struct VMPageWiringInfo* info);
|
||||
|
||||
status_t vm_get_physical_page(addr_t paddr, addr_t* vaddr, void** _handle);
|
||||
status_t vm_put_physical_page(addr_t vaddr, void* handle);
|
||||
|
||||
Reference in New Issue
Block a user