From ecd16264cb1c2c741b0262439433f4ebb942a16d Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 8 Jul 2026 13:03:19 -0300 Subject: [PATCH] mm: handle work around shared character device mappings on fork --- kernel-src/mm/mm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/kernel-src/mm/mm.c b/kernel-src/mm/mm.c index 3e60e23c..126e83c0 100644 --- a/kernel-src/mm/mm.c +++ b/kernel-src/mm/mm.c @@ -582,7 +582,6 @@ mm_context_t *mm_fork_context(mm_context_t *old_context) { VOP_HOLD(range->vnode); for (uintptr_t offset = 0; offset < new_range->size; offset += PAGE_SIZE) { - // XXX some types of mappings, like framebuffer shared mappings, will break if done this way void *vaddr = (void *)((uintptr_t)new_range->start + offset); void *phys = arch_mmu_getphysical(old_context->pagetable, vaddr); if (phys == NULL) @@ -590,6 +589,13 @@ mm_context_t *mm_fork_context(mm_context_t *old_context) { bool writeable = arch_mmu_iswritable(old_context->pagetable, vaddr); bool private = !(range->flags & MM_RANGE_FLAGS_SHARED); + if ((range->flags & MM_RANGE_FLAGS_FILE) && range->vnode->type == V_TYPE_CHDEV && !private) { + // TODO: implement fork semantics for device mappings properly. + if (arch_mmu_map(new_context->pagetable, phys, vaddr, new_range->mmuflags) == false) + goto error; + continue; + } + page_t *page = mm_get_page(phys); if (mm_is_page_locked(page) && writeable && private) { // the page is a private locked page, eagerly copy it to ensure fork/futex correctness