From 09d3648e43538447e4fed475fd37f2c369ec91a1 Mon Sep 17 00:00:00 2001 From: Masamichi Takagi Date: Fri, 6 Apr 2018 11:41:50 +0900 Subject: [PATCH] uti: Set PROT_EXEC to host VMA when PROT_READ is set Set PROT_EXEC to host VMA because uti needs PROT_EXEC for text VMAs. Meanings of prot bits of Host VMA has been changed as follows. RWX: No mapping or RW mapping RX: Read only mapping --- kernel/syscall.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/syscall.c b/kernel/syscall.c index e0d4a966..b5589c4c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -1344,7 +1344,7 @@ int do_munmap(void *addr, size_t len, int holding_memory_range_lock) clear_host_pte((uintptr_t)addr, len); } else { - error = set_host_vma((uintptr_t)addr, len, PROT_READ|PROT_WRITE, holding_memory_range_lock); + error = set_host_vma((uintptr_t)addr, len, PROT_READ | PROT_WRITE | PROT_EXEC, holding_memory_range_lock); if (error) { kprintf("sys_munmap:set_host_vma failed. %d\n", error); /* through */ @@ -1522,7 +1522,7 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, } if (!(prot & PROT_WRITE)) { - error = set_host_vma(addr, len, PROT_READ, 1/* holding memory_range_lock */); + error = set_host_vma(addr, len, PROT_READ | PROT_EXEC, 1/* holding memory_range_lock */); if (error) { kprintf("do_mmap:set_host_vma failed. %d\n", error); goto out; @@ -1724,7 +1724,7 @@ do_mmap(const intptr_t addr0, const size_t len0, const int prot, out: if (ro_vma_mapped) { - (void)set_host_vma(addr, len, PROT_READ|PROT_WRITE, 1/* holding memory_range_lock */); + (void)set_host_vma(addr, len, PROT_READ | PROT_WRITE | PROT_EXEC, 1/* holding memory_range_lock */); } ihk_mc_spinlock_unlock_noirq(&thread->vm->memory_range_lock); @@ -1934,7 +1934,7 @@ out: // XXX: TLB flush flush_tlb(); if (ro_changed && !error) { - error = set_host_vma(start, len, prot & (PROT_READ|PROT_WRITE), 1/* holding memory_range_lock */); + error = set_host_vma(start, len, prot & (PROT_READ | PROT_WRITE | PROT_EXEC), 1/* holding memory_range_lock */); if (error) { kprintf("sys_mprotect:set_host_vma failed. %d\n", error); /* through */ @@ -5036,7 +5036,7 @@ SYSCALL_DECLARE(shmat) vrflags |= VRFLAG_PROT_TO_MAXPROT(vrflags); if (!(prot & PROT_WRITE)) { - error = set_host_vma(addr, len, PROT_READ, 1/* holding memory_range_lock */); + error = set_host_vma(addr, len, PROT_READ | PROT_EXEC, 1/* holding memory_range_lock */); if (error) { ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock); shmobj_list_unlock(); @@ -5051,7 +5051,7 @@ SYSCALL_DECLARE(shmat) vrflags, &obj->memobj, 0, obj->pgshift, NULL); if (error) { if (!(prot & PROT_WRITE)) { - (void)set_host_vma(addr, len, PROT_READ|PROT_WRITE, 1/* holding memory_range_lock */); + (void)set_host_vma(addr, len, PROT_READ | PROT_WRITE | PROT_EXEC, 1/* holding memory_range_lock */); } memobj_release(&obj->memobj); ihk_mc_spinlock_unlock_noirq(&vm->memory_range_lock);