From aa953498c9de8886f95e9dd7db0b1814f08733e3 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Wed, 13 Mar 2024 00:11:54 +0300 Subject: [PATCH] + --- sys/jit/kern_jit.pas | 20 +++++++++++++++++--- sys/kern/kern_dlsym.pas | 5 ++++- sys/kern/subr_backtrace.pas | 7 +++++++ sys/kern/subr_dynlib.pas | 20 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/sys/jit/kern_jit.pas b/sys/jit/kern_jit.pas index ab239cdc..1f18b1e9 100644 --- a/sys/jit/kern_jit.pas +++ b/sys/jit/kern_jit.pas @@ -59,10 +59,17 @@ begin Assert(False,'jit_unknow_int'); end; -procedure jit_exit_proc; +procedure _jit_exit_proc; begin - Writeln('TODO:jit_exit_proc'); - //Assert(False); + jit_save_to_sys_save(curkthread); + print_error_td('TODO:jit_exit_proc'); + Assert(False); +end; + +procedure jit_exit_proc; assembler; nostackframe; +asm + call jit_save_ctx + jmp _jit_exit_proc end; //0x0 @@ -864,6 +871,7 @@ end; procedure op_ud2(var ctx:t_jit_context2); begin //exit proc? + ctx.builder.int3; ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher trim_flow(ctx); end; @@ -871,6 +879,7 @@ end; procedure op_iretq(var ctx:t_jit_context2); begin //exit proc? + ctx.builder.int3; ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher trim_flow(ctx); end; @@ -878,6 +887,7 @@ end; procedure op_hlt(var ctx:t_jit_context2); begin //stop thread? + ctx.builder.int3; ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher end; @@ -1201,6 +1211,7 @@ begin if (p_print_jit_preload<>0) then begin + print_frame(stdout,ctx.ptr_curr); Writeln('original------------------------':32,' ','0x',HexStr(ctx.ptr_curr)); print_disassemble(ctx.code,dis.CodeIdx); Writeln('original------------------------':32,' ','0x',HexStr(ctx.ptr_next)); @@ -1288,6 +1299,8 @@ begin if (cb=nil) then begin + print_error_td('Unhandled jit opcode!'); + Writeln('original------------------------':32,' ','0x',HexStr(ctx.ptr_curr)); print_disassemble(ctx.code,dis.CodeIdx); Writeln('original------------------------':32,' ','0x',HexStr(ctx.ptr_next)); @@ -1302,6 +1315,7 @@ begin 'MIndex=',ctx.dis.ModRM.Index,' ', 'SimdOp=',ctx.dis.SimdOpcode,':',SCODES[ctx.dis.SimdOpcode],' ', 'mm=',ctx.dis.mm,':',MCODES[ctx.dis.mm and 3]); + Assert(false); end; diff --git a/sys/kern/kern_dlsym.pas b/sys/kern/kern_dlsym.pas index 28fcdcc9..a1797940 100644 --- a/sys/kern/kern_dlsym.pas +++ b/sys/kern/kern_dlsym.pas @@ -46,6 +46,7 @@ uses hamt, errno, systm, + kern_rtld, elf_nid_utils, kern_stub, vm_patch_link, @@ -409,6 +410,7 @@ type addr :QWORD; nid :QWORD; libname :PChar; + libfrom :PChar; end; const @@ -434,7 +436,7 @@ begin str:=EncodeValue64(data^.nid); end; - print_error_td('unresolve_symbol:0x'+HexStr(data^.nid,16)+':'+str+':'+data^.libname); + print_error_td('unresolve_symbol:0x'+HexStr(data^.nid,16)+':'+str+':'+data^.libname+' from '+data^.libfrom); Assert(false); end; @@ -448,6 +450,7 @@ begin p_jmpq64_trampoline(@stub^.body)^.addr:=QWORD(@_unresolve_symbol); p_jmpq64_trampoline(@stub^.body)^.nid:=nid; p_jmpq64_trampoline(@stub^.body)^.libname:=libname; + p_jmpq64_trampoline(@stub^.body)^.libfrom:=dynlib_basename(refobj^.lib_path); Result:=@stub^.body; diff --git a/sys/kern/subr_backtrace.pas b/sys/kern/subr_backtrace.pas index 91b42155..918275d5 100644 --- a/sys/kern/subr_backtrace.pas +++ b/sys/kern/subr_backtrace.pas @@ -9,6 +9,8 @@ uses mqueue, kern_thr; +procedure print_frame(var f:text;frame:Pointer); + procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint); procedure print_backtrace_td(var f:text); procedure print_error_td(const str:shortstring); @@ -181,6 +183,11 @@ begin info.source:=Default(t_id_name); md_copyin(@obj^.name,@info.source,SizeOf(t_id_name),nil); + if (info.source='') then + begin + md_copyin(obj^.lib_path,@info.source,SizeOf(t_id_name),nil); + end; + if (find_proc_obj(obj,r)<>0) then begin info.func:=ps4libdoc.GetFunctName(r.LastNid); diff --git a/sys/kern/subr_dynlib.pas b/sys/kern/subr_dynlib.pas index 2eb154fc..a619ffd0 100644 --- a/sys/kern/subr_dynlib.pas +++ b/sys/kern/subr_dynlib.pas @@ -2851,6 +2851,7 @@ begin fname:=ChangeFileExt(fname,'.prx'); if rtld_file_exists(pchar(fname)) then goto _do_load; + /// //try /system/* fname:=pbase; @@ -2869,6 +2870,25 @@ begin fname:=ChangeFileExt(fname,'.prx'); if rtld_file_exists(pchar(fname)) then goto _do_load; + // + + //try /system/common/lib/* + fname:=pbase; + + if (fname[1]<>'/') then + begin + fname:='/'+fname; + end; + fname:='/'+p_proc.p_randomized_path+'/common/lib'+fname; + + if rtld_file_exists(pchar(fname)) then goto _do_load; + + fname:=ChangeFileExt(fname,'.sprx'); + if rtld_file_exists(pchar(fname)) then goto _do_load; + + fname:=ChangeFileExt(fname,'.prx'); + if rtld_file_exists(pchar(fname)) then goto _do_load; + //try internal postload fname:=pbase; fname:=ChangeFileExt(fname,'.prx');