diff --git a/sys/jit/kern_jit.pas b/sys/jit/kern_jit.pas index d0a4533d..2f469572 100644 --- a/sys/jit/kern_jit.pas +++ b/sys/jit/kern_jit.pas @@ -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; diff --git a/sys/jit/kern_jit_asm.pas b/sys/jit/kern_jit_asm.pas index 748ee8f8..cb58faf2 100644 --- a/sys/jit/kern_jit_asm.pas +++ b/sys/jit/kern_jit_asm.pas @@ -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)); diff --git a/sys/jit/kern_jit_ops_avx.pas b/sys/jit/kern_jit_ops_avx.pas index 3b3fa035..855d6245 100644 --- a/sys/jit/kern_jit_ops_avx.pas +++ b/sys/jit/kern_jit_ops_avx.pas @@ -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); diff --git a/sys/md/vm_pmap.pas b/sys/md/vm_pmap.pas index 693a5ad9..98aeacc2 100644 --- a/sys/md/vm_pmap.pas +++ b/sys/md/vm_pmap.pas @@ -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,