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,
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;

View File

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

View File

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

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
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;

View File

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

View File

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

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_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

View File

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

View File

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

View File

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