mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
6ebcf51c08
commit
3247af112b
|
@ -19,6 +19,13 @@
|
||||||
*.self
|
*.self
|
||||||
*.dump
|
*.dump
|
||||||
*.h
|
*.h
|
||||||
|
*.sfo
|
||||||
|
*.ttf
|
||||||
|
*.otf
|
||||||
|
*.rco
|
||||||
|
*.bsf
|
||||||
|
*.aac
|
||||||
|
*.nv12
|
||||||
link.res
|
link.res
|
||||||
log.txt
|
log.txt
|
||||||
lib/
|
lib/
|
||||||
|
|
16
fpPS4.lpi
16
fpPS4.lpi
|
@ -874,6 +874,22 @@
|
||||||
<Filename Value="sys\dev\dev_hid.pas"/>
|
<Filename Value="sys\dev\dev_hid.pas"/>
|
||||||
<IsPartOfProject Value="True"/>
|
<IsPartOfProject Value="True"/>
|
||||||
</Unit>
|
</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>
|
</Units>
|
||||||
</ProjectOptions>
|
</ProjectOptions>
|
||||||
<CompilerOptions>
|
<CompilerOptions>
|
||||||
|
|
|
@ -36,17 +36,22 @@ uses
|
||||||
kern_thr,
|
kern_thr,
|
||||||
subr_backtrace;
|
subr_backtrace;
|
||||||
|
|
||||||
procedure _jit_assert;
|
procedure jit_assert(tf_rip:QWORD);
|
||||||
|
var
|
||||||
|
td:p_kthread;
|
||||||
begin
|
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!');
|
print_error_td('Assert in guest code!');
|
||||||
Assert(false);
|
Assert(false);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure jit_assert; assembler; nostackframe;
|
procedure _jit_assert; assembler; nostackframe;
|
||||||
asm
|
asm
|
||||||
call jit_save_ctx
|
call jit_save_ctx
|
||||||
jmp _jit_assert
|
mov %r14,%rdi
|
||||||
|
jmp jit_assert
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure jit_system_error;
|
procedure jit_system_error;
|
||||||
|
@ -59,22 +64,31 @@ begin
|
||||||
Assert(False,'jit_unknow_int');
|
Assert(False,'jit_unknow_int');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _jit_exit_proc;
|
procedure jit_exit_proc(tf_rip:QWORD);
|
||||||
|
var
|
||||||
|
td:p_kthread;
|
||||||
begin
|
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');
|
print_error_td('TODO:jit_exit_proc');
|
||||||
Assert(False);
|
Assert(False);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure jit_exit_proc; assembler; nostackframe;
|
procedure _jit_exit_proc; assembler; nostackframe;
|
||||||
asm
|
asm
|
||||||
call jit_save_ctx
|
call jit_save_ctx
|
||||||
jmp _jit_exit_proc
|
mov %r14,%rdi
|
||||||
|
jmp jit_exit_proc
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _jit_cpuid(rax:qword);
|
procedure _jit_cpuid(tf_rip,rax:qword);
|
||||||
|
var
|
||||||
|
td:p_kthread;
|
||||||
begin
|
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));
|
print_error_td('TODO:jit_cpuid:0x'+HexStr(rax,16));
|
||||||
Assert(False);
|
Assert(False);
|
||||||
end;
|
end;
|
||||||
|
@ -130,9 +144,10 @@ asm
|
||||||
|
|
||||||
//unknow id
|
//unknow id
|
||||||
popf
|
popf
|
||||||
mov %rax,%r14
|
mov %rax,%r15
|
||||||
call jit_save_ctx
|
call jit_save_ctx
|
||||||
mov %r14,%rdi
|
mov %r14,%rdi
|
||||||
|
mov %r15,%rsi
|
||||||
jmp _jit_cpuid
|
jmp _jit_cpuid
|
||||||
|
|
||||||
|
|
||||||
|
@ -876,12 +891,14 @@ begin
|
||||||
$41: //assert?
|
$41: //assert?
|
||||||
begin
|
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;
|
end;
|
||||||
|
|
||||||
$44: //system error?
|
$44: //system error?
|
||||||
begin
|
begin
|
||||||
//
|
//
|
||||||
|
op_set_r14_imm(ctx,Int64(ctx.ptr_curr));
|
||||||
ctx.builder.call_far(@jit_system_error); //TODO error dispatcher
|
ctx.builder.call_far(@jit_system_error); //TODO error dispatcher
|
||||||
trim_flow(ctx);
|
trim_flow(ctx);
|
||||||
end;
|
end;
|
||||||
|
@ -898,7 +915,8 @@ procedure op_ud2(var ctx:t_jit_context2);
|
||||||
begin
|
begin
|
||||||
//exit proc?
|
//exit proc?
|
||||||
ctx.builder.int3;
|
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);
|
trim_flow(ctx);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -906,7 +924,8 @@ procedure op_iretq(var ctx:t_jit_context2);
|
||||||
begin
|
begin
|
||||||
//exit proc?
|
//exit proc?
|
||||||
ctx.builder.int3;
|
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);
|
trim_flow(ctx);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -914,12 +933,14 @@ procedure op_hlt(var ctx:t_jit_context2);
|
||||||
begin
|
begin
|
||||||
//stop thread?
|
//stop thread?
|
||||||
ctx.builder.int3;
|
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;
|
end;
|
||||||
|
|
||||||
procedure op_cpuid(var ctx:t_jit_context2);
|
procedure op_cpuid(var ctx:t_jit_context2);
|
||||||
begin
|
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;
|
end;
|
||||||
|
|
||||||
procedure op_rdtsc(var ctx:t_jit_context2);
|
procedure op_rdtsc(var ctx:t_jit_context2);
|
||||||
|
|
|
@ -363,7 +363,7 @@ begin
|
||||||
rw_runlock(entry_chunk_lock);
|
rw_runlock(entry_chunk_lock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function exist_jit_host(src:Pointer;tf_tip:PQWORD):Boolean;
|
function exist_jit_host(src:Pointer;tf_tip:PQWORD):Boolean; public;
|
||||||
var
|
var
|
||||||
blob:p_jit_dynamic_blob;
|
blob:p_jit_dynamic_blob;
|
||||||
begin
|
begin
|
||||||
|
|
|
@ -400,13 +400,11 @@ type
|
||||||
lea :array[0..2] of Byte; //48 8D 3D lea -7(%rip),%rdi
|
lea :array[0..2] of Byte; //48 8D 3D lea -7(%rip),%rdi
|
||||||
offset1 :DWORD; //F9 FF FF FF
|
offset1 :DWORD; //F9 FF FF FF
|
||||||
//
|
//
|
||||||
push_rbp:Byte; //55
|
inst :Word; //FF 25 jmp 4(%rip)
|
||||||
and_rsp :DWORD; //48 83 E4 F0
|
offset2 :DWORD; //04
|
||||||
//
|
|
||||||
inst :Word; //FF 15 call 2(%rip)
|
|
||||||
offset2 :DWORD; //02
|
|
||||||
ret :Byte; //C3
|
ret :Byte; //C3
|
||||||
nop2 :Byte; //90
|
nop1 :Byte; //90
|
||||||
|
nop2 :Word; //9090
|
||||||
addr :QWORD;
|
addr :QWORD;
|
||||||
nid :QWORD;
|
nid :QWORD;
|
||||||
libname :PChar;
|
libname :PChar;
|
||||||
|
@ -415,20 +413,24 @@ type
|
||||||
|
|
||||||
const
|
const
|
||||||
c_jmpq64_trampoline:t_jmpq64_trampoline=(lea :($48,$8D,$3D);offset1:$FFFFFFF9;
|
c_jmpq64_trampoline:t_jmpq64_trampoline=(lea :($48,$8D,$3D);offset1:$FFFFFFF9;
|
||||||
push_rbp:$55;
|
inst :$25FF;offset2:$04;
|
||||||
and_rsp :($F0E48348);
|
|
||||||
inst :$15FF;offset2:$02;
|
|
||||||
ret :$C3;
|
ret :$C3;
|
||||||
nop2 :$90;
|
nop1 :$90;
|
||||||
|
nop2 :$9090;
|
||||||
addr :0;
|
addr :0;
|
||||||
nid :0;
|
nid :0;
|
||||||
libname :nil);
|
libname :nil;
|
||||||
|
libfrom :nil);
|
||||||
|
|
||||||
procedure _unresolve_symbol(data:p_jmpq64_trampoline);
|
procedure unresolve_symbol(data:p_jmpq64_trampoline);
|
||||||
var
|
var
|
||||||
|
td:p_kthread;
|
||||||
str:shortstring;
|
str:shortstring;
|
||||||
begin
|
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);
|
str:=ps4libdoc.GetFunctName(data^.nid);
|
||||||
if (str='Unknow') then
|
if (str='Unknow') then
|
||||||
|
@ -440,6 +442,16 @@ begin
|
||||||
Assert(false);
|
Assert(false);
|
||||||
end;
|
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;
|
function get_unresolve_ptr(refobj:p_lib_info;where:Pointer;nid:QWORD;libname:PChar):Pointer;
|
||||||
var
|
var
|
||||||
stub:p_stub_chunk;
|
stub:p_stub_chunk;
|
||||||
|
|
|
@ -275,14 +275,14 @@ begin
|
||||||
offset1:=QWORD(frame)-QWORD(info.base_addr);
|
offset1:=QWORD(frame)-QWORD(info.base_addr);
|
||||||
offset2:=QWORD(frame)-QWORD(info.func_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
|
end else
|
||||||
begin
|
begin
|
||||||
if (info.base_addr<>0) then
|
if (info.base_addr<>0) then
|
||||||
begin
|
begin
|
||||||
offset1:=QWORD(frame)-QWORD(info.base_addr);
|
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
|
end else
|
||||||
begin
|
begin
|
||||||
Writeln(f,' $',HexStr(frame),' ',info.source);
|
Writeln(f,' $',HexStr(frame),' ',info.source);
|
||||||
|
|
Loading…
Reference in New Issue