mirror of https://github.com/red-prig/fpPS4.git
187 lines
3.8 KiB
Plaintext
187 lines
3.8 KiB
Plaintext
unit kern_budget;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
vm,
|
|
sys_vm_object;
|
|
|
|
type
|
|
p_budget_resource=^t_budget_resource;
|
|
t_budget_resource=packed record
|
|
resid:Integer;
|
|
attr :Integer;
|
|
limit:QWORD; //cpuset
|
|
used :QWORD;
|
|
end;
|
|
|
|
//budget resid
|
|
const
|
|
SCE_KERNEL_BUDGET_INVALID =0;
|
|
SCE_KERNEL_BUDGET_MEMORY_DMEM =1;
|
|
SCE_KERNEL_BUDGET_MEMORY_VMEM =2;
|
|
SCE_KERNEL_BUDGET_MEMORY_MLOCK=3;
|
|
SCE_KERNEL_BUDGET_CPU_SET =4;
|
|
SCE_KERNEL_BUDGET_FD_FILE =5;
|
|
SCE_KERNEL_BUDGET_FD_SOCKET =6;
|
|
SCE_KERNEL_BUDGET_FD_EQUEUE =7;
|
|
SCE_KERNEL_BUDGET_FD_PIPE =8;
|
|
SCE_KERNEL_BUDGET_FD_DEVICE =9;
|
|
SCE_KERNEL_BUDGET_THREADS =10;
|
|
SCE_KERNEL_BUDGET_FD_IPCSOCKET=11;
|
|
|
|
//budget proc_type
|
|
PTYPE_BIG_APP = 0;
|
|
PTYPE_MINI_APP = 1;
|
|
PTYPE_SYSTEM = 2;
|
|
PTYPE_NONGAME_MINI_APP = 3;
|
|
|
|
procedure budget_reserve(obj :vm_object_t;
|
|
len :vm_ooffset_t);
|
|
|
|
procedure budget_release(obj :vm_object_t;
|
|
len :vm_ooffset_t);
|
|
|
|
function get_mlock_avail():QWORD;
|
|
function get_mlock_total():QWORD;
|
|
|
|
function sys_budget_create(name:pchar;ptype:DWORD;new:Pointer;count:DWORD;prev:Pointer):Integer;
|
|
function sys_budget_delete(key:Integer):Integer;
|
|
function sys_budget_get(key:Integer;ptr:Pointer;psize:PInteger):Integer;
|
|
function sys_budget_set(key:Integer):Integer;
|
|
function sys_budget_get_ptype(pid:Integer):Integer;
|
|
function sys_budget_get_ptype_of_budget(key:Integer):Integer;
|
|
function sys_budget_getid():Integer;
|
|
|
|
implementation
|
|
|
|
uses
|
|
errno,
|
|
kern_thr,
|
|
kern_proc;
|
|
|
|
var
|
|
budget_total :QWORD=(448*1024*1024);
|
|
budget_malloc:QWORD=0;
|
|
|
|
procedure budget_reserve(obj :vm_object_t;
|
|
len :vm_ooffset_t);
|
|
label
|
|
_inc_malloc;
|
|
begin
|
|
if (obj=nil) then
|
|
begin
|
|
_inc_malloc:
|
|
System.InterlockedExchangeAdd64(budget_malloc,len);
|
|
end else
|
|
if (obj^.otype in [OBJT_DEFAULT,OBJT_SWAP,OBJT_VNODE,OBJT_SELF]) and
|
|
((obj^.flags and OBJ_DMEM_EXT2)=0) then
|
|
begin
|
|
goto _inc_malloc;
|
|
end;
|
|
end;
|
|
|
|
procedure budget_release(obj :vm_object_t;
|
|
len :vm_ooffset_t);
|
|
label
|
|
_dec_malloc;
|
|
begin
|
|
if (obj=nil) then
|
|
begin
|
|
_dec_malloc:
|
|
System.InterlockedExchangeAdd64(budget_malloc,-len);
|
|
end else
|
|
if (obj^.otype in [OBJT_DEFAULT,OBJT_SWAP,OBJT_VNODE,OBJT_SELF]) and
|
|
((obj^.flags and OBJ_DMEM_EXT2)=0) then
|
|
begin
|
|
goto _dec_malloc;
|
|
end;
|
|
end;
|
|
|
|
function get_mlock_avail():QWORD;
|
|
var
|
|
m:QWORD;
|
|
begin
|
|
Result:=0;
|
|
m:=budget_malloc;
|
|
if (budget_total>m) then
|
|
begin
|
|
Result:=budget_total-m;
|
|
end;
|
|
end;
|
|
|
|
function get_mlock_total():QWORD;
|
|
begin
|
|
Result:=budget_total;
|
|
end;
|
|
|
|
function sys_budget_create(name:pchar;ptype:DWORD;new:Pointer;count:DWORD;prev:Pointer):Integer;
|
|
begin
|
|
//name != null
|
|
//ptype -> [0..3] (proc_type)
|
|
//new -> p_budget_resource
|
|
//count -> [0..11] (new/prev)
|
|
//prev -> p_budget_resource
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
function sys_budget_delete(key:Integer):Integer;
|
|
begin
|
|
//key -> id_table
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
function sys_budget_get(key:Integer;ptr:Pointer;psize:PInteger):Integer;
|
|
begin
|
|
//key -> [-2..-5] (budget limits [0..3]) else -> id_table
|
|
//ptr -> p_budget_resource
|
|
//psize -> in/out size
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
function sys_budget_set(key:Integer):Integer;
|
|
begin
|
|
//key -> id_table
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
function sys_budget_get_ptype(pid:Integer):Integer;
|
|
var
|
|
td:p_kthread;
|
|
begin
|
|
//sceKernelGetProcessType
|
|
|
|
td:=curkthread;
|
|
if (td=nil) then Exit(-1);
|
|
|
|
if (pid<>-1) and
|
|
(pid<>p_proc.p_pid) then
|
|
begin
|
|
Exit(ENOSYS);
|
|
end;
|
|
|
|
td^.td_retval[0]:=p_proc.p_budget_ptype;
|
|
|
|
Result:=0;
|
|
end;
|
|
|
|
function sys_budget_get_ptype_of_budget(key:Integer):Integer;
|
|
begin
|
|
//key -> id_table
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
function sys_budget_getid():Integer;
|
|
begin
|
|
Exit(ENOSYS); //sceSblACMgrIsSystemUcred
|
|
end;
|
|
|
|
|
|
end.
|
|
|
|
|
|
|