diff --git a/.gitignore b/.gitignore index d1ae2bd2..db2d7138 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,13 @@ *.self *.dump *.h +*.sfo +*.ttf +*.otf +*.rco +*.bsf +*.aac +*.nv12 link.res log.txt lib/ diff --git a/fpPS4.lpi b/fpPS4.lpi index f25eae97..6971ae3d 100644 --- a/fpPS4.lpi +++ b/fpPS4.lpi @@ -874,6 +874,22 @@ + + + + + + + + + + + + + + + + diff --git a/sys/jit/kern_jit.pas b/sys/jit/kern_jit.pas index f19278fc..0df7962f 100644 --- a/sys/jit/kern_jit.pas +++ b/sys/jit/kern_jit.pas @@ -36,17 +36,22 @@ uses kern_thr, subr_backtrace; -procedure _jit_assert; +procedure jit_assert(tf_rip:QWORD); +var + td:p_kthread; begin - jit_save_to_sys_save(curkthread); + td:=curkthread; + jit_save_to_sys_save(td); + td^.td_frame.tf_rip:=tf_rip; print_error_td('Assert in guest code!'); Assert(false); end; -procedure jit_assert; assembler; nostackframe; +procedure _jit_assert; assembler; nostackframe; asm call jit_save_ctx - jmp _jit_assert + mov %r14,%rdi + jmp jit_assert end; procedure jit_system_error; @@ -59,22 +64,31 @@ begin Assert(False,'jit_unknow_int'); end; -procedure _jit_exit_proc; +procedure jit_exit_proc(tf_rip:QWORD); +var + td:p_kthread; begin - jit_save_to_sys_save(curkthread); + td:=curkthread; + jit_save_to_sys_save(td); + td^.td_frame.tf_rip:=tf_rip; print_error_td('TODO:jit_exit_proc'); Assert(False); end; -procedure jit_exit_proc; assembler; nostackframe; +procedure _jit_exit_proc; assembler; nostackframe; asm call jit_save_ctx - jmp _jit_exit_proc + mov %r14,%rdi + jmp jit_exit_proc end; -procedure _jit_cpuid(rax:qword); +procedure _jit_cpuid(tf_rip,rax:qword); +var + td:p_kthread; begin - jit_save_to_sys_save(curkthread); + td:=curkthread; + jit_save_to_sys_save(td); + td^.td_frame.tf_rip:=tf_rip; print_error_td('TODO:jit_cpuid:0x'+HexStr(rax,16)); Assert(False); end; @@ -130,9 +144,10 @@ asm //unknow id popf - mov %rax,%r14 + mov %rax,%r15 call jit_save_ctx mov %r14,%rdi + mov %r15,%rsi jmp _jit_cpuid @@ -876,12 +891,14 @@ begin $41: //assert? begin // - ctx.builder.call_far(@jit_assert); //TODO error dispatcher + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); + ctx.builder.call_far(@_jit_assert); //TODO error dispatcher end; $44: //system error? begin // + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); ctx.builder.call_far(@jit_system_error); //TODO error dispatcher trim_flow(ctx); end; @@ -898,7 +915,8 @@ procedure op_ud2(var ctx:t_jit_context2); begin //exit proc? ctx.builder.int3; - ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); + ctx.builder.call_far(@_jit_exit_proc); //TODO exit dispatcher trim_flow(ctx); end; @@ -906,7 +924,8 @@ procedure op_iretq(var ctx:t_jit_context2); begin //exit proc? ctx.builder.int3; - ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); + ctx.builder.call_far(@_jit_exit_proc); //TODO exit dispatcher trim_flow(ctx); end; @@ -914,12 +933,14 @@ procedure op_hlt(var ctx:t_jit_context2); begin //stop thread? ctx.builder.int3; - ctx.builder.call_far(@jit_exit_proc); //TODO exit dispatcher + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); + ctx.builder.call_far(@_jit_exit_proc); //TODO exit dispatcher end; procedure op_cpuid(var ctx:t_jit_context2); begin - ctx.builder.call_far(@jit_cpuid); //TODO CPUID + op_set_r14_imm(ctx,Int64(ctx.ptr_curr)); + ctx.builder.call_far(@jit_cpuid); end; procedure op_rdtsc(var ctx:t_jit_context2); diff --git a/sys/jit/kern_jit_dynamic.pas b/sys/jit/kern_jit_dynamic.pas index 4a35b1c9..14c3d5a2 100644 --- a/sys/jit/kern_jit_dynamic.pas +++ b/sys/jit/kern_jit_dynamic.pas @@ -363,7 +363,7 @@ begin rw_runlock(entry_chunk_lock); end; -function exist_jit_host(src:Pointer;tf_tip:PQWORD):Boolean; +function exist_jit_host(src:Pointer;tf_tip:PQWORD):Boolean; public; var blob:p_jit_dynamic_blob; begin diff --git a/sys/kern/kern_dlsym.pas b/sys/kern/kern_dlsym.pas index a1797940..f9ebcd90 100644 --- a/sys/kern/kern_dlsym.pas +++ b/sys/kern/kern_dlsym.pas @@ -400,13 +400,11 @@ type lea :array[0..2] of Byte; //48 8D 3D lea -7(%rip),%rdi offset1 :DWORD; //F9 FF FF FF // - push_rbp:Byte; //55 - and_rsp :DWORD; //48 83 E4 F0 - // - inst :Word; //FF 15 call 2(%rip) - offset2 :DWORD; //02 + inst :Word; //FF 25 jmp 4(%rip) + offset2 :DWORD; //04 ret :Byte; //C3 - nop2 :Byte; //90 + nop1 :Byte; //90 + nop2 :Word; //9090 addr :QWORD; nid :QWORD; libname :PChar; @@ -415,20 +413,24 @@ type const c_jmpq64_trampoline:t_jmpq64_trampoline=(lea :($48,$8D,$3D);offset1:$FFFFFFF9; - push_rbp:$55; - and_rsp :($F0E48348); - inst :$15FF;offset2:$02; + inst :$25FF;offset2:$04; ret :$C3; - nop2 :$90; + nop1 :$90; + nop2 :$9090; addr :0; nid :0; - libname :nil); + libname :nil; + libfrom :nil); -procedure _unresolve_symbol(data:p_jmpq64_trampoline); +procedure unresolve_symbol(data:p_jmpq64_trampoline); var + td:p_kthread; str:shortstring; begin - jit_save_to_sys_save(curkthread); + td:=curkthread; + jit_save_to_sys_save(td); + + td^.td_frame.tf_rip:=PQWORD(td^.td_frame.tf_rsp)^; str:=ps4libdoc.GetFunctName(data^.nid); if (str='Unknow') then @@ -440,6 +442,16 @@ begin Assert(false); end; +procedure _unresolve_symbol; assembler; nostackframe; +asm + push %rbp + movq %rsp,%rbp + + andq $-16,%rsp //align stack + + call unresolve_symbol +end; + function get_unresolve_ptr(refobj:p_lib_info;where:Pointer;nid:QWORD;libname:PChar):Pointer; var stub:p_stub_chunk; diff --git a/sys/kern/subr_backtrace.pas b/sys/kern/subr_backtrace.pas index 8cd8d686..ecad10e9 100644 --- a/sys/kern/subr_backtrace.pas +++ b/sys/kern/subr_backtrace.pas @@ -275,14 +275,14 @@ begin offset1:=QWORD(frame)-QWORD(info.base_addr); offset2:=QWORD(frame)-QWORD(info.func_addr); - Writeln(f,' offset $00X',HexStr(offset1,6),' ',info.source,':',info.func,'+$',HexStr(offset2,6)); + Writeln(f,' offset $',HexStr(offset1 shr 48,5),'|',HexStr(offset1,6),' ',info.source,':',info.func,'+$',HexStr(offset2,6)); end else begin if (info.base_addr<>0) then begin offset1:=QWORD(frame)-QWORD(info.base_addr); - Writeln(f,' offset $00X',HexStr(offset1,6),' ',info.source); + Writeln(f,' offset $',HexStr(offset1 shr 48,5),'|',HexStr(offset1,6),' ',info.source); end else begin Writeln(f,' $',HexStr(frame),' ',info.source);