mirror of https://github.com/red-prig/fpPS4.git
192 lines
3.8 KiB
Plaintext
192 lines
3.8 KiB
Plaintext
unit dev_gc;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
kern_conf;
|
|
|
|
procedure gc_initialize();
|
|
|
|
implementation
|
|
|
|
uses
|
|
errno,
|
|
kern_authinfo,
|
|
vm,
|
|
vmparam,
|
|
sys_vm_object,
|
|
vm_pager,
|
|
subr_backtrace;
|
|
|
|
var
|
|
gc_page:array[0..PAGE_SIZE-1] of Byte;
|
|
|
|
gc_AreSubmitsAllowed:Integer=0; //0=true,1=false (0xfe0100000)
|
|
|
|
type
|
|
p_SetGsRingSizes=^t_SetGsRingSizes;
|
|
t_SetGsRingSizes=packed record
|
|
esgsRingSize:DWORD;
|
|
gsvsRingSize:DWORD;
|
|
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
|
|
Result:=0;
|
|
|
|
Writeln('gc_ioctl(0x',HexStr(cmd,8),')');
|
|
|
|
case cmd of
|
|
$C004811F: //sceGnmGetNumTcaUnits
|
|
begin
|
|
Exit(19);
|
|
end;
|
|
|
|
$C00C8110: //sceGnmSetGsRingSizes
|
|
begin
|
|
Writeln('SetGsRingSizes(0x',HexStr(p_SetGsRingSizes(data)^.esgsRingSize,8),',0x'
|
|
,HexStr(p_SetGsRingSizes(data)^.gsvsRingSize,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;
|
|
|
|
$C010810B: //get cu mask
|
|
begin
|
|
PInteger(data)[0]:=$10; //& 0x3ff GC SE0 Redundant CU: 0x10
|
|
PInteger(data)[1]:=$10; //& 0x3ff GC SE1 Redundant CU: 0x10
|
|
PInteger(data)[2]:=$00; //& 0x3ff GC SE2 Redundant CU: 0x00
|
|
PInteger(data)[3]:=$00; //& 0x3ff GC SE3 Redundant CU: 0x00
|
|
end;
|
|
|
|
$C0048116: //sceGnmSubmitDone
|
|
begin
|
|
Writeln('sceGnmSubmitDone');
|
|
end;
|
|
|
|
$C0048114: //sceGnmFlushGarlic
|
|
begin
|
|
Writeln('sceGnmFlushGarlic');
|
|
end
|
|
|
|
|
|
else
|
|
begin
|
|
print_backtrace_td(stderr);
|
|
Assert(False);
|
|
Result:=EINVAL;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
Function gc_mmap_single(cdev:p_cdev;offset:p_vm_ooffset_t;size:vm_size_t;objp:p_vm_object_t;nprot:Integer):Integer;
|
|
var
|
|
obj:vm_object_t;
|
|
begin
|
|
if sceSblACMgrHasUseHp3dPipeCapability(@g_authinfo) then
|
|
begin
|
|
Exit(EINVAL);
|
|
end;
|
|
|
|
if (offset^>=PAGE_SIZE) then
|
|
begin
|
|
Exit(EPERM);
|
|
end;
|
|
|
|
if (size<>PAGE_SIZE) then
|
|
begin
|
|
Exit(EINVAL);
|
|
end;
|
|
|
|
obj:=vm_pager_allocate(OBJT_DEVICE,cdev,PAGE_SIZE,nprot,offset^);
|
|
obj^.un_pager.map_base:=@gc_page;
|
|
|
|
if (obj=nil) then
|
|
begin
|
|
Exit(EINVAL);
|
|
end;
|
|
|
|
objp^:=obj;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
Function gc_mmap(dev:p_cdev;offset:vm_ooffset_t;paddr:p_vm_paddr_t;nprot:Integer;memattr:p_vm_memattr_t):Integer;
|
|
begin
|
|
if sceSblACMgrHasUseHp3dPipeCapability(@g_authinfo) then
|
|
begin
|
|
Exit(EINVAL);
|
|
end;
|
|
|
|
if (offset>=PAGE_SIZE) then
|
|
begin
|
|
Exit(EPERM);
|
|
end;
|
|
|
|
paddr^:=offset + QWORD(@gc_page);
|
|
memattr^:=0;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
const
|
|
gc_cdevsw:t_cdevsw=(
|
|
d_version :D_VERSION;
|
|
d_flags :0;
|
|
d_name :'gc';
|
|
d_open :nil;
|
|
d_fdopen :nil;
|
|
d_close :nil;
|
|
d_read :nil;
|
|
d_write :nil;
|
|
d_ioctl :@gc_ioctl;
|
|
d_poll :nil;
|
|
d_mmap :@gc_mmap;
|
|
d_strategy :nil;
|
|
d_dump :nil;
|
|
d_kqfilter :nil;
|
|
d_purge :nil;
|
|
d_mmap_single :@gc_mmap_single;
|
|
d_mmap_single2:nil;
|
|
);
|
|
|
|
procedure gc_initialize();
|
|
begin
|
|
make_dev(@gc_cdevsw,0,0,0,&666,'gc',[]);
|
|
end;
|
|
|
|
|
|
end.
|
|
|