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
This commit is contained in:
Masamichi Takagi
2018-04-06 11:41:50 +09:00
parent 4e905cd412
commit 09d3648e43

View File

@ -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);