diff --git a/sys/dev/dev_dce.pas b/sys/dev/dev_dce.pas index b26d6e32..294ea03a 100644 --- a/sys/dev/dev_dce.pas +++ b/sys/dev/dev_dce.pas @@ -610,7 +610,7 @@ begin if (Result<>0) then Exit; - Writeln('SetFlipRate:',data^.arg2,' ',data^.arg3); + Writeln('SetFlipRate:',data^.arg3); Exit(0); end; diff --git a/sys/init_sysent.pas b/sys/init_sysent.pas index 4524c482..c3f7a2b7 100644 --- a/sys/init_sysent.pas +++ b/sys/init_sysent.pas @@ -1073,7 +1073,7 @@ var ), (//[203] sy_narg:2; - sy_call:nil; + sy_call:@sys_mlock; sy_name:'sys_mlock' ), (//[204] diff --git a/sys/kern/kern_sig.pas b/sys/kern/kern_sig.pas index 99c574ee..3a4f9f36 100644 --- a/sys/kern/kern_sig.pas +++ b/sys/kern/kern_sig.pas @@ -856,12 +856,13 @@ begin break; end; tv:=ets-rts; + tv:=tvtohz(tv); end else begin tv:=0; end; - Result:=msleep(@p_sigacts,@p_proc.p_mtx,PPAUSE or PCATCH,'sigwait',tvtohz(tv)); + Result:=msleep(@p_sigacts,@p_proc.p_mtx,PPAUSE or PCATCH,'sigwait',tv); if (timeout<>nil) then begin diff --git a/sys/md/vm_pmap.pas b/sys/md/vm_pmap.pas index ae65d737..33915806 100644 --- a/sys/md/vm_pmap.pas +++ b/sys/md/vm_pmap.pas @@ -712,6 +712,12 @@ begin lock:=pmap_wlock(pmap,start,__end); + //fixup writeonly + if ((prot and VM_PROT_RWX)=VM_PROT_WRITE) then + begin + prot:=prot or VM_PROT_READ; + end; + ppmap_mark_rwx(start,__end,prot); r:=0; @@ -988,6 +994,12 @@ begin lock:=pmap_rlock(pmap,start,__end); + //fixup writeonly + if ((prot and VM_PROT_RWX)=VM_PROT_WRITE) then + begin + prot:=prot or VM_PROT_READ; + end; + ppmap_mark_rwx(start,__end,prot); case vm_object_type(obj) of diff --git a/sys/syscalls.pas b/sys/syscalls.pas index 3bbf4c45..61aa6020 100644 --- a/sys/syscalls.pas +++ b/sys/syscalls.pas @@ -101,6 +101,7 @@ function getrlimit(which:Integer;rlp:Pointer):Integer; function setrlimit(which:Integer;rlp:Pointer):Integer; function _getdirentries(fd:Integer;buf:Pointer;count:DWORD;basep:PInt64):Integer; function __sysctl(name:PInteger;namelen:DWORD;old:Pointer;oldlenp:PQWORD;new:Pointer;newlen:QWORD):Integer; +function mlock(addr:Pointer;len:QWORD):Integer; function futimes(fd:Integer;tptr:Pointer):Integer; function getpgid(pid:Integer):Integer; function poll(fds:Pointer;nfds:DWORD;timeout:Integer):Integer; @@ -924,6 +925,13 @@ asm jmp cerror end; +function mlock(addr:Pointer;len:QWORD):Integer; assembler; nostackframe; +asm + movq $203,%rax + call fast_syscall + jmp cerror +end; + function futimes(fd:Integer;tptr:Pointer):Integer; assembler; nostackframe; asm movq $206,%rax diff --git a/sys/time.pas b/sys/time.pas index a6c158f5..92147eb8 100644 --- a/sys/time.pas +++ b/sys/time.pas @@ -268,7 +268,13 @@ end; function tvtohz(time:Int64):Int64; begin - Result:=time; + if (time=0) then + begin + Result:=1; + end else + begin + Result:=time; + end; end; procedure usec2timespec(ts:p_timespec;timeo:DWORD); diff --git a/sys/vfs/vfs_syscalls.pas b/sys/vfs/vfs_syscalls.pas index f50a62a8..55e0b968 100644 --- a/sys/vfs/vfs_syscalls.pas +++ b/sys/vfs/vfs_syscalls.pas @@ -1936,6 +1936,11 @@ var sb:t_stat; error:Integer; begin + + begin + Writeln('sys_stat(',path,')'); + end; + error:=kern_stat(path, UIO_USERSPACE, @sb); if (error=0) then begin diff --git a/sys/vm/vm_mmap.pas b/sys/vm/vm_mmap.pas index 9aafa082..96de0446 100644 --- a/sys/vm/vm_mmap.pas +++ b/sys/vm/vm_mmap.pas @@ -20,6 +20,8 @@ type end; {$IF sizeof(t_query_memory_prot)<>24}{$STOP sizeof(t_query_memory_prot)<>24}{$ENDIF} + function sys_mlock(addr:Pointer;len:QWORD):Integer; + function sys_mmap(vaddr:Pointer; vlen :QWORD; prot :Integer; @@ -77,6 +79,37 @@ uses sys_conf, vm_pager; +function sys_mlock(addr:Pointer;len:QWORD):Integer; +var + _adr,_end,last,start,size:vm_offset_t; + map:vm_map_t; + error:Integer; +begin + _adr :=vm_offset_t(addr); + size :=len; + last :=_adr + size; + start:=trunc_page(_adr); + _end :=round_page(last); + + if (last < _adr) or (_end < _adr) then + begin + Exit(EINVAL); + end; + + map:=p_proc.p_vmspace; + + error:=0; + //error:=vm_map_wire(map, start, _end, VM_MAP_WIRE_USER or VM_MAP_WIRE_NOHOLES); + + if (error=KERN_SUCCESS) then + begin + Result:=0; + end else + begin + Result:=ENOMEM; + end; +end; + function vm_mmap_cdev(objsize :vm_size_t; prot :vm_prot_t; maxprotp :p_vm_prot_t;