22 |
|
|
23 |
/* Implement pagein callback as described in <mach/memory_object.defs>. */ |
/* Implement pagein callback as described in <mach/memory_object.defs>. */ |
24 |
kern_return_t |
kern_return_t |
25 |
_pager_seqnos_memory_object_data_request (mach_port_t object, |
_pager_seqnos_memory_object_data_request (mach_port_t object, |
26 |
mach_port_seqno_t seqno, |
mach_port_seqno_t seqno, |
27 |
mach_port_t control, |
mach_port_t control, |
28 |
vm_offset_t offset, |
vm_offset_t offset, |
43 |
/* Acquire the right to meddle with the pagemap */ |
/* Acquire the right to meddle with the pagemap */ |
44 |
mutex_lock (&p->interlock); |
mutex_lock (&p->interlock); |
45 |
_pager_wait_for_seqno (p, seqno); |
_pager_wait_for_seqno (p, seqno); |
46 |
|
|
47 |
/* sanity checks -- we don't do multi-page requests yet. */ |
/* sanity checks -- we don't do multi-page requests yet. */ |
48 |
if (control != p->memobjcntl) |
if (control != p->memobjcntl) |
49 |
{ |
{ |
52 |
} |
} |
53 |
if (length != __vm_page_size) |
if (length != __vm_page_size) |
54 |
{ |
{ |
55 |
printf ("incg data request: bad length size %d\n", length); |
printf ("incg data request: bad length size %zd\n", length); |
56 |
goto release_out; |
goto release_out; |
57 |
} |
} |
58 |
if (offset % __vm_page_size) |
if (offset % __vm_page_size) |
61 |
goto release_out; |
goto release_out; |
62 |
} |
} |
63 |
|
|
64 |
_pager_block_termination (p); /* prevent termination until |
_pager_block_termination (p); /* prevent termination until |
65 |
mark_object_error is done */ |
mark_object_error is done */ |
66 |
|
|
67 |
if (p->pager_state != NORMAL) |
if (p->pager_state != NORMAL) |
99 |
|
|
100 |
if (PM_NEXTERROR (*pm_entry) != PAGE_NOERR && (access & VM_PROT_WRITE)) |
if (PM_NEXTERROR (*pm_entry) != PAGE_NOERR && (access & VM_PROT_WRITE)) |
101 |
{ |
{ |
102 |
memory_object_data_error (control, offset, length, |
memory_object_data_error (control, offset, length, |
103 |
_pager_page_errors[PM_NEXTERROR (*pm_entry)]); |
_pager_page_errors[PM_NEXTERROR (*pm_entry)]); |
104 |
_pager_mark_object_error (p, offset, length, |
_pager_mark_object_error (p, offset, length, |
105 |
_pager_page_errors[PM_NEXTERROR (*pm_entry)]); |
_pager_page_errors[PM_NEXTERROR (*pm_entry)]); |
106 |
*pm_entry = SET_PM_NEXTERROR (*pm_entry, PAGE_NOERR); |
*pm_entry = SET_PM_NEXTERROR (*pm_entry, PAGE_NOERR); |
107 |
doread = 0; |
doread = 0; |
119 |
err = pager_read_page (p->upi, offset, &page, &write_lock); |
err = pager_read_page (p->upi, offset, &page, &write_lock); |
120 |
if (err) |
if (err) |
121 |
goto error_read; |
goto error_read; |
122 |
|
|
123 |
memory_object_data_supply (p->memobjcntl, offset, page, length, 1, |
memory_object_data_supply (p->memobjcntl, offset, page, length, 1, |
124 |
write_lock ? VM_PROT_WRITE : VM_PROT_NONE, 0, |
write_lock ? VM_PROT_WRITE : VM_PROT_NONE, 0, |
125 |
MACH_PORT_NULL); |
MACH_PORT_NULL); |