diff --git a/executer/kernel/syscall.c b/executer/kernel/syscall.c index f41f993d..fb7d4bc9 100644 --- a/executer/kernel/syscall.c +++ b/executer/kernel/syscall.c @@ -1138,13 +1138,16 @@ out: return (IS_ERR_VALUE(map))? (int)map: 0; } -static void clear_pte_range(uintptr_t start, uintptr_t len) +static int clear_pte_range(uintptr_t start, uintptr_t len) { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; uintptr_t addr; uintptr_t end; + int error; + int ret; + ret = 0; down_read(&mm->mmap_sem); addr = start; while (addr < (start + len)) { @@ -1161,14 +1164,15 @@ static void clear_pte_range(uintptr_t start, uintptr_t len) end = vma->vm_end; } if (addr < end) { - zap_vma_ptes(vma, addr, end-addr); - dprintk("clear_pte_range() 0x%lx - 0x%lx OK\n", - vma->vm_start, vma->vm_end); + error = zap_vma_ptes(vma, addr, end-addr); + if (ret == 0) { + ret = error; + } } addr = end; } up_read(&mm->mmap_sem); - return; + return ret; } /** @@ -1306,8 +1310,11 @@ int __do_in_kernel_syscall(ihk_os_t os, struct mcctrl_channel *c, struct syscall ppd->pid, ppd->rpgtable); } - clear_pte_range(sc->args[0], sc->args[1]); - ret = 0; + error = clear_pte_range(sc->args[0], sc->args[1]); + if (error) { + error = -ENOSYS; + goto out; + } break; case __NR_mprotect: diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index a8f08d89..d3661911 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -1157,12 +1157,16 @@ int main_loop(int fd, int cpu, pthread_mutex_t *lock) return w.sr.args[0]; case __NR_mmap: - case __NR_munmap: case __NR_mprotect: /* reserved for internal use */ do_syscall_return(fd, cpu, -ENOSYS, 0, 0, 0, 0); break; + case __NR_munmap: + ret = madvise((void *)w.sr.args[0], w.sr.args[1], MADV_DONTNEED); + do_syscall_return(fd, cpu, ret, 0, 0, 0, 0); + break; + #ifdef USE_SYSCALL_MOD_CALL case 303:{ __dprintf("mcexec.c,mod_cal,mod=%ld,cmd=%ld\n", w.sr.args[0], w.sr.args[1]);