This commit is contained in:
Pavel 2023-08-09 22:41:21 +03:00
parent 24a9c2165a
commit 99897bbb44
11 changed files with 163 additions and 10 deletions

View File

@ -18,7 +18,8 @@ uses
subr_uio, subr_uio,
vm, vm,
dmem_map, dmem_map,
kern_dmem; kern_dmem,
trap;
type type
PAvailableDirectMemorySize=^TAvailableDirectMemorySize; PAvailableDirectMemorySize=^TAvailableDirectMemorySize;
@ -48,7 +49,10 @@ begin
end; end;
end; end;
else else
Assert(False); begin
print_backtrace_c(stderr);
Assert(False);
end;
end; end;
end; end;
@ -58,6 +62,8 @@ begin
Result:=0; Result:=0;
Writeln('dmem_mmap("',dev^.si_name,'",0x',HexStr(offset,8),',0x',HexStr(paddr),',',nprot,')'); Writeln('dmem_mmap("',dev^.si_name,'",0x',HexStr(offset,8),',0x',HexStr(paddr),',',nprot,')');
print_backtrace_c(stderr);
Assert(False); Assert(False);
end; end;

View File

@ -22,6 +22,23 @@ uses
var var
gc_mmap_ptr:Pointer=nil; 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; Function gc_ioctl(dev:p_cdev;cmd:QWORD;data:Pointer;fflag:Integer):Integer;
begin begin
@ -30,10 +47,41 @@ begin
Writeln('gc_ioctl(0x',HexStr(cmd,8),')'); Writeln('gc_ioctl(0x',HexStr(cmd,8),')');
case cmd of 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 else
begin begin
print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); print_backtrace_c(stderr);
Assert(False); Assert(False);
Result:=EINVAL; Result:=EINVAL;
end; end;

View File

@ -256,7 +256,7 @@ begin
begin begin
Result:=0; Result:=0;
dst:=-1; dst:=-1;
print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); print_backtrace_c(stderr);
Assert(False); Assert(False);
end; end;
end; end;

74
sys/kern/kern_mdbg.pas Normal file
View File

@ -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.

View File

@ -77,7 +77,7 @@ begin
else else
begin begin
Writeln(' enc:0x',HexStr(qword(data.enc),16)); 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); Assert(False);
end; end;
end; end;
@ -108,7 +108,7 @@ begin
else else
begin begin
Writeln(' enc:0x',HexStr(qword(data.enc),16)); 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); Assert(False);
end; end;
end; end;
@ -121,7 +121,7 @@ begin
else else
begin begin
Writeln('Unhandled regmgr op:0x',HexStr(op,4)); 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); Assert(False);
end; end;
end; end;

View File

@ -110,6 +110,7 @@ procedure sig_sti;
procedure sig_cli; procedure sig_cli;
procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint); procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint);
procedure print_backtrace_c(var f:text);
procedure fast_syscall; procedure fast_syscall;
procedure sigcode; procedure sigcode;
@ -476,6 +477,16 @@ begin
end; end;
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 type
tsyscall=function(rdi,rsi,rdx,rcx,r8,r9:QWORD):Integer; tsyscall=function(rdi,rsi,rdx,rcx,r8,r9:QWORD):Integer;

View File

@ -34,7 +34,7 @@ begin
end; end;
else else
begin begin
print_backtrace(stderr,Pointer(curkthread^.td_frame.tf_rip),Pointer(curkthread^.td_frame.tf_rbp),0); print_backtrace_c(stderr);
Assert(False); Assert(False);
end; end;
end; end;

View File

@ -220,6 +220,7 @@ function __sys_dynlib_unload_prx(handle:Integer;args:QWORD;argp:Pointer):Intege
function dynlib_do_copy_relocations():Integer; function dynlib_do_copy_relocations():Integer;
function dynlib_get_proc_param(pout:PPointer;psize:PQWORD):Integer; function dynlib_get_proc_param(pout:PPointer;psize:PQWORD):Integer;
function dynlib_process_needed_and_relocate():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_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_dl_get_metadata(pid,handle:Integer;pout:Pointer;size:Integer;pactual_size:PInteger):Integer;
function __sys_workaround8849(key:DWORD):Integer; function __sys_workaround8849(key:DWORD):Integer;
@ -1744,6 +1745,13 @@ asm
jmp cerror jmp cerror
end; 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; function __sys_randomized_path(src,dst:pchar;plen:PQWORD):Integer; assembler; nostackframe;
asm asm
movq $602,%rax movq $602,%rax

View File

@ -17,6 +17,7 @@ uses
kern_dmem, kern_dmem,
kern_exec, kern_exec,
kern_exit, kern_exit,
kern_mdbg,
kern_osem, kern_osem,
kern_prot, kern_prot,
kern_time, kern_time,
@ -3065,7 +3066,7 @@ const
), ),
(//[601] (//[601]
sy_narg:3; sy_narg:3;
sy_call:nil; sy_call:@sys_mdbg_service;
sy_name:'sys_mdbg_service' sy_name:'sys_mdbg_service'
), ),
(//[602] (//[602]

View File

@ -682,6 +682,10 @@
<Filename Value="..\vm\device_pager.pas"/> <Filename Value="..\vm\device_pager.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
</Unit> </Unit>
<Unit>
<Filename Value="..\kern\kern_mdbg.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units> </Units>
</ProjectOptions> </ProjectOptions>
<CompilerOptions> <CompilerOptions>

View File

@ -100,6 +100,7 @@ uses
kern_bnet, kern_bnet,
uipc_syscalls, uipc_syscalls,
kern_ipmimgr, kern_ipmimgr,
kern_mdbg,
ps4_libSceSystemService, ps4_libSceSystemService,
ps4_libSceIpmi, ps4_libSceIpmi,
ps4_libSceDialogs; ps4_libSceDialogs;