diff --git a/kernel/ps4_libscelibcinternal.pas b/kernel/ps4_libscelibcinternal.pas index f84d28bd..67a81b95 100644 --- a/kernel/ps4_libscelibcinternal.pas +++ b/kernel/ps4_libscelibcinternal.pas @@ -260,6 +260,25 @@ begin lib^.set_proc($6C6B8377791654A4,@ps4_bGuDd3kWVKQ); lib^.set_proc($7FD2D5C8DF0ACBC8,@ps4_f9LVyN8Ky8g); + lib^.set_proc($46A784ACEDDC1475,@ps4__ZSt15set_new_handlerPFvvE); + lib^.set_proc($0A46340156BF7EB8,@ps4__ZSt15get_new_handlerv); + + lib^.set_proc($85D9B461F31AED34,@ps4__Znam); + lib^.set_proc($7C99E9B955416CA9,@ps4__Znwm); + lib^.set_proc($AF25310FFEB46CA3,@ps4__ZnwmRKSt9nothrow_t); + lib^.set_proc($261E6A51CC224849,@ps4__ZnamRKSt9nothrow_t); + + lib^.set_proc($30B5A5F7448558D1,@ps4__ZdaPv); + lib^.set_proc($14EB79E5935A5499,@ps4__ZdaPvm); + lib^.set_proc($EE50A2848D7C37D2,@ps4__ZdaPvmRKSt9nothrow_t); + lib^.set_proc($9BF7D2A3711BC4D0,@ps4__ZdaPvRKSt9nothrow_t); + lib^.set_proc($CFE3FEC429D62C19,@ps4__ZdlPv); + lib^.set_proc($9580F3055139999B,@ps4__ZdlPvm); + lib^.set_proc($ED53C8605A705360,@ps4__ZdlPvmRKSt9nothrow_t); + lib^.set_proc($31CB069EA57AC911,@ps4__ZdlPvRKSt9nothrow_t); + lib^.set_proc($4AE73C5B440FC63C,@ps4__ZdaPvS_); + lib^.set_proc($D6FA3AAAAA9AF45E,@ps4__ZdlPvS_); + lib:=Result._add_lib('libSceLibcInternalExt'); lib^.set_proc($356B53375D1C2731,@ps4_sceLibcHeapGetTraceInfo); diff --git a/kernel/ps4_mspace.pas b/kernel/ps4_mspace.pas index 9b76a47b..7a82d3be 100644 --- a/kernel/ps4_mspace.pas +++ b/kernel/ps4_mspace.pas @@ -188,9 +188,29 @@ function ps4_f9LVyN8Ky8g:Pointer; SysV_ABI_CDecl; //f9LVyN8Ky8g procedure ps4_sceLibcHeapGetTraceInfo(P:PGetTraceInfo); SysV_ABI_CDecl; +function ps4__ZSt15set_new_handlerPFvvE(new_p:Pointer):Pointer; SysV_ABI_CDecl; +function ps4__ZSt15get_new_handlerv:Pointer; SysV_ABI_CDecl; + +function ps4__Znam(count:qword):Pointer; SysV_ABI_CDecl; +function ps4__Znwm(count:qword):Pointer; SysV_ABI_CDecl; +function ps4__ZnwmRKSt9nothrow_t(count:qword;tag:Pointer):Pointer; SysV_ABI_CDecl; +function ps4__ZnamRKSt9nothrow_t(count:qword;tag:Pointer):Pointer; SysV_ABI_CDecl; + +procedure ps4__ZdaPv(ptr:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdaPvm(ptr:Pointer;size:qword); SysV_ABI_CDecl; +procedure ps4__ZdaPvmRKSt9nothrow_t(ptr:Pointer;size:qword;tag:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdaPvRKSt9nothrow_t(ptr,tag:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdlPv(ptr:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdlPvm(ptr:Pointer;size:qword); SysV_ABI_CDecl; +procedure ps4__ZdlPvmRKSt9nothrow_t(ptr:Pointer;size:qword;tag:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdlPvRKSt9nothrow_t(ptr,tag:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdaPvS_(ptr,place:Pointer); SysV_ABI_CDecl; +procedure ps4__ZdlPvS_(ptr,place:Pointer); SysV_ABI_CDecl; + implementation uses + atomic, sys_kernel, sys_signal; @@ -3762,6 +3782,175 @@ begin P^.mstate_table :=@g_mstate_table; end; +// + +var + g_std_new_handler:Pointer=nil; + +//_func_void * std::set_new_handler(_func_void *new_p) +function ps4__ZSt15set_new_handlerPFvvE(new_p:Pointer):Pointer; SysV_ABI_CDecl; +begin + Result:=XCHG(g_std_new_handler,new_p); +end; + +//_func_void * std::get_new_handler(void) +function ps4__ZSt15get_new_handlerv:Pointer; SysV_ABI_CDecl; +begin + Result:=load_acq_rel(g_std_new_handler); +end; + +// + +//void * operator.new[](ulong count) +function ps4__Znam(count:qword):Pointer; SysV_ABI_CDecl; +var + addr:Pointer; + handler:TProcedure; +begin + if (count=0) then count:=1; + + While (true) do + begin + addr:=ps4_malloc(count); + if (addr<>nil) then Exit(addr); + handler:=TProcedure(ps4__ZSt15get_new_handlerv); + if (handler=nil) then Break; + handler(); + end; + Assert(false,'std::_Xbad_alloc'); +end; + +//void * operator.new(ulong count) +function ps4__Znwm(count:qword):Pointer; SysV_ABI_CDecl; +var + addr:Pointer; + handler:TProcedure; +begin + if (count=0) then count:=1; + + While (true) do + begin + addr:=ps4_malloc(count); + if (addr<>nil) then Exit(addr); + handler:=TProcedure(ps4__ZSt15get_new_handlerv); + if (handler=nil) then Break; + handler(); + end; + Assert(false,'std::_Xbad_alloc'); +end; + +//void * operator.new(ulong count,nothrow_t *tag) +function ps4__ZnwmRKSt9nothrow_t(count:qword;tag:Pointer):Pointer; SysV_ABI_CDecl; +var + addr:Pointer; + handler:TProcedure; +begin + if (count=0) then count:=1; + + While (true) do + begin + addr:=ps4_malloc(count); + if (addr<>nil) then Break; + handler:=TProcedure(ps4__ZSt15get_new_handlerv); + if (handler=nil) then Break; + handler(); + end; + + Result:=addr; +end; + +//void * operator.new[](ulong count,nothrow_t *tag) +function ps4__ZnamRKSt9nothrow_t(count:qword;tag:Pointer):Pointer; SysV_ABI_CDecl; +begin + Result:=ps4__ZnwmRKSt9nothrow_t(count,tag); +end; + +// + +//void operator.delete[](void *ptr) +procedure ps4__ZdaPv(ptr:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete[](void *ptr,ulong size) +procedure ps4__ZdaPvm(ptr:Pointer;size:qword); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete[](void *ptr,ulong size,nothrow_t *tag) +procedure ps4__ZdaPvmRKSt9nothrow_t(ptr:Pointer;size:qword;tag:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete[](void *ptr,nothrow_t *tag) +procedure ps4__ZdaPvRKSt9nothrow_t(ptr,tag:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete(void *ptr) +procedure ps4__ZdlPv(ptr:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete(void *ptr,ulong size) +procedure ps4__ZdlPvm(ptr:Pointer;size:qword); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete(void *ptr,ulong size,nothrow_t *tag) +procedure ps4__ZdlPvmRKSt9nothrow_t(ptr:Pointer;size:qword;tag:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete(void *ptr,nothrow_t *tag) +procedure ps4__ZdlPvRKSt9nothrow_t(ptr,tag:Pointer); SysV_ABI_CDecl; +begin + if (ptr<>nil) then + begin + ps4_free(ptr); + end; +end; + +//void operator.delete[](void *ptr,void *place) +procedure ps4__ZdaPvS_(ptr,place:Pointer); SysV_ABI_CDecl; +begin + // +end; + +//void operator.delete(void *ptr,void *place) +procedure ps4__ZdlPvS_(ptr,place:Pointer); SysV_ABI_CDecl; +begin + // +end; + end.