1 |
/* Implementation of memory_object_data_return for pager library |
/* Implementation of memory_object_data_return for pager library |
2 |
Copyright (C) 1994, 1995, 1996, 1999, 2000 Free Software Foundation |
Copyright (C) 1994,95,96,99,2000,02 Free Software Foundation, Inc. |
3 |
|
|
4 |
This program is free software; you can redistribute it and/or |
This program is free software; you can redistribute it and/or |
5 |
modify it under the terms of the GNU General Public License as |
modify it under the terms of the GNU General Public License as |
45 |
struct lock_list *next;} *lock_list, *ll; |
struct lock_list *next;} *lock_list, *ll; |
46 |
int wakeup; |
int wakeup; |
47 |
int omitdata = 0; |
int omitdata = 0; |
48 |
|
|
49 |
p = ports_lookup_port (0, object, _pager_class); |
p = ports_lookup_port (0, object, _pager_class); |
50 |
if (!p) |
if (!p) |
51 |
return EOPNOTSUPP; |
return EOPNOTSUPP; |
53 |
/* Acquire the right to meddle with the pagemap */ |
/* Acquire the right to meddle with the pagemap */ |
54 |
mutex_lock (&p->interlock); |
mutex_lock (&p->interlock); |
55 |
_pager_wait_for_seqno (p, seqno); |
_pager_wait_for_seqno (p, seqno); |
56 |
|
|
57 |
/* sanity checks -- we don't do multi-page requests yet. */ |
/* sanity checks -- we don't do multi-page requests yet. */ |
58 |
if (control != p->memobjcntl) |
if (control != p->memobjcntl) |
59 |
{ |
{ |
62 |
} |
} |
63 |
if (length % __vm_page_size) |
if (length % __vm_page_size) |
64 |
{ |
{ |
65 |
printf ("incg data return: bad length size %d\n", length); |
printf ("incg data return: bad length size %zd\n", length); |
66 |
goto release_out; |
goto release_out; |
67 |
} |
} |
68 |
if (offset % __vm_page_size) |
if (offset % __vm_page_size) |
103 |
condition_wait (&p->wakeup, &p->interlock); |
condition_wait (&p->wakeup, &p->interlock); |
104 |
goto retry; |
goto retry; |
105 |
} |
} |
106 |
|
|
107 |
/* Mark these pages as being paged out. */ |
/* Mark these pages as being paged out. */ |
108 |
if (initializing) |
if (initializing) |
109 |
{ |
{ |
150 |
|
|
151 |
for (i = 0; i < npages; i++) |
for (i = 0; i < npages; i++) |
152 |
if (!(omitdata & (1 << i))) |
if (!(omitdata & (1 << i))) |
153 |
pagerrs[i] = pager_write_page (p->upi, |
pagerrs[i] = pager_write_page (p->upi, |
154 |
offset + (vm_page_size * i), |
offset + (vm_page_size * i), |
155 |
data + (vm_page_size * i)); |
data + (vm_page_size * i)); |
156 |
|
|
157 |
/* Acquire the right to meddle with the pagemap */ |
/* Acquire the right to meddle with the pagemap */ |
164 |
{ |
{ |
165 |
if (omitdata & (1 << i)) |
if (omitdata & (1 << i)) |
166 |
continue; |
continue; |
167 |
|
|
168 |
if (pm_entries[i] & PM_WRITEWAIT) |
if (pm_entries[i] & PM_WRITEWAIT) |
169 |
wakeup = 1; |
wakeup = 1; |
170 |
|
|
171 |
if (pagerrs[i] && ! (pm_entries[i] & PM_PAGEINWAIT)) |
if (pagerrs[i] && ! (pm_entries[i] & PM_PAGEINWAIT)) |
172 |
/* The only thing we can do here is mark the page, and give |
/* The only thing we can do here is mark the page, and give |
173 |
errors from now on when it is to be read. This is |
errors from now on when it is to be read. This is |
179 |
pm_entries[i] |= PM_INVALID; |
pm_entries[i] |= PM_INVALID; |
180 |
|
|
181 |
if (pm_entries[i] & PM_PAGEINWAIT) |
if (pm_entries[i] & PM_PAGEINWAIT) |
182 |
memory_object_data_supply (p->memobjcntl, |
memory_object_data_supply (p->memobjcntl, |
183 |
offset + (vm_page_size * i), |
offset + (vm_page_size * i), |
184 |
data + (vm_page_size * i), |
data + (vm_page_size * i), |
185 |
vm_page_size, 1, |
vm_page_size, 1, |
186 |
VM_PROT_NONE, 0, MACH_PORT_NULL); |
VM_PROT_NONE, 0, MACH_PORT_NULL); |
187 |
else |
else |
188 |
munmap ((caddr_t) (data + (vm_page_size * i)), |
munmap ((caddr_t) (data + (vm_page_size * i)), |
189 |
vm_page_size); |
vm_page_size); |
190 |
|
|
191 |
pm_entries[i] &= ~(PM_PAGINGOUT | PM_PAGEINWAIT | PM_WRITEWAIT); |
pm_entries[i] &= ~(PM_PAGINGOUT | PM_PAGEINWAIT | PM_WRITEWAIT); |
214 |
|
|
215 |
/* Implement pageout call back as described by <mach/memory_object.defs>. */ |
/* Implement pageout call back as described by <mach/memory_object.defs>. */ |
216 |
kern_return_t |
kern_return_t |
217 |
_pager_seqnos_memory_object_data_return (mach_port_t object, |
_pager_seqnos_memory_object_data_return (mach_port_t object, |
218 |
mach_port_seqno_t seqno, |
mach_port_seqno_t seqno, |
219 |
mach_port_t control, |
mach_port_t control, |
220 |
vm_offset_t offset, |
vm_offset_t offset, |