This commit is contained in:
Pavel 2022-06-02 16:25:38 +03:00
parent a505a89666
commit 296bf15fd0
3 changed files with 137 additions and 19 deletions

View File

@ -464,23 +464,23 @@ end;
type
PGetTraceInfo=^TGetTraceInfo;
TGetTraceInfo=packed record
Size:QWORD; //32
flag:DWORD; //1
get_segment_info:DWORD; //0
Unknow4:Pointer; //[2]
Unknow5:Pointer; //[3]
Size:QWORD; //32
flag:DWORD; //1
get_segment_info:DWORD; //0
mspace_atomic_id_mask:PQWORD;
mstate_table:PQWORD;
end;
var
td1:Pointer=Pointer($101);
td2:Pointer=Pointer($202);
g_mspace_atomic_id_mask:QWORD=0;
g_mstate_table:array[0..63] of QWORD;
//mysterious function
procedure ps4_sceLibcHeapGetTraceInfo(P:PGetTraceInfo); SysV_ABI_CDecl;
begin
P^.get_segment_info:=0;
P^.Unknow4:=@td1;
P^.Unknow5:=@td2;
P^.get_segment_info :=0;
P^.mspace_atomic_id_mask:=@g_mspace_atomic_id_mask;
P^.mstate_table :=@g_mstate_table;
end;
function ps4_sceSysmoduleLoadModule(id:Word):Integer; SysV_ABI_CDecl;
@ -875,6 +875,7 @@ begin
//mmap
lib^.set_proc($A4EF7A4F0CCE9B91,@ps4_sceKernelGetDirectMemorySize);
lib^.set_proc($0B47FB4C971B7DA7,@ps4_sceKernelAvailableDirectMemorySize);
lib^.set_proc($047A2E2D0CE1D17D,@ps4_sceKernelDirectMemoryQuery);
lib^.set_proc($AD35F0EB9C662C80,@ps4_sceKernelAllocateDirectMemory);
lib^.set_proc($2FF4372C48C86E00,@ps4_sceKernelMapDirectMemory);

View File

@ -78,6 +78,13 @@ function ps4_sceKernelAllocateDirectMemory(
memoryType:Integer;
physicalAddrDest:PQWORD):Integer; SysV_ABI_CDecl;
function ps4_sceKernelAvailableDirectMemorySize(
searchStart:QWORD;
searchEnd:QWORD;
alignment:QWORD;
physAddrOut:PQWORD;
sizeOut:PQWORD):Integer; SysV_ABI_CDecl;
function ps4_sceKernelMapDirectMemory(
virtualAddrDest:PPointer;
length:QWORD;
@ -460,6 +467,7 @@ type
var
FLock:TRWLock;
FDirectSize:QWORD;
FDirectAdrSet:TDirectAdrSet;
FMapBlockSet:TBlockSet;
@ -1200,7 +1208,10 @@ begin
Writeln('srch:',HexStr(searchStart,16),'..',HexStr(searchEnd,16),' len:',HexStr(length,16));
Writeln('align:',HexStr(alignment,16),' ','mType:',str_mem_type(memoryType));
if (physicalAddrDest=nil) or (length=0) or (searchEnd<searchStart) then Exit(SCE_KERNEL_ERROR_EINVAL);
if (physicalAddrDest=nil) or (length=0) or (searchEnd<=searchStart) then Exit(SCE_KERNEL_ERROR_EINVAL);
if (searchEnd>SCE_KERNEL_MAIN_DMEM_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsAlign(length ,LOGICAL_PAGE_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsAlign(alignment,LOGICAL_PAGE_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsPowerOfTwo(alignment) then Exit(SCE_KERNEL_ERROR_EINVAL);
@ -1212,22 +1223,40 @@ begin
Adr.bType:=memoryType;
Result:=0;
_sig_lock;
rwlock_wrlock(PageMM.FLock);
if ((PageMM.FDirectSize+Adr.nSize)>SCE_KERNEL_MAIN_DMEM_SIZE) then
begin
rwlock_unlock(PageMM.FLock);
_sig_unlock;
Exit(SCE_KERNEL_ERROR_EAGAIN);
end;
repeat
if ((QWORD(Adr.pAddr)+Adr.nSize)>SCE_KERNEL_MAIN_DMEM_SIZE) then
begin
Result:=SCE_KERNEL_ERROR_EAGAIN;
Break;
end;
Tmp.pAddr:=Adr.pAddr+Adr.nSize-1;
Tmp.nSize:=0;
Tmp.bType:=0;
It:=PageMM.FDirectAdrSet.find_le(Tmp);
if (It.Item=nil) then Break;
Tmp:=It.Item^;
m1:=Tmp.pAddr+Tmp.nSize;
if (Adr.pAddr>=m1) then Break;
m1:=AlignUp(m1,alignment);
m2:=Adr.pAddr+alignment;
if (m1>m2) then
Adr.pAddr:=m1
else
@ -1235,20 +1264,22 @@ begin
if (Adr.pAddr>=Pointer(searchEnd)) then
begin
rwlock_unlock(PageMM.FLock);
_sig_unlock;
Exit(SCE_KERNEL_ERROR_EAGAIN);
Result:=SCE_KERNEL_ERROR_EAGAIN;
Break;
end;
until false;
PageMM.FDirectAdrSet.Insert(Adr);
if (Result=0) then
begin
PageMM.FDirectSize:=PageMM.FDirectSize+Adr.nSize;
PageMM.FDirectAdrSet.Insert(Adr);
physicalAddrDest^:=QWORD(Adr.pAddr);
end;
rwlock_unlock(PageMM.FLock);
_sig_unlock;
physicalAddrDest^:=QWORD(Adr.pAddr);
Result:=0;
end;
@ -1267,6 +1298,87 @@ SCE_KERNEL_MAP_NO_COALESCE
}
function ps4_sceKernelAvailableDirectMemorySize(
searchStart:QWORD;
searchEnd:QWORD;
alignment:QWORD;
physAddrOut:PQWORD;
sizeOut:PQWORD):Integer; SysV_ABI_CDecl;
var
It:TDirectAdrSet.Iterator;
offset,size:QWORD;
Tmp:TBlock;
begin
if (physAddrOut=nil) or (sizeOut=nil) or (searchEnd<=searchStart) then Exit(SCE_KERNEL_ERROR_EINVAL);
if (searchEnd>SCE_KERNEL_MAIN_DMEM_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsAlign(searchStart,LOGICAL_PAGE_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsAlign(searchEnd ,LOGICAL_PAGE_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsAlign(alignment ,LOGICAL_PAGE_SIZE) then Exit(SCE_KERNEL_ERROR_EINVAL);
if not IsPowerOfTwo(alignment) then Exit(SCE_KERNEL_ERROR_EINVAL);
if (alignment=0) then alignment:=LOGICAL_PAGE_SIZE;
physAddrOut^:=0;
sizeOut^ :=0;
offset:=0;
Result:=0;
_sig_lock;
rwlock_wrlock(PageMM.FLock);
repeat
Tmp.pAddr:=AlignUp(Pointer(offset),alignment);
Tmp.nSize:=0;
Tmp.bType:=0;
It:=PageMM.FDirectAdrSet.find_be(Tmp);
if (It.Item=nil) then //nothing to be
begin
size:=searchEnd-offset;
if (size=0) then
begin
Result:=SCE_KERNEL_ERROR_EAGAIN;
Break;
end else
begin
physAddrOut^:=offset;
sizeOut^ :=size;
Break;
end;
end;
Tmp:=It.Item^;
size:=QWORD(Tmp.pAddr)-offset;
if (size<>0) then
begin
physAddrOut^:=offset;
sizeOut^ :=size;
Break;
end;
offset:=QWORD(Tmp.pAddr)+Tmp.nSize;
if (offset>=searchEnd) then
begin
Result:=SCE_KERNEL_ERROR_EAGAIN;
Break;
end;
until false;
rwlock_unlock(PageMM.FLock);
_sig_unlock;
Result:=0;
end;
const
SCE_KERNEL_DMQ_FIND_NEXT=1;
@ -1316,7 +1428,6 @@ begin
rwlock_unlock(PageMM.FLock);
_sig_unlock;
end;
function ps4_sceKernelMapDirectMemory(

View File

@ -140,7 +140,12 @@ begin
Result:=0;
end;
//nop nid:libSceNpManager:55F45298F9A3F10F:sceNpRegisterStateCallback
function ps4_sceNpRegisterStateCallback(callback:SceNpStateCallbackA;userdata:Pointer):Integer; SysV_ABI_CDecl;
begin
Cb4Toolkit.callback:=callback;
Cb4Toolkit.userdata:=userdata;
Result:=0;
end;
function ps4_sceNpCheckCallbackForLib():Integer; SysV_ABI_CDecl;
begin
@ -163,6 +168,7 @@ begin
lib^.set_proc($5C39DC5D02095129,@ps4_sceNpGetOnlineId);
lib^.set_proc($11CEB7CB9F65F6DC,@ps4_sceNpSetNpTitleId);
lib^.set_proc($DD997C05E3D387D6,@ps4_sceNpCheckCallback);
lib^.set_proc($55F45298F9A3F10F,@ps4_sceNpRegisterStateCallback);
lib:=Result._add_lib('libSceNpManagerForToolkit');
lib^.set_proc($D1CEC76D744A52DE,@ps4_sceNpRegisterStateCallbackForToolkit);