This commit is contained in:
Pavel 2024-03-11 16:42:17 +03:00
parent d8811b819f
commit 20fc8c0a73
4 changed files with 56 additions and 19 deletions

View File

@ -32,11 +32,21 @@ uses
kern_jit_ops_avx,
kern_jit_dynamic,
kern_jit_test,
kern_jit_asm;
kern_jit_asm,
kern_thr,
subr_backtrace;
procedure jit_assert;
procedure _jit_assert;
begin
Assert(False,'jit_assert');
jit_save_to_sys_save(curkthread);
print_error_td('Assert in guest code!');
Assert(false);
end;
procedure jit_assert; assembler; nostackframe;
asm
call jit_save_ctx
jmp _jit_assert
end;
procedure jit_system_error;

View File

@ -56,6 +56,12 @@ procedure jit_jmp_internal; assembler;
function IS_JIT_FUNC(rip:qword):Boolean;
procedure jit_save_ctx;
procedure jit_load_ctx;
procedure jit_save_to_sys_save(td:p_kthread);
procedure sys_save_to_jit_save(td:p_kthread);
implementation
uses
@ -71,9 +77,6 @@ function jmp_dispatcher(addr,plt:Pointer):Pointer; external;
//
procedure jit_save_ctx; forward;
procedure jit_load_ctx; forward;
procedure jit_sigsegv(addr:Pointer);
begin
print_error_td('jit_sigsegv:0x'+HexStr(addr));

View File

@ -422,7 +422,7 @@ begin
end;
const
vmov_ss_sd_desc:t_op_desc=(
vmov_ss_desc:t_op_desc=(
mem_reg:(op:$11;simdop:2;mm:1);
reg_mem:(op:$10;simdop:2;mm:1);
reg_imm:(opt:[not_impl]);
@ -431,11 +431,18 @@ const
);
procedure op_vmov_ss_sd(var ctx:t_jit_context2);
var
desc:t_op_desc;
begin
if is_preserved(ctx.din) or is_memory(ctx.din) then
begin
case ctx.din.OperCnt of
2:op_emit_avx2(ctx,vmov_ss_sd_desc);
2:begin
desc:=vmov_ss_desc;
desc.mem_reg.simdop:=SCODES[ctx.dis.SimdOpcode];
desc.reg_mem.simdop:=SCODES[ctx.dis.SimdOpcode];
op_emit_avx2(ctx,desc);
end;
3:op_avx3_not_vex_len(ctx);
else
Assert(False);

View File

@ -279,11 +279,13 @@ procedure get_dmem_fd(var info:t_fd_info);
var
o:QWORD;
e:QWORD;
d:QWORD;
i:DWORD;
r:DWORD;
begin
o:=info.offset;
//current block id
i:=o shr PMAPP_1GB_SHIFT;
if (DMEM_FD[i].hfile=0) then
@ -303,12 +305,21 @@ begin
vm_nt_file_obj_reference(info.obj);
e:=o+(info.__end-info.start);
//current block offset
o:=o and PMAPP_1GB_MASK;
//mem size
d:=info.__end-info.start;
//max offset
e:=o+d;
// |start end|
// |offset |max
if (e>PMAPP_1GB_SIZE) then
begin
e:=PMAPP_1GB_SIZE;
e:=(e-o)+info.start;
e:=PMAPP_1GB_SIZE-o;
e:=e+info.start;
info.__end:=e;
end;
end;
@ -506,17 +517,17 @@ begin
info.start:=start;
info.__end:=__end;
info.offset:=0;
while (info.start<>info.__end) do
begin
get_private_fd(info);
delta:=(info.__end-info.start);
if (delta=0) then Break;
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset,
0, //private always from the start
info.start,
info.__end,
delta,
@ -530,7 +541,6 @@ begin
info.start :=info.start+delta;
info.__end :=__end;
info.offset:=0;
end;
end;
@ -547,7 +557,7 @@ begin
begin
if (p_print_pmap<>0) then
begin
Writeln('pmap_enter_gpuobj:',HexStr(start,11),':',HexStr(__end,11),':',HexStr(prot,2));
Writeln('pmap_enter_gpuobj:',HexStr(start,11),':',HexStr(__end,11),':',HexStr(offset,11),':',HexStr(prot,2));
end;
info.start:=start;
@ -559,10 +569,16 @@ begin
get_dmem_fd(info);
delta:=(info.__end-info.start);
if (delta=0) then Break;
if (p_print_pmap<>0) then
begin
Writeln('vm_nt_map_insert:',HexStr(info.start,11),':',HexStr(info.__end,11),':',HexStr(info.offset,11));
end;
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset,
info.offset and PMAPP_1GB_MASK, //block local offset
info.start,
info.__end,
delta,
@ -596,7 +612,7 @@ begin
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset,
info.offset, //one block for all dev
info.start,
info.__end,
delta,
@ -677,6 +693,7 @@ begin
get_private_fd(info);
delta:=(info.__end-info.start);
if (delta=0) then Break;
pmap_copy(pmap,
cow,
@ -687,7 +704,7 @@ begin
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
0,
0, //private always from the start
info.start,
info.__end,
delta,
@ -717,7 +734,7 @@ begin
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset,
info.offset, //offset in file
info.start,
info.__end,
size,