diff --git a/core/mmu.cc b/core/mmu.cc index 7ca53c67c29f23e2a059ad3eeb97110787ae73f9..588521c9127af3fc339001992cc04f3825b1ad35 100644 --- a/core/mmu.cc +++ b/core/mmu.cc @@ -1057,15 +1057,18 @@ ulong populate_vma(vma *vma, void *v, size_t size) TRACEPOINT(trace_mmu_invalidate, "addr=%p, vaddr=%p", void *, uintptr_t); void unmap_address(void *addr, size_t size) { + size = align_up(size, page_size); WITH_LOCK(shared_fs_mutex) { - auto buf = shared_fs_maps.equal_range(addr); - for (auto it = buf.first; it != buf.second; it++) { - auto vaddr = (*it).second; - trace_mmu_invalidate(addr, vaddr); - operate_range(page_out(), (void *)vaddr, page_size); + for (uintptr_t a = reinterpret_cast<uintptr_t>(addr); size; a += page_size, size -= page_size) { + addr = reinterpret_cast<void*>(a); + auto buf = shared_fs_maps.equal_range(addr); + for (auto it = buf.first; it != buf.second; it++) { + auto vaddr = (*it).second; + trace_mmu_invalidate(addr, vaddr); + operate_range(page_out(), (void *)vaddr, page_size); + } + shared_fs_maps.erase(addr); } - - shared_fs_maps.erase(addr); } } diff --git a/fs/vfs/vfs_fops.cc b/fs/vfs/vfs_fops.cc index 1e64b9b7bbe318f7add8a481e63a11edc871df21..84c8669332456096bbf9326a26f32b5e8f2a10fa 100644 --- a/fs/vfs/vfs_fops.cc +++ b/fs/vfs/vfs_fops.cc @@ -165,7 +165,7 @@ void* vfs_file::get_page(uintptr_t start, uintptr_t off, size_t size) assert(VOP_MAP(vp, fp, data) == 0); vn_unlock(vp); - mmu::add_mapping(map_data.buffer, start); + mmu::add_mapping(io.iov_base + map_data.buf_off, start); return io.iov_base + map_data.buf_off; }