diff --git a/sys/kern/kern_sysctl.pas b/sys/kern/kern_sysctl.pas
index 913f2c48..e38a186b 100644
--- a/sys/kern/kern_sysctl.pas
+++ b/sys/kern/kern_sysctl.pas
@@ -160,10 +160,13 @@ uses
kern_thr,
kern_sx,
time,
+ elf64,
+ subr_dynlib,
kern_authinfo,
md_arc4random,
kern_proc,
- md_proc;
+ md_proc,
+ trap;
var
sysctllock :t_sx;
@@ -393,6 +396,71 @@ begin
Result:=SYSCTL_OUT(req,@p_proc.p_ptc,SizeOf(Int64));
end;
+function _copy_libkernel_addr(req:p_sysctl_req):Integer;
+var
+ addr_out:array[0..1] of Pointer;
+begin
+ addr_out[0]:=p_proc.libkernel_start_addr;
+ addr_out[1]:=p_proc.libkernel___end_addr;
+
+ Result:=SYSCTL_OUT(req,@addr_out,SizeOf(addr_out));
+end;
+
+function sysctl_kern_text_segment(oidp:p_sysctl_oid;arg1:Pointer;arg2:ptrint;req:p_sysctl_req):Integer;
+var
+ addr_out:array[0..1] of Pointer;
+ libc_param:TSceLibcParam;
+ sceLibcHeapDebugFlags:Integer;
+begin
+ Result:=0;
+
+ addr_out[0]:=nil;
+ addr_out[1]:=nil;
+
+ if false then //sceSblACMgrIsShellcoreProces
+ //sceSblACMgrIsSystemUcred && sceRegMgrSrvGetQAFforReg && sceRegMgrGetInt(sys_heap_trace)
+ //sceSblACMgrIsWebcoreProcess && sceKernelIsDevelopmentMode
+ //sceRegMgrSrvGetQAFforReg && sceRegMgrGetInt(game_heap_trace)
+ //sceKernelIsDevelopmentMode && sceKernelIsAssistMode && sceRegMgrGetInt(game_intmem_dbg)
+ begin
+ Exit(_copy_libkernel_addr(req));
+ end;
+
+ Result:=copy_libc_param(@libc_param);
+
+ if (Result=0) then
+ if (libc_param.entry_count>8) then
+ begin
+
+ if (libc_param.SceLibcInternalHeap=1) then
+ begin
+ Result:=copyin(libc_param.sceLibcHeapDebugFlags,@sceLibcHeapDebugFlags,4);
+ if (Result=0) and ((sceLibcHeapDebugFlags and 8)<>0) then
+ begin
+ Exit(_copy_libkernel_addr(req));
+ end else
+ begin
+ Result:=0;
+ end;
+ end;
+
+ if (libc_param.entry_count > 11) and (libc_param.SceLibcInternalHeap=1) then
+ begin
+ Result:=copyin(libc_param.sceKernelInternalMemoryDebugFlags,@sceLibcHeapDebugFlags,4);
+ if (Result=0) and ((sceLibcHeapDebugFlags and 8)<>0) then
+ begin
+ Exit(_copy_libkernel_addr(req));
+ end else
+ begin
+ Result:=0;
+ end;
+ end;
+
+ end;
+
+ SYSCTL_OUT(req,@addr_out,SizeOf(addr_out));
+end;
+
function sysctl_handle_int(oidp:p_sysctl_oid;arg1:Pointer;arg2:ptrint;req:p_sysctl_req):Integer;
var
tmpout:Integer;
@@ -488,6 +556,7 @@ begin
end;
else
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled name2oid:',name);
Assert(False);
Result:=ENOENT;
@@ -523,11 +592,13 @@ begin
Result:=ENOENT;
case name[0] of
- KERN_PROC_APPINFO :Result:=SYSCTL_HANDLE(noid,name,$C0040001,@sysctl_kern_proc_appinfo);
- KERN_PROC_SANITIZER:Result:=SYSCTL_HANDLE(noid,name,$80040001,@sysctl_kern_proc_sanitizer);
- KERN_PROC_PTC :Result:=SYSCTL_HANDLE(noid,name,$90040009,@sysctl_kern_proc_ptc);
+ KERN_PROC_APPINFO :Result:=SYSCTL_HANDLE(noid,name,$C0040001,@sysctl_kern_proc_appinfo);
+ KERN_PROC_SANITIZER :Result:=SYSCTL_HANDLE(noid,name,$80040001,@sysctl_kern_proc_sanitizer);
+ KERN_PROC_PTC :Result:=SYSCTL_HANDLE(noid,name,$90040009,@sysctl_kern_proc_ptc);
+ KERN_PROC_TEXT_SEGMENT:Result:=SYSCTL_HANDLE(noid,name,$80040001,@sysctl_kern_text_segment);
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_kern_proc:',name[0]);
Assert(False);
end;
@@ -546,6 +617,7 @@ begin
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_kern_smp:',name[0]);
Assert(False);
end;
@@ -562,6 +634,7 @@ begin
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_kern_sched:',name[0]);
Assert(False);
end;
@@ -586,6 +659,7 @@ begin
KERN_SCHED :Result:=sysctl_kern_sched(name+1,namelen-1,noid,req);
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_kern:',name[0]);
Assert(False);
end;
@@ -602,6 +676,7 @@ begin
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_sysctl:',name[0]);
Assert(False);
end;
@@ -618,6 +693,7 @@ begin
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_hw:',name[0]);
Assert(False);
end;
@@ -648,6 +724,7 @@ begin
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_machdep:',name[0]);
Assert(False);
end;
@@ -669,6 +746,7 @@ begin
CTL_MACHDEP:Result:=sysctl_machdep(name+1,namelen-1,noid,req);
else
begin
+ print_backtrace_td(stderr);
Writeln(StdErr,'Unhandled sysctl_root:',name[0]);
Assert(False);
end;
diff --git a/sys/kern/subr_dynlib.pas b/sys/kern/subr_dynlib.pas
index f8b61ce2..1c710f34 100644
--- a/sys/kern/subr_dynlib.pas
+++ b/sys/kern/subr_dynlib.pas
@@ -344,6 +344,9 @@ function find_obj_by_name (name:pchar):p_lib_info;
function dynlib_load_needed_shared_objects():Integer;
+function copy_proc_param(pout:pSceProcParam):Integer;
+function copy_libc_param(pout:pSceLibcParam):Integer;
+
var
dynlibs_info:t_dynlibs_info;
@@ -3182,6 +3185,62 @@ begin
Result:=0;
end;
+//
+
+function copy_proc_param(pout:pSceProcParam):Integer;
+var
+ proc_param_addr:pSceProcParam;
+ proc_param_size:QWORD;
+begin
+ proc_param_addr:=dynlibs_info.proc_param_addr;
+ proc_param_size:=dynlibs_info.proc_param_size;
+
+ if (proc_param_addr=nil) then Exit(ENOENT);
+
+ pout^:=Default(TSceProcParam);
+
+ if (proc_param_size>SizeOf(TSceProcParam)) then
+ begin
+ proc_param_size:=SizeOf(TSceProcParam);
+ end;
+
+ Result:=copyin(proc_param_addr,pout,proc_param_size);
+
+ if (Result=0) then
+ begin
+ if (pout^.Magic<>$4942524f) then Result:=ENOEXEC;
+ end;
+end;
+
+function copy_libc_param(pout:pSceLibcParam):Integer;
+var
+ proc_param:TSceProcParam;
+ libc_param_addr:pSceLibcParam;
+ libc_param_size:QWORD;
+begin
+ Result:=copy_proc_param(@proc_param);
+ if (Result<>0) then Exit;
+
+ if (proc_param.Entry_count=0) or
+ (proc_param.Size <= 63) or
+ (proc_param._sceLibcParam=nil) then
+ begin
+ Exit(ENOEXEC);
+ end;
+
+ libc_param_addr:=proc_param._sceLibcParam;
+
+ Result:=copyin(libc_param_addr,@libc_param_size,8);
+ if (Result<>0) then Exit;
+
+ if (libc_param_size >= 169) then Exit(EINVAL);
+
+ pout^:=Default(TSceLibcParam);
+
+ Result:=copyin(proc_param._sceLibcParam,pout,libc_param_size);
+end;
+
+
end.
diff --git a/sys/test/project1.lpi b/sys/test/project1.lpi
index 761aa9b4..fc9efca1 100644
--- a/sys/test/project1.lpi
+++ b/sys/test/project1.lpi
@@ -787,6 +787,10 @@
+
+
+
+