diff --git a/sys/dev/dev_dmem.pas b/sys/dev/dev_dmem.pas index ff62e6c7..e4e67759 100644 --- a/sys/dev/dev_dmem.pas +++ b/sys/dev/dev_dmem.pas @@ -18,7 +18,8 @@ uses subr_uio, vm, dmem_map, - kern_dmem; + kern_dmem, + trap; type PAvailableDirectMemorySize=^TAvailableDirectMemorySize; @@ -48,7 +49,10 @@ begin end; end; else - Assert(False); + begin + print_backtrace_c(stderr); + Assert(False); + end; end; end; @@ -58,6 +62,8 @@ begin Result:=0; Writeln('dmem_mmap("',dev^.si_name,'",0x',HexStr(offset,8),',0x',HexStr(paddr),',',nprot,')'); + + print_backtrace_c(stderr); Assert(False); end; diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index cd510db9..8cb2f4db 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -22,6 +22,23 @@ uses var gc_mmap_ptr:Pointer=nil; + gc_AreSubmitsAllowed:Integer=0; //0=true,1=false (0xfe0100000) + +type + p_SetGsRingSizes=^t_SetGsRingSizes; + t_SetGsRingSizes=packed record + psize_1:DWORD; + psize_2:DWORD; + p__zero:DWORD; + end; + + p_SetMipStatsReport=^t_SetMipStatsReport; + t_SetMipStatsReport=packed record + p_type:DWORD; + param1:DWORD; + param2:DWORD; + param3:DWORD; + end; Function gc_ioctl(dev:p_cdev;cmd:QWORD;data:Pointer;fflag:Integer):Integer; begin @@ -30,10 +47,41 @@ begin Writeln('gc_ioctl(0x',HexStr(cmd,8),')'); case cmd of - 0:; + $C004811F: //sceGnmGetNumTcaUnits + begin + Exit(19); + end; + + $C00C8110: //sceGnmSetGsRingSizes + begin + Writeln('SetGsRingSizes(0x',HexStr(p_SetGsRingSizes(data)^.psize_1,8),',0x' + ,HexStr(p_SetGsRingSizes(data)^.psize_2,8),')'); + end; + + $C0848119: //*MipStatsReport + begin + case PInteger(data)^ of + $10001: + begin + Writeln('MipStatsReport(0x',HexStr(p_SetMipStatsReport(data)^.param1,8),',0x' + ,HexStr(p_SetMipStatsReport(data)^.param2,8),',0x' + ,HexStr(p_SetMipStatsReport(data)^.param3,8),')'); + end; + + $18001:; //diag? + + else + Exit(EINVAL); + end; + end; + $C008811B: //sceGnmAreSubmitsAllowed + begin + PPointer(data)^:=@gc_AreSubmitsAllowed; + end; + else begin - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); Result:=EINVAL; end; diff --git a/sys/kern/kern_ipmimgr.pas b/sys/kern/kern_ipmimgr.pas index d308887d..2e6a715a 100644 --- a/sys/kern/kern_ipmimgr.pas +++ b/sys/kern/kern_ipmimgr.pas @@ -256,7 +256,7 @@ begin begin Result:=0; dst:=-1; - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); end; end; diff --git a/sys/kern/kern_mdbg.pas b/sys/kern/kern_mdbg.pas new file mode 100644 index 00000000..1ed32230 --- /dev/null +++ b/sys/kern/kern_mdbg.pas @@ -0,0 +1,74 @@ +unit kern_mdbg; + +{$mode ObjFPC}{$H+} +{$CALLING SysV_ABI_CDecl} + +interface + +function sys_mdbg_service(op:Integer;arg1,arg2:Pointer):Integer; + +implementation + +uses + errno, + systm, + trap; + +type + t_SetProcessProperty=packed record //0x48 + f_0:Pointer; + f_1:Pointer; + f_2:Pointer; + f_3:Pointer; + f_4:Pointer; + name:array[0..31] of AnsiChar; + end; + +function SetProcessProperty(arg1:Pointer):Integer; +var + data:t_SetProcessProperty; +begin + Result:=copyin(arg1,@data,SizeOf(t_SetProcessProperty)); + if (Result<>0) then Exit; + + case String(data.name) of + 'Sce.PSM:AppName':; //1 + 'Sce.PSM:SdbInfo':; //2 + 'Sce.PSM:LogArea':; //3 + 'Sce.Debug:UserObjArray':; //4 + 'Sce.Debug:Gnm':; //5 + else + Exit(EINVAL); + end; + + Writeln('SetProcessProperty("',data.name,'",0x', + HexStr(data.f_1),',0x', + HexStr(data.f_2),',0x', + HexStr(data.f_3),',0x', + HexStr(data.f_4),')'); + +end; + +function sys_mdbg_service(op:Integer;arg1,arg2:Pointer):Integer; +begin + case op of + + 1: //SetProcessProperty + begin + Result:=SetProcessProperty(arg1); + end; + + else + begin + print_backtrace_c(stderr); + Assert(False); + Result:=EINVAL; + end; + end; + +end; + + + +end. + diff --git a/sys/kern/kern_regmgr.pas b/sys/kern/kern_regmgr.pas index 7dfb85d7..45fcfe80 100644 --- a/sys/kern/kern_regmgr.pas +++ b/sys/kern/kern_regmgr.pas @@ -77,7 +77,7 @@ begin else begin Writeln(' enc:0x',HexStr(qword(data.enc),16)); - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); end; end; @@ -108,7 +108,7 @@ begin else begin Writeln(' enc:0x',HexStr(qword(data.enc),16)); - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); end; end; @@ -121,7 +121,7 @@ begin else begin Writeln('Unhandled regmgr op:0x',HexStr(op,4)); - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); end; end; diff --git a/sys/kern/trap.pas b/sys/kern/trap.pas index ff492702..cc104bd2 100644 --- a/sys/kern/trap.pas +++ b/sys/kern/trap.pas @@ -110,6 +110,7 @@ procedure sig_sti; procedure sig_cli; procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint); +procedure print_backtrace_c(var f:text); procedure fast_syscall; procedure sigcode; @@ -476,6 +477,16 @@ begin end; end; +procedure print_backtrace_c(var f:text); +var + td:p_kthread; +begin + td:=curkthread; + if (td=nil) then Exit; + // + print_backtrace(stderr,Pointer(td^.td_frame.tf_rip),Pointer(td^.td_frame.tf_rbp),0); +end; + type tsyscall=function(rdi,rsi,rdx,rcx,r8,r9:QWORD):Integer; diff --git a/sys/kern/uipc_syscalls.pas b/sys/kern/uipc_syscalls.pas index 7a75d497..08772ad7 100644 --- a/sys/kern/uipc_syscalls.pas +++ b/sys/kern/uipc_syscalls.pas @@ -34,7 +34,7 @@ begin end; else begin - print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); + print_backtrace_c(stderr); Assert(False); end; end; diff --git a/sys/syscalls.pas b/sys/syscalls.pas index adeec438..51a50afb 100644 --- a/sys/syscalls.pas +++ b/sys/syscalls.pas @@ -220,6 +220,7 @@ function __sys_dynlib_unload_prx(handle:Integer;args:QWORD;argp:Pointer):Intege function dynlib_do_copy_relocations():Integer; function dynlib_get_proc_param(pout:PPointer;psize:PQWORD):Integer; function dynlib_process_needed_and_relocate():Integer; +function mdbg_service(op:Integer;arg1,arg2:Pointer):Integer; function __sys_randomized_path(src,dst:pchar;plen:PQWORD):Integer; function __sys_dl_get_metadata(pid,handle:Integer;pout:Pointer;size:Integer;pactual_size:PInteger):Integer; function __sys_workaround8849(key:DWORD):Integer; @@ -1744,6 +1745,13 @@ asm jmp cerror end; +function mdbg_service(op:Integer;arg1,arg2:Pointer):Integer; assembler; nostackframe; +asm + movq $601,%rax + call fast_syscall + jmp cerror +end; + function __sys_randomized_path(src,dst:pchar;plen:PQWORD):Integer; assembler; nostackframe; asm movq $602,%rax diff --git a/sys/sysent.pas b/sys/sysent.pas index fc05de34..09578d7c 100644 --- a/sys/sysent.pas +++ b/sys/sysent.pas @@ -17,6 +17,7 @@ uses kern_dmem, kern_exec, kern_exit, + kern_mdbg, kern_osem, kern_prot, kern_time, @@ -3065,7 +3066,7 @@ const ), (//[601] sy_narg:3; - sy_call:nil; + sy_call:@sys_mdbg_service; sy_name:'sys_mdbg_service' ), (//[602] diff --git a/sys/test/project1.lpi b/sys/test/project1.lpi index c198480f..e3448c2d 100644 --- a/sys/test/project1.lpi +++ b/sys/test/project1.lpi @@ -682,6 +682,10 @@ + + + + diff --git a/sys/test/project1.lpr b/sys/test/project1.lpr index f4b76f2c..33092b26 100644 --- a/sys/test/project1.lpr +++ b/sys/test/project1.lpr @@ -100,6 +100,7 @@ uses kern_bnet, uipc_syscalls, kern_ipmimgr, + kern_mdbg, ps4_libSceSystemService, ps4_libSceIpmi, ps4_libSceDialogs;