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;