104 |
|
|
105 |
for (pa = ps->avail_start; pa < ps->avail_end; ) |
for (pa = ps->avail_start; pa < ps->avail_end; ) |
106 |
{ |
{ |
107 |
|
assert (pa != 0); |
108 |
|
|
109 |
pages [resident_pages++].phys_addr = pa; |
pages [resident_pages++].phys_addr = pa; |
110 |
pa += VM_PAGE_SIZE; |
pa += VM_PAGE_SIZE; |
111 |
} |
} |
186 |
{ |
{ |
187 |
/* ??? is this the correct macro? */ |
/* ??? is this the correct macro? */ |
188 |
page_free_count++; |
page_free_count++; |
189 |
enqueue_tail (&page_free_list, &page->pageq); |
queue_enter (&page_free_list, page, struct vm_page *, listq); |
190 |
} |
} |
191 |
|
|
192 |
/* Allocate a new page from the free list. This may start the |
/* Allocate a new page from the free list. This may start the |
195 |
struct vm_page * |
struct vm_page * |
196 |
vm_page_allocate (void) |
vm_page_allocate (void) |
197 |
{ |
{ |
198 |
if (queue_empty (&page_free_list)) |
struct vm_page *page; |
199 |
|
|
200 |
|
if (queue_empty (& page_free_list)) |
201 |
return 0; |
return 0; |
202 |
|
|
203 |
|
queue_remove_last (& page_free_list, page, struct vm_page *, listq); |
204 |
page_free_count--; |
page_free_count--; |
|
return (struct vm_page *) dequeue_head (&page_free_list); |
|
|
} |
|
205 |
|
|
206 |
|
return page; |
207 |
|
} |
208 |
|
|
209 |
/* Grab a physical page. The physical page address is returned. */ |
/* Grab a physical page. The physical page address is returned. */ |
210 |
|
|
211 |
void * |
void * |
212 |
vm_page_grab_physical (void) |
vm_page_grab_physical (void) |
213 |
{ |
{ |
214 |
|
struct vm_page *page; |
215 |
|
|
216 |
if (queue_empty (&page_free_list)) |
if (queue_empty (&page_free_list)) |
217 |
return 0; |
return 0; |
218 |
return (void *) ((struct vm_page *) dequeue (&page_free_list))->phys_addr; |
|
219 |
|
queue_remove_last (& page_free_list, page, struct vm_page *, listq); |
220 |
|
page_free_count--; |
221 |
|
|
222 |
|
return (void *) page->phys_addr; |
223 |
} |
} |
224 |
|
|
225 |
/* Copy page SRC_PAGE to DST_PAGE. */ |
/* Copy page SRC_PAGE to DST_PAGE. */ |