Kernel: Temporary hack to "fix" munmap

My current munmap implementation does not support partial unmaps and
GCC relies on this behaviour. This patch removes unmapping if the
address and len does not fully contain the mmap region.
This commit is contained in:
Bananymous 2025-02-01 22:25:22 +02:00
parent 22374ac8f7
commit b30a79c7fe
1 changed files with 17 additions and 4 deletions

View File

@ -1739,16 +1739,29 @@ namespace Kernel
if (len == 0)
return BAN::Error::from_errno(EINVAL);
vaddr_t vaddr = (vaddr_t)addr;
const vaddr_t vaddr = reinterpret_cast<vaddr_t>(addr);
if (vaddr % PAGE_SIZE != 0)
return BAN::Error::from_errno(EINVAL);
if (auto rem = len % PAGE_SIZE)
len += PAGE_SIZE - rem;
LockGuard _(m_process_lock);
// FIXME: We should only map partial regions
// FIXME: We should unmap partial regions.
// This is a hack to only unmap if the whole mmap region
// is contained within [addr, addr + len]
for (size_t i = 0; i < m_mapped_regions.size(); i++)
if (m_mapped_regions[i]->overlaps(vaddr, len))
m_mapped_regions.remove(i);
{
auto& region = m_mapped_regions[i];
const vaddr_t region_s = region->vaddr();
const vaddr_t region_e = region->vaddr() + region->size();
if (vaddr <= region_s && region_e <= vaddr + len)
m_mapped_regions.remove(i--);
else if (region->overlaps(vaddr, len))
dwarnln("TODO: partial region munmap");
}
return 0;
}