diff --git a/kernel/mm_adr_direct.pas b/kernel/mm_adr_direct.pas index beaeb72a..dddbfe09 100644 --- a/kernel/mm_adr_direct.pas +++ b/kernel/mm_adr_direct.pas @@ -149,6 +149,11 @@ begin if (a>b) then Result:=a else Result:=b; end; +function Min(a,b:QWORD):QWORD; inline; +begin + if (a=cmp) then Exit; else Exit; @@ -669,16 +674,17 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; @@ -706,7 +712,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -722,7 +728,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -780,18 +786,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -822,7 +828,7 @@ var addr :=ia(addr,FSize); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -839,7 +845,7 @@ var addr :=ia(addr,FSize); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -882,18 +888,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -917,7 +923,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -933,7 +939,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin diff --git a/kernel/mm_adr_name.pas b/kernel/mm_adr_name.pas index 9bbb5c73..2249e93f 100644 --- a/kernel/mm_adr_name.pas +++ b/kernel/mm_adr_name.pas @@ -195,7 +195,7 @@ begin end; C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit; - C_BE:if (rkey.Offset<=cmp) then Exit; + C_BE:if (rkey.Offset>=cmp) then Exit; else Exit; @@ -283,18 +283,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -318,7 +318,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin diff --git a/kernel/mm_adr_virtual.pas b/kernel/mm_adr_virtual.pas index 9e1139c4..a8b040c2 100644 --- a/kernel/mm_adr_virtual.pas +++ b/kernel/mm_adr_virtual.pas @@ -180,7 +180,7 @@ type Function Protect(Offset:Pointer;Size:QWORD;prot:Integer):Integer; Function Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer; - Function Release(Offset:Pointer;Size:QWORD):Integer; + Function Release(Offset:Pointer;Size:QWORD;inher:Boolean):Integer; Function Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer; Function QueryProt(Offset:Pointer;var ROut:TVirtualAdrNode):Integer; @@ -699,7 +699,7 @@ begin end; C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit; - C_BE:if (rkey.Offset<=cmp) then Exit; + C_BE:if (rkey.Offset>=cmp) then Exit; else Exit; @@ -933,18 +933,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -956,7 +956,12 @@ var function _map:Boolean; begin Result:=False; - Assert(key.Size<>0); + + if (key.Size=0) then + begin + if (FEndO>=FEndN) then Exit(True); + Exit; + end; //new save key.block:=block; @@ -985,7 +990,23 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); + end; + + function _skip:Boolean; //inline; + begin + Result:=False; + + FEndN:=Offset+Size; + FEndO:=key.Offset+key.Size; + + if (FEndO>=FEndN) then Exit(True); + + FSize:=FEndO-Offset; + if (FSize=0) then FSize:=PHYSICAL_PAGE_SIZE; + + Offset:=Offset+FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1000,7 +1021,7 @@ begin if _map then Break; end else begin - Break; + if _skip then Break; end; until false; @@ -1017,18 +1038,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1059,7 +1080,7 @@ var addr :=addr +FSize; Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1091,18 +1112,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1133,7 +1154,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -1149,7 +1170,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1180,7 +1201,7 @@ begin until false; - //Test; + Test; end; Function TVirtualManager.check_fixed(Offset:Pointer;Size:QWORD;flags,fd:Integer):Integer; @@ -1284,18 +1305,18 @@ var begin Result:=False; + FEndN:=Offset+ASize; + if _FetchNode_m(M_LE or C_LE,Offset,key) then begin - FEndN:=Offset+ASize; FEndO:=key.Offset+key.Size; _Devide(Offset,ASize,key); Result:=True; end else - if _FetchNode_m(M_BE or C_BE,(Offset+ASize),key) then + if _FetchNode_m(M_BE or C_BE,FEndN,key) then begin - FEndN:=Offset+ASize; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1332,8 +1353,8 @@ var addr :=ia(_addres,addr,FSize); Offset:=Offset+FSize; - ASize :=ASize -FSize; - Size :=Size -FSize; + ASize :=ASize -Min(FSize,ASize); + Size :=Size -Min(FSize,Size); end; function _remap:Boolean; @@ -1368,8 +1389,8 @@ var addr :=ia(_addres,addr,FSize); Offset:=Offset+FSize; - ASize :=ASize -FSize; - Size :=Size -FSize; + ASize :=ASize -Min(FSize,ASize); + Size :=Size -Min(FSize,Size); end; begin @@ -1416,7 +1437,7 @@ begin Result:=check_fixed(Offset,Size,flags,fd); if (Result<>0) then Exit; - //Test; + Test; repeat @@ -1549,7 +1570,7 @@ begin until false; - //Test; + Test; if (Result=0) then begin @@ -1567,18 +1588,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1612,7 +1633,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -1628,7 +1649,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1670,7 +1691,7 @@ begin until false; - //Test; + Test; end; Function TVirtualManager.Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer; @@ -1683,18 +1704,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1733,7 +1754,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -1749,7 +1770,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1765,7 +1786,7 @@ begin Offset:=FEndO; Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE); - //Test; + Test; repeat @@ -1791,10 +1812,10 @@ begin until false; - //Test; + Test; end; -Function TVirtualManager.Release(Offset:Pointer;Size:QWORD):Integer; +Function TVirtualManager.Release(Offset:Pointer;Size:QWORD;inher:Boolean):Integer; var key:TVirtualAdrNode; FEndN,FEndO:Pointer; @@ -1805,18 +1826,18 @@ var begin Result:=False; + FEndN:=Offset+Size; + if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(Offset,Size,key); Result:=True; end else - if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then + if _FetchNode_m(M_BE or C_FR or C_BE,FEndN,key) then begin - FEndN:=Offset+Size; FEndO:=key.Offset+key.Size; _Devide(key.Offset,FEndN-key.Offset,key); @@ -1835,7 +1856,13 @@ var if (key.F.direct<>0) then begin - err:=_UnmapDirect(key.addr,key.Size); + if inher then + begin + err:=0; + end else + begin + err:=_UnmapDirect(key.addr,key.Size); + end; if (err<>0) then Exit; end; @@ -1888,7 +1915,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; function _skip:Boolean; //inline; @@ -1904,7 +1931,7 @@ var Assert(FSize<>0); Offset:=Offset+FSize; - Size :=Size -FSize; + Size :=Size -Min(FSize,Size); end; begin @@ -1918,10 +1945,12 @@ begin Offset:=FEndO; Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE); - //Test; + Test; repeat + Test; + key:=Default(TVirtualAdrNode); key.IsFree:=False; key.Offset:=Offset; @@ -1958,7 +1987,7 @@ begin until false; - //Test; + Test; end; Function TVirtualManager.Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer; @@ -1968,7 +1997,7 @@ var begin Result:=0; - //Test; + Test; if (Offset>Fhi) then Exit(EINVAL); @@ -2019,7 +2048,7 @@ var begin Result:=0; - //Test; + Test; if (Offset>Fhi) then Exit(EINVAL); @@ -2116,6 +2145,16 @@ begin begin key:=It.Item^; + if (key.block<>nil) then + begin + if (key.Offset< key.block^.Offset) or + (key.Offset>=key.block^.Offset+key.block^.Size) then + begin + Writeln(HexStr(key.Offset),':',HexStr(key.block^.Offset)); + Assert(false); + end; + end; + if (prev<>nil) then begin curr:=key.Offset; @@ -2132,6 +2171,21 @@ begin end; end; +const + pt_r:array[boolean] of AnsiChar=('_','R'); + pt_w:array[boolean] of AnsiChar=('_','W'); + pt_e:array[boolean] of AnsiChar=('_','E'); + +function _prot_str(prot:Integer):RawByteString; +begin + Result:=pt_r[prot and PROT_READ <>0]+ + pt_w[prot and PROT_WRITE<>0]+ + pt_e[prot and PROT_EXEC <>0]+ + ':'+ + pt_r[prot and PROT_GPU_READ <>0]+ + pt_w[prot and PROT_GPU_WRITE<>0]; +end; + procedure TVirtualManager.Print; var key:TVirtualAdrNode; @@ -2146,7 +2200,9 @@ begin HexStr(QWORD(key.Offset+key.Size),11),':', HexStr(key.Size,11),'#', HexStr(qword(key.addr),11),'#', - _alloc_str(key),'#'); + _alloc_str(key),'#', + _prot_str(key.F.prot) + ); It.Next; end; diff --git a/kernel/ps4_map_mm.pas b/kernel/ps4_map_mm.pas index 2f3b5bbd..e0c701a6 100644 --- a/kernel/ps4_map_mm.pas +++ b/kernel/ps4_map_mm.pas @@ -865,7 +865,7 @@ end; function __munmap(addr:Pointer;len:size_t):Integer; begin - Result:=VirtualManager.Release(addr,len); + Result:=VirtualManager.Release(addr,len,True); if (Result=0) then begin @@ -890,7 +890,7 @@ begin _sig_lock; rwlock_wrlock(MMLock); //rw - Result:=VirtualManager.Release(addr,len); + Result:=VirtualManager.Release(addr,len,False); if (Result=0) then begin diff --git a/kernel/ps4_pthread.pas b/kernel/ps4_pthread.pas index ebbdc5b8..598b9c84 100644 --- a/kernel/ps4_pthread.pas +++ b/kernel/ps4_pthread.pas @@ -741,8 +741,8 @@ begin Result:=0; Case state of - PTHREAD_CANCEL_DISABLE:Writeln('PTHREAD_CANCEL_DISABLE'); - PTHREAD_CANCEL_ENABLE :Writeln('PTHREAD_CANCEL_ENABLE'); + PTHREAD_CANCEL_DISABLE:{Writeln('PTHREAD_CANCEL_DISABLE')}; + PTHREAD_CANCEL_ENABLE :{Writeln('PTHREAD_CANCEL_ENABLE')}; else Exit(EINVAL); end; diff --git a/rtl/mmap.pas b/rtl/mmap.pas index 7d1f8fe2..811932fe 100644 --- a/rtl/mmap.pas +++ b/rtl/mmap.pas @@ -96,12 +96,12 @@ const function _isgpu(prot:Integer):Boolean; inline; begin - Result:=prot and (SCE_KERNEL_PROT_GPU_READ or SCE_KERNEL_PROT_GPU_WRITE)<>0; + Result:=prot and (PROT_GPU_READ or PROT_GPU_WRITE)<>0; end; function _iswrite(prot:Integer):Boolean; inline; begin - Result:=prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE)<>0; + Result:=prot and (PROT_WRITE or PROT_GPU_WRITE)<>0; end; function __map_prot_page(prot:Integer):DWORD; @@ -111,11 +111,11 @@ begin if (prot and PROT_EXEC)<>0 then begin - if (prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE))<>0 then + if (prot and (PROT_WRITE or PROT_GPU_WRITE))<>0 then begin Result:=PAGE_EXECUTE_READWRITE; end else - if (prot and (PROT_READ or SCE_KERNEL_PROT_GPU_READ))<>0 then + if (prot and (PROT_READ or PROT_GPU_READ))<>0 then begin Result:=PAGE_EXECUTE_READ; end else @@ -123,7 +123,7 @@ begin Result:=PAGE_EXECUTE; end; end else - if (prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE))<>0 then + if (prot and (PROT_WRITE or PROT_GPU_WRITE))<>0 then begin Result:=PAGE_READWRITE; end else