mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
a505a89666
commit
296bf15fd0
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue