This commit is contained in:
Pavel 2024-11-02 15:03:06 +03:00
parent 8b241bf02e
commit b16871aed4
8 changed files with 69 additions and 4 deletions

View File

@ -610,7 +610,7 @@ begin
if (Result<>0) then Exit;
Writeln('SetFlipRate:',data^.arg2,' ',data^.arg3);
Writeln('SetFlipRate:',data^.arg3);
Exit(0);
end;

View File

@ -1073,7 +1073,7 @@ var
),
(//[203]
sy_narg:2;
sy_call:nil;
sy_call:@sys_mlock;
sy_name:'sys_mlock'
),
(//[204]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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