mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
3e52a4c912
commit
8af26489c3
|
@ -149,6 +149,11 @@ begin
|
||||||
if (a>b) then Result:=a else Result:=b;
|
if (a>b) then Result:=a else Result:=b;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function Min(a,b:QWORD):QWORD; inline;
|
||||||
|
begin
|
||||||
|
if (a<b) then Result:=a else Result:=b;
|
||||||
|
end;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
Function TDirectAdrNode.GetOffset:QWORD;
|
Function TDirectAdrNode.GetOffset:QWORD;
|
||||||
|
@ -303,7 +308,7 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
|
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
|
else
|
||||||
Exit;
|
Exit;
|
||||||
|
@ -669,16 +674,17 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
FEndN:=Offset+Size;
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
@ -706,7 +712,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -722,7 +728,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -780,18 +786,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -822,7 +828,7 @@ var
|
||||||
|
|
||||||
addr :=ia(addr,FSize);
|
addr :=ia(addr,FSize);
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -839,7 +845,7 @@ var
|
||||||
|
|
||||||
addr :=ia(addr,FSize);
|
addr :=ia(addr,FSize);
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -882,18 +888,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -917,7 +923,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -933,7 +939,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -195,7 +195,7 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
|
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
|
else
|
||||||
Exit;
|
Exit;
|
||||||
|
@ -283,18 +283,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -318,7 +318,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -180,7 +180,7 @@ type
|
||||||
Function Protect(Offset:Pointer;Size:QWORD;prot:Integer):Integer;
|
Function Protect(Offset:Pointer;Size:QWORD;prot:Integer):Integer;
|
||||||
Function Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,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 Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer;
|
||||||
Function QueryProt(Offset:Pointer;var ROut:TVirtualAdrNode):Integer;
|
Function QueryProt(Offset:Pointer;var ROut:TVirtualAdrNode):Integer;
|
||||||
|
@ -699,7 +699,7 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
|
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
|
else
|
||||||
Exit;
|
Exit;
|
||||||
|
@ -933,18 +933,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -956,7 +956,12 @@ var
|
||||||
function _map:Boolean;
|
function _map:Boolean;
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
Assert(key.Size<>0);
|
|
||||||
|
if (key.Size=0) then
|
||||||
|
begin
|
||||||
|
if (FEndO>=FEndN) then Exit(True);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
//new save
|
//new save
|
||||||
key.block:=block;
|
key.block:=block;
|
||||||
|
@ -985,7 +990,23 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
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;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1000,7 +1021,7 @@ begin
|
||||||
if _map then Break;
|
if _map then Break;
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
Break;
|
if _skip then Break;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
@ -1017,18 +1038,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1059,7 +1080,7 @@ var
|
||||||
|
|
||||||
addr :=addr +FSize;
|
addr :=addr +FSize;
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1091,18 +1112,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1133,7 +1154,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -1149,7 +1170,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1180,7 +1201,7 @@ begin
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function TVirtualManager.check_fixed(Offset:Pointer;Size:QWORD;flags,fd:Integer):Integer;
|
Function TVirtualManager.check_fixed(Offset:Pointer;Size:QWORD;flags,fd:Integer):Integer;
|
||||||
|
@ -1284,18 +1305,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+ASize;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+ASize;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,ASize,key);
|
_Devide(Offset,ASize,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+ASize;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1332,8 +1353,8 @@ var
|
||||||
addr :=ia(_addres,addr,FSize);
|
addr :=ia(_addres,addr,FSize);
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
|
|
||||||
ASize :=ASize -FSize;
|
ASize :=ASize -Min(FSize,ASize);
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _remap:Boolean;
|
function _remap:Boolean;
|
||||||
|
@ -1368,8 +1389,8 @@ var
|
||||||
addr :=ia(_addres,addr,FSize);
|
addr :=ia(_addres,addr,FSize);
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
|
|
||||||
ASize :=ASize -FSize;
|
ASize :=ASize -Min(FSize,ASize);
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1416,7 +1437,7 @@ begin
|
||||||
Result:=check_fixed(Offset,Size,flags,fd);
|
Result:=check_fixed(Offset,Size,flags,fd);
|
||||||
if (Result<>0) then Exit;
|
if (Result<>0) then Exit;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
repeat
|
repeat
|
||||||
|
|
||||||
|
@ -1549,7 +1570,7 @@ begin
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
if (Result=0) then
|
if (Result=0) then
|
||||||
begin
|
begin
|
||||||
|
@ -1567,18 +1588,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1612,7 +1633,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -1628,7 +1649,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1670,7 +1691,7 @@ begin
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function TVirtualManager.Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer;
|
Function TVirtualManager.Mtypeprotect(Offset:Pointer;Size:QWORD;mtype,prot:Integer):Integer;
|
||||||
|
@ -1683,18 +1704,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1733,7 +1754,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -1749,7 +1770,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1765,7 +1786,7 @@ begin
|
||||||
Offset:=FEndO;
|
Offset:=FEndO;
|
||||||
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
|
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
repeat
|
repeat
|
||||||
|
|
||||||
|
@ -1791,10 +1812,10 @@ begin
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function TVirtualManager.Release(Offset:Pointer;Size:QWORD):Integer;
|
Function TVirtualManager.Release(Offset:Pointer;Size:QWORD;inher:Boolean):Integer;
|
||||||
var
|
var
|
||||||
key:TVirtualAdrNode;
|
key:TVirtualAdrNode;
|
||||||
FEndN,FEndO:Pointer;
|
FEndN,FEndO:Pointer;
|
||||||
|
@ -1805,18 +1826,18 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
|
|
||||||
|
FEndN:=Offset+Size;
|
||||||
|
|
||||||
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
if _FetchNode_m(M_LE or C_FR or C_LE,Offset,key) then
|
||||||
begin
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(Offset,Size,key);
|
_Devide(Offset,Size,key);
|
||||||
|
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end else
|
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
|
begin
|
||||||
FEndN:=Offset+Size;
|
|
||||||
FEndO:=key.Offset+key.Size;
|
FEndO:=key.Offset+key.Size;
|
||||||
|
|
||||||
_Devide(key.Offset,FEndN-key.Offset,key);
|
_Devide(key.Offset,FEndN-key.Offset,key);
|
||||||
|
@ -1835,7 +1856,13 @@ var
|
||||||
|
|
||||||
if (key.F.direct<>0) then
|
if (key.F.direct<>0) then
|
||||||
begin
|
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;
|
if (err<>0) then Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -1888,7 +1915,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _skip:Boolean; //inline;
|
function _skip:Boolean; //inline;
|
||||||
|
@ -1904,7 +1931,7 @@ var
|
||||||
Assert(FSize<>0);
|
Assert(FSize<>0);
|
||||||
|
|
||||||
Offset:=Offset+FSize;
|
Offset:=Offset+FSize;
|
||||||
Size :=Size -FSize;
|
Size :=Size -Min(FSize,Size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
@ -1918,10 +1945,12 @@ begin
|
||||||
Offset:=FEndO;
|
Offset:=FEndO;
|
||||||
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
|
Size:=AlignUp(Size,PHYSICAL_PAGE_SIZE);
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
repeat
|
repeat
|
||||||
|
|
||||||
|
Test;
|
||||||
|
|
||||||
key:=Default(TVirtualAdrNode);
|
key:=Default(TVirtualAdrNode);
|
||||||
key.IsFree:=False;
|
key.IsFree:=False;
|
||||||
key.Offset:=Offset;
|
key.Offset:=Offset;
|
||||||
|
@ -1958,7 +1987,7 @@ begin
|
||||||
|
|
||||||
until false;
|
until false;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function TVirtualManager.Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer;
|
Function TVirtualManager.Query(Offset:Pointer;next:Boolean;var ROut:TVirtualAdrNode):Integer;
|
||||||
|
@ -1968,7 +1997,7 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=0;
|
Result:=0;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
if (Offset>Fhi) then Exit(EINVAL);
|
if (Offset>Fhi) then Exit(EINVAL);
|
||||||
|
|
||||||
|
@ -2019,7 +2048,7 @@ var
|
||||||
begin
|
begin
|
||||||
Result:=0;
|
Result:=0;
|
||||||
|
|
||||||
//Test;
|
Test;
|
||||||
|
|
||||||
if (Offset>Fhi) then Exit(EINVAL);
|
if (Offset>Fhi) then Exit(EINVAL);
|
||||||
|
|
||||||
|
@ -2116,6 +2145,16 @@ begin
|
||||||
begin
|
begin
|
||||||
key:=It.Item^;
|
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
|
if (prev<>nil) then
|
||||||
begin
|
begin
|
||||||
curr:=key.Offset;
|
curr:=key.Offset;
|
||||||
|
@ -2132,6 +2171,21 @@ begin
|
||||||
end;
|
end;
|
||||||
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;
|
procedure TVirtualManager.Print;
|
||||||
var
|
var
|
||||||
key:TVirtualAdrNode;
|
key:TVirtualAdrNode;
|
||||||
|
@ -2146,7 +2200,9 @@ begin
|
||||||
HexStr(QWORD(key.Offset+key.Size),11),':',
|
HexStr(QWORD(key.Offset+key.Size),11),':',
|
||||||
HexStr(key.Size,11),'#',
|
HexStr(key.Size,11),'#',
|
||||||
HexStr(qword(key.addr),11),'#',
|
HexStr(qword(key.addr),11),'#',
|
||||||
_alloc_str(key),'#');
|
_alloc_str(key),'#',
|
||||||
|
_prot_str(key.F.prot)
|
||||||
|
);
|
||||||
|
|
||||||
It.Next;
|
It.Next;
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -865,7 +865,7 @@ end;
|
||||||
|
|
||||||
function __munmap(addr:Pointer;len:size_t):Integer;
|
function __munmap(addr:Pointer;len:size_t):Integer;
|
||||||
begin
|
begin
|
||||||
Result:=VirtualManager.Release(addr,len);
|
Result:=VirtualManager.Release(addr,len,True);
|
||||||
|
|
||||||
if (Result=0) then
|
if (Result=0) then
|
||||||
begin
|
begin
|
||||||
|
@ -890,7 +890,7 @@ begin
|
||||||
_sig_lock;
|
_sig_lock;
|
||||||
rwlock_wrlock(MMLock); //rw
|
rwlock_wrlock(MMLock); //rw
|
||||||
|
|
||||||
Result:=VirtualManager.Release(addr,len);
|
Result:=VirtualManager.Release(addr,len,False);
|
||||||
|
|
||||||
if (Result=0) then
|
if (Result=0) then
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -741,8 +741,8 @@ begin
|
||||||
Result:=0;
|
Result:=0;
|
||||||
|
|
||||||
Case state of
|
Case state of
|
||||||
PTHREAD_CANCEL_DISABLE:Writeln('PTHREAD_CANCEL_DISABLE');
|
PTHREAD_CANCEL_DISABLE:{Writeln('PTHREAD_CANCEL_DISABLE')};
|
||||||
PTHREAD_CANCEL_ENABLE :Writeln('PTHREAD_CANCEL_ENABLE');
|
PTHREAD_CANCEL_ENABLE :{Writeln('PTHREAD_CANCEL_ENABLE')};
|
||||||
else
|
else
|
||||||
Exit(EINVAL);
|
Exit(EINVAL);
|
||||||
end;
|
end;
|
||||||
|
|
10
rtl/mmap.pas
10
rtl/mmap.pas
|
@ -96,12 +96,12 @@ const
|
||||||
|
|
||||||
function _isgpu(prot:Integer):Boolean; inline;
|
function _isgpu(prot:Integer):Boolean; inline;
|
||||||
begin
|
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;
|
end;
|
||||||
|
|
||||||
function _iswrite(prot:Integer):Boolean; inline;
|
function _iswrite(prot:Integer):Boolean; inline;
|
||||||
begin
|
begin
|
||||||
Result:=prot and (PROT_WRITE or SCE_KERNEL_PROT_GPU_WRITE)<>0;
|
Result:=prot and (PROT_WRITE or PROT_GPU_WRITE)<>0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function __map_prot_page(prot:Integer):DWORD;
|
function __map_prot_page(prot:Integer):DWORD;
|
||||||
|
@ -111,11 +111,11 @@ begin
|
||||||
|
|
||||||
if (prot and PROT_EXEC)<>0 then
|
if (prot and PROT_EXEC)<>0 then
|
||||||
begin
|
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
|
begin
|
||||||
Result:=PAGE_EXECUTE_READWRITE;
|
Result:=PAGE_EXECUTE_READWRITE;
|
||||||
end else
|
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
|
begin
|
||||||
Result:=PAGE_EXECUTE_READ;
|
Result:=PAGE_EXECUTE_READ;
|
||||||
end else
|
end else
|
||||||
|
@ -123,7 +123,7 @@ begin
|
||||||
Result:=PAGE_EXECUTE;
|
Result:=PAGE_EXECUTE;
|
||||||
end;
|
end;
|
||||||
end else
|
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
|
begin
|
||||||
Result:=PAGE_READWRITE;
|
Result:=PAGE_READWRITE;
|
||||||
end else
|
end else
|
||||||
|
|
Loading…
Reference in New Issue