mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
6ebcf51c08
commit
3247af112b
|
@ -19,6 +19,13 @@
|
|||
*.self
|
||||
*.dump
|
||||
*.h
|
||||
*.sfo
|
||||
*.ttf
|
||||
*.otf
|
||||
*.rco
|
||||
*.bsf
|
||||
*.aac
|
||||
*.nv12
|
||||
link.res
|
||||
log.txt
|
||||
lib/
|
||||
|
|
16
fpPS4.lpi
16
fpPS4.lpi
|
@ -874,6 +874,22 @@
|
|||
<Filename Value="sys\dev\dev_hid.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="rtl\hamt.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="rtl\x86_jit.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="rtl\x86_fpdbgdisas.pp"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="rtl\g23tree.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue