diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild index b30f34a..db2d885 100644 --- a/arch/um/include/asm/Kbuild +++ b/arch/um/include/asm/Kbuild @@ -3,3 +3,4 @@ generic-y += hw_irq.h irq_regs.h kdebug.h percpu.h sections.h topology.h xor.h generic-y += ftrace.h pci.h io.h param.h delay.h mutex.h current.h exec.h generic-y += switch_to.h clkdev.h generic-y += trace_clock.h +header-y += mman.h diff --git a/arch/um/include/asm/mman.h b/arch/um/include/asm/mman.h new file mode 100644 index 0000000..bb0a8c7 --- /dev/null +++ b/arch/um/include/asm/mman.h @@ -0,0 +1,9 @@ +#ifndef __UM_MMAN_H__ +#define __UM_MMAN_H__ + +#include + +#define arch_mmap_check uml_mmap_check +int uml_mmap_check(unsigned long addr, unsigned long len, unsigned long flags); + +#endif /* __UM_MMAN_H__ */ diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 5abcbfb..632c066 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -320,3 +321,8 @@ void *uml_kmalloc(int size, int flags) { return kmalloc(size, flags); } + +int uml_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) +{ + return (flags & MAP_FIXED && addr < STUB_START + STUB_END) ? -EINVAL : 0; +} diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index ff03067..db09322 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c @@ -103,7 +103,7 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm) void uml_setup_stubs(struct mm_struct *mm) { - int err, ret; + int ret; if (!skas_needs_stub) return; @@ -120,15 +120,10 @@ void uml_setup_stubs(struct mm_struct *mm) mm->context.stub_pages[0] = virt_to_page(&__syscall_stub_start); mm->context.stub_pages[1] = virt_to_page(mm->context.id.stack); - /* dup_mmap already holds mmap_sem */ - err = install_special_mapping(mm, STUB_START, STUB_END - STUB_START, - VM_READ | VM_MAYREAD | VM_EXEC | - VM_MAYEXEC | VM_DONTCOPY, - mm->context.stub_pages); - if (err) { - printk(KERN_ERR "install_special_mapping returned %d\n", err); - goto out; - } + /* XXX: the stub pages don't have a VMA, ensure that the PTR counter + * is correct at process exit. */ + mm->nr_ptes--; + return; out: