Breaking the old, building the new

This commit is contained in:
red-prig 2022-10-03 00:52:51 +03:00
parent 1011843140
commit 23671a5ae5
5 changed files with 521 additions and 1473 deletions

View File

@ -210,6 +210,7 @@ end;
procedure TDirectManager._Insert(const key:TDirectAdrNode);
begin
Assert(key.Size<>0);
if key.IsFree then
begin
FFreeSet.Insert(key);
@ -294,8 +295,8 @@ begin
if (rkey.Offset<>cmp ) then Exit;
end;
C_LE:if ((rkey.Offset+rkey.Size)<cmp) then Exit;
C_BE:if (key.Offset<cmp) then Exit;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit;
else
Exit;
@ -641,7 +642,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -655,6 +656,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.IsFree :=True;
@ -718,7 +720,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -743,7 +747,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -757,6 +761,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
@ -817,7 +822,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -842,7 +849,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -856,6 +863,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.F.mtype:=mtype;
@ -908,7 +916,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -937,10 +947,10 @@ begin
begin
key:=It.Item^;
Writeln(HexStr(key.Offset,10),'..',
HexStr(key.Offset+key.Size,10),':',
HexStr(key.Size,10),'#',
HexStr(qword(key.addr),10),'#',
Writeln(HexStr(key.Offset,11),'..',
HexStr(key.Offset+key.Size,11),':',
HexStr(key.Size,11),'#',
HexStr(qword(key.addr),11),'#',
_alloc_str(key.IsFree),'#',
key.F.mtype);
@ -948,94 +958,6 @@ begin
end;
end;
procedure itest;
var
test:TDirectManager;
addr:array[0..5] of qword;
begin
test:=TDirectManager.Create;
test.Alloc(4*1024,1,0,addr[0]);
Writeln(HexStr(addr[0],16));
test.Alloc(4*1024,1,0,addr[1]);
Writeln(HexStr(addr[1],16));
test.Alloc(4*1024,1,0,addr[2]);
Writeln(HexStr(addr[2],16));
test.Alloc(4*1024,1,0,addr[3]);
Writeln(HexStr(addr[3],16));
test.Alloc(4*1024,1,0,addr[4]);
Writeln(HexStr(addr[4],16));
test.Alloc(4*1024,1,0,addr[5]);
Writeln(HexStr(addr[5],16));
writeln;
test.Print;
writeln;
test.Release(addr[0],4*1024);
test.Release(addr[2],4*1024);
//test.Release(addr[4],4*1024);
writeln;
test.Print;
writeln;
//writeln(test.CheckedRelease(addr[1],4*1024*2));
//test.Release(addr[1],4*1024*2);
//test.Release(addr[0],4*1024);
//test.Release(addr[2],4*1024);
//test.Release(addr[1],4*1024);
//test.Release(addr[0],4*1024);
//test.Release(addr[1],4*1024);
//test.Release(addr[2],4*1024);
//test.Release(addr[2],4*1024);
//writeln(test.CheckedRelease(addr[1],4*1024));
//writeln(test.CheckedRelease(addr[2],4*1024));
//test.Release(addr[3]+4*1024,4*1024);
test.Release(addr[4],4*1024);
writeln(test.CheckedMmap(addr[1],4*1024));
test.mmap_addr(addr[0],4*1024*6,Pointer(4*1024));
writeln(test.CheckedMmap(addr[1],4*1024));
writeln;
test.Print;
writeln;
test.Release(addr[0],4*1024*6);
writeln;
test.Print;
writeln;
//test.Alloc_any(4*1024,1,0,addr[0]);
//Writeln(HexStr(addr[0],16));
//
//test.Alloc_any(4*1024,1,0,addr[1]);
//Writeln(HexStr(addr[1],16));
//
//test.Alloc_any(4*1024,1,0,addr[2]);
//Writeln(HexStr(addr[2],16));
readln;
end;
initialization
//itest;
end.

View File

@ -142,6 +142,7 @@ end;
procedure TNamedManager._Insert(const key:TNameAdrNode);
begin
Assert(key.Size<>0);
FAllcSet.Insert(key);
end;
@ -187,8 +188,8 @@ begin
if (rkey.Offset <>cmp ) then Exit;
end;
C_LE:if ((rkey.Offset+rkey.Size)<cmp) then Exit;
C_BE:if (key.Offset<cmp) then Exit;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit;
else
Exit;
@ -285,7 +286,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -299,6 +300,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.name:=name;
@ -314,6 +316,8 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
name:=Default(TName);
if (pname<>nil) then

View File

@ -426,6 +426,7 @@ end;
procedure TVirtualManager._Insert(const key:TVirtualAdrNode);
begin
Assert(key.Size<>0);
if key.IsFree then
begin
if (key.F.mapped=0) then
@ -478,17 +479,17 @@ begin
begin
if not rkey.cmp_merge(key) then Exit;
if (ia(rkey,rkey.addr,rkey.Size)<>key.addr) then Exit;
if ((rkey.Offset+rkey.Size)<>cmp ) then Exit;
if ((rkey.Offset+rkey.Size)<>cmp) then Exit;
end;
C_DW:
begin
if not rkey.cmp_merge(key) then Exit;
if (rkey.addr <>key.addr) then Exit;
if (rkey.Offset <>cmp ) then Exit;
if (rkey.Offset <>cmp) then Exit;
end;
C_LE:if ((rkey.Offset+rkey.Size)<cmp) then Exit;
C_BE:if (key.Offset<cmp) then Exit;
C_LE:if ((rkey.Offset+rkey.Size)<=cmp) then Exit;
C_BE:if (rkey.Offset<=cmp) then Exit;
else
Exit;
@ -651,7 +652,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -665,6 +666,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.block:=block;
@ -709,7 +711,9 @@ begin
if _map then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -734,7 +738,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -748,6 +752,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.addr:=addr;
@ -780,7 +785,9 @@ begin
if _map then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -909,7 +916,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -923,6 +930,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
key.IsFree :=False;
@ -948,21 +956,24 @@ var
Result:=False;
err:=0;
if (key.F.direct<>0) then
if (key.Size<>0) then
begin
err:=_UnmapDirect(key.addr,key.Size);
if (err<>0) then Exit;
end;
if (key.F.direct<>0) then
begin
err:=_UnmapDirect(key.addr,key.Size);
if (err<>0) then Exit;
end;
//new save
key.IsFree :=False;
key.F.addr :=addr;
key.F.reserv:=_reserv;
key.F.direct:=_direct;
key.F.stack :=0;
key.F.polled:=0;
key.F.mapped:=_mapped;
_Merge(key);
//new save
key.IsFree :=False;
key.F.addr :=addr;
key.F.reserv:=_reserv;
key.F.direct:=_direct;
key.F.stack :=0;
key.F.polled:=0;
key.F.mapped:=_mapped;
_Merge(key);
end;
if (FEndO>=FEndN) then Exit(True);
@ -975,11 +986,16 @@ var
begin
Result:=0;
if (Size=0) then Exit(EINVAL);
if (Offset<Flo) or (Offset>Fhi) then Exit(EINVAL);
if (Size=0) then Exit(EINVAL);
if (Offset>Fhi) then Exit(EINVAL);
if not _fixed then
if _fixed then
begin
if (Offset<Flo) then Exit(EINVAL);
end else
begin
Offset:=Max(Offset,Flo);
Result:=_FindFreeOffset(Offset,Size,Align,Offset);
if (Result<>0) then Exit;
flags:=flags or MAP_FIXED;
@ -1091,7 +1107,9 @@ begin
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -1121,7 +1139,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_FR or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -1135,6 +1153,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
//new save
if (key.F.reserv=0) then
@ -1194,7 +1213,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -1219,7 +1240,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_FR or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -1233,6 +1254,7 @@ var
function _map:Boolean;
begin
Result:=False;
Assert(key.Size<>0);
if (key.F.direct<>0) then
begin
@ -1297,7 +1319,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -1323,7 +1347,7 @@ var
Result:=True;
end else
if _FetchNode_m(M_BE or C_FR or C_BE,Offset,key) then
if _FetchNode_m(M_BE or C_FR or C_BE,(Offset+Size),key) then
begin
FEndN:=Offset+Size;
FEndO:=key.Offset+key.Size;
@ -1340,6 +1364,7 @@ var
begin
Result:=False;
err:=0;
Assert(key.Size<>0);
if (key.F.direct<>0) then
begin
@ -1439,7 +1464,9 @@ begin
if _skip then Break;
end else
begin
Break;
if (Size<=$1000) then Break;
Offset:=Offset+$1000;
Size :=Size -$1000;
end;
until false;
@ -1532,29 +1559,16 @@ begin
begin
key:=It.Item^;
Writeln(HexStr(QWORD(key.Offset),10),'..',
HexStr(QWORD(key.Offset+key.Size),10),':',
HexStr(key.Size,10),'#',
HexStr(qword(key.addr),10),'#',
Writeln(HexStr(QWORD(key.Offset),11),'..',
HexStr(QWORD(key.Offset+key.Size),11),':',
HexStr(key.Size,11),'#',
HexStr(qword(key.addr),11),'#',
_alloc_str(key),'#');
It.Next;
end;
end;
procedure itest;
var
test:TVirtualManager;
addr:array[0..5] of qword;
begin
test:=TVirtualManager.Create(0,$180000000-1);
end;
initialization
//itest;
end.

View File

@ -771,13 +771,6 @@ begin
//signal
lib^.set_proc($93E017AAEDBF7817,@ps4_getpagesize);
lib^.set_proc($04F13DB3DBD0417A,@ps4_mmap);
lib^.set_proc($52A0C68D7039C943,@ps4_munmap);
lib^.set_proc($B59638F9264D1610,@ps4_msync);
lib^.set_proc($61039FC4BE107DE5,@ps4_mprotect);
lib^.set_proc($FD84D6FAA5DCDC24,@ps4_sceKernelInternalMemoryGetModuleSegmentInfo);
lib^.set_proc($7FB28139A7F2B17A,@ps4_sceKernelGetModuleInfoFromAddr);
lib^.set_proc($914A60AD722BCFB4,@ps4_sceKernelGetModuleInfo);
@ -1008,7 +1001,9 @@ begin
//mmap
lib^.set_proc($93E017AAEDBF7817,@ps4_getpagesize);
lib^.set_proc($A4EF7A4F0CCE9B91,@ps4_sceKernelGetDirectMemorySize);
lib^.set_proc($AD35F0EB9C662C80,@ps4_sceKernelAllocateDirectMemory);
lib^.set_proc($07EBDCD803B666B7,@ps4_sceKernelAllocateMainDirectMemory);
lib^.set_proc($0B47FB4C971B7DA7,@ps4_sceKernelAvailableDirectMemorySize);
@ -1017,14 +1012,26 @@ begin
lib^.set_proc($8705523C29A9E6D3,@ps4_sceKernelCheckedReleaseDirectMemory);
lib^.set_proc($301B88B6F6DAEB3F,@ps4_sceKernelReleaseDirectMemory);
lib^.set_proc($2FF4372C48C86E00,@ps4_sceKernelMapDirectMemory);
lib^.set_proc($98BF0D0C7F3A8902,@ps4_sceKernelMapNamedFlexibleMemory);
lib^.set_proc($21620105D4C78ADE,@ps4_sceKernelMapFlexibleMemory);
lib^.set_proc($04F13DB3DBD0417A,@ps4_mmap);
lib^.set_proc($3C68501DDFDDCEFF,@ps4_sceKernelMmap);
lib^.set_proc($52A0C68D7039C943,@ps4_munmap);
lib^.set_proc($71091EF54B8140E9,@ps4_sceKernelMunmap);
lib^.set_proc($B5E888B4BD9BA05C,@ps4_sceKernelReleaseFlexibleMemory);
lib^.set_proc($61039FC4BE107DE5,@ps4_mprotect);
lib^.set_proc($BD23009B77316136,@ps4_sceKernelMprotect);
lib^.set_proc($F5B7DD2C8CAEC026,@ps4_sceKernelMtypeprotect);
lib^.set_proc($58571F2F697389DA,@ps4_sceKernelQueryMemoryProtection);
lib^.set_proc($AD58D1BC72745FA7,@ps4_sceKernelVirtualQuery);
lib^.set_proc($BD23009B77316136,@ps4_sceKernelMprotect);
lib^.set_proc($0C6306DC9B21AD95,@ps4_sceKernelSetVirtualRangeName);
lib^.set_proc($21620105D4C78ADE,@ps4_sceKernelMapFlexibleMemory);
lib^.set_proc($98BF0D0C7F3A8902,@ps4_sceKernelMapNamedFlexibleMemory);
lib^.set_proc($EE8C6FDCF3C2BA6A,@ps4_sceKernelReserveVirtualRange);
lib^.set_proc($0504278A8963F6D4,@ps4_sceKernelMapDirectMemory2);
lib^.set_proc($2FF4372C48C86E00,@ps4_sceKernelMapDirectMemory);
lib^.set_proc($35C6965317CC3484,@ps4_sceKernelMapNamedDirectMemory);
lib^.set_proc($B59638F9264D1610,@ps4_msync);
lib^.set_proc($0E435E6F1989C952,@ps4_sceKernelMsync);
//mmap

File diff suppressed because it is too large Load Diff