25 |
#include "ipc-port.h" |
#include "ipc-port.h" |
26 |
#include "thread.h" |
#include "thread.h" |
27 |
|
|
28 |
/* memory-pager-init: establish new mapping of PAGER */ |
#include "memory-object-proto.h" |
|
extern void memory_pager_init (struct ipc_port *pager, |
|
|
struct ipc_port *pager_req); |
|
|
|
|
|
/* memory-pager-data-request: request data from PAGER */ |
|
|
extern void memory_pager_data_request (struct ipc_port *pager, |
|
|
struct ipc_port *pager_req, |
|
|
vm_offset_t offset, vm_size_t size, |
|
|
vm_prot_t access); |
|
|
|
|
|
/* memory-pager-data-request: request data from PAGER */ |
|
|
extern void memory_pager_write_data (struct ipc_port *pager, |
|
|
struct ipc_port *pager_req, |
|
|
vm_offset_t offset, |
|
|
vm_offset_t data_ptr, |
|
|
vm_size_t size, |
|
|
int dirty_p, int kernel_copy_p); |
|
29 |
|
|
30 |
/* Someone is requesting page at OFFSET in object COOKIE, from our PAGER. */ |
/* Someone is requesting page at OFFSET in object COOKIE, from our PAGER. */ |
31 |
static kern_return_t |
static kern_return_t |
35 |
{ |
{ |
36 |
struct ipc_port *pager = cookie; |
struct ipc_port *pager = cookie; |
37 |
|
|
38 |
memory_pager_data_request (pager, object->pager_request, offset, |
memory_object_data_request (pager, object->pager_request, offset, |
39 |
VM_PAGE_SIZE, desired_access); |
VM_PAGE_SIZE, desired_access); |
40 |
return KERN_SUCCESS; |
return KERN_SUCCESS; |
41 |
} |
} |
42 |
|
|
46 |
{ |
{ |
47 |
struct ipc_port *pager = cookie; |
struct ipc_port *pager = cookie; |
48 |
|
|
49 |
memory_pager_init (pager, object->pager_request); |
memory_object_init (pager, object->pager_request); |
50 |
|
|
51 |
return KERN_SUCCESS; |
return KERN_SUCCESS; |
52 |
} |
} |
63 |
if (! copy) |
if (! copy) |
64 |
return KERN_RESOURCE_SHORTAGE; |
return KERN_RESOURCE_SHORTAGE; |
65 |
|
|
66 |
memory_pager_write_data (pager, old_object->pager_request, offset, |
memory_object_write_data (pager, old_object->pager_request, offset, |
67 |
(vm_offset_t) copy, size, dirty_p, |
(void *) copy, size, dirty_p, |
68 |
kernel_copy_p); |
kernel_copy_p); |
69 |
return KERN_SUCCESS; |
return KERN_SUCCESS; |
70 |
} |
} |
71 |
|
|
122 |
{ |
{ |
123 |
/* Page was requested. Free the busy page waiting |
/* Page was requested. Free the busy page waiting |
124 |
for it. Insertion of new page happens below. */ |
for it. Insertion of new page happens below. */ |
125 |
vm_page_free (m); |
/* vm_page_free (m); */ |
126 |
absent_p = 1; |
absent_p = 1; |
127 |
} |
} |
128 |
else |
else |
137 |
vm_object_lock (object); |
vm_object_lock (object); |
138 |
goto retry_lookup; |
goto retry_lookup; |
139 |
} |
} |
|
|
|
|
#if 0 |
|
|
/* Page already present; error. |
|
|
This is an error if data is precious. */ |
|
|
result = KERN_MEMORY_PRESENT; |
|
|
error_offset = offset + object->paging_offset; |
|
|
|
|
|
break; |
|
|
#endif |
|
140 |
} |
} |
141 |
} |
} |
142 |
else |
else |
156 |
|
|
157 |
/* pmap_clear_modify(data_m->phys_addr); */ |
/* pmap_clear_modify(data_m->phys_addr); */ |
158 |
|
|
159 |
#if 0 |
if (m) |
160 |
data_m->unlock_request = VM_PROT_NONE; |
vm_page_remove (m); |
|
#endif |
|
|
|
|
161 |
vm_page_insert (data_m, object, offset); |
vm_page_insert (data_m, object, offset); |
162 |
|
|
163 |
if (absent_p) |
if (absent_p) |
164 |
vm_page_activate (data_m); |
vm_page_activate (data_m); |
165 |
else |
else |
166 |
vm_page_deactivate (data_m); |
vm_page_deactivate (data_m); |
167 |
|
if (m) |
168 |
|
vm_page_free (m); |
169 |
|
|
170 |
pagelist->pages [i] = 0; |
pagelist->pages [i] = 0; |
171 |
} |
} |