version 1.36.2.31, 2010/11/15 17:32:01 |
version 1.36.2.32, 2010/11/16 07:44:25 |
Line 869 genfs_do_getpages_xip1( |
|
Line 869 genfs_do_getpages_xip1( |
|
* XIP page metadata assignment |
* XIP page metadata assignment |
* - Unallocated block is redirected to the dedicated zero'ed |
* - Unallocated block is redirected to the dedicated zero'ed |
* page. |
* page. |
* - Assume that struct vm_page *[] array of this segment is |
|
* allocated and linearly ordered by physical address. |
|
*/ |
*/ |
if (blkno < 0) { |
if (blkno < 0) { |
zero_page = uvm_page_zeropage_alloc(); |
zero_page = uvm_page_zeropage_alloc(); |
KASSERT(zero_page != NULL); |
KASSERT(zero_page != NULL); |
pps[i] = zero_page; |
pps[i] = zero_page; |
} else { |
} else { |
struct vm_physseg *seg; |
daddr_t blk_off, fs_off; |
daddr_t seg_off; |
|
struct vm_page *pg; |
|
|
|
seg = devvp->v_physseg; |
|
KASSERT(seg != NULL); |
|
/* bus_space_mmap cookie -> paddr_t */ |
|
seg_off = (blkno << dev_bshift) + |
|
(off - (lbn << fs_bshift)); |
|
KASSERT((seg_off & PAGE_MASK) == 0); |
|
pg = seg->pgs + (seg_off >> PAGE_SHIFT); |
|
KASSERT(pg->phys_addr == |
|
(seg->start << PAGE_SHIFT) + seg_off); |
|
|
|
pps[i] = pg; |
blk_off = blkno << dev_bshift; |
|
fs_off = off - (lbn << fs_bshift); |
|
|
|
pps[i] = uvn_findpage_xip(&devvp->v_uobj, |
|
blk_off + fs_off); |
|
KASSERT(pps[i] != NULL); |
} |
} |
|
|
UVMHIST_LOG(ubchist, "xip pgs %d => phys_addr=0x%lx (%p)", |
UVMHIST_LOG(ubchist, "xip pgs %d => phys_addr=0x%lx (%p)", |