2
0
mirror of https://github.com/rehlds/metamod-r.git synced 2025-04-09 11:00:04 +03:00

Fix two jit bugs

This commit is contained in:
Asmodai 2018-08-24 18:31:48 +03:00
parent 0fff97941f
commit 0cf2f709db

View File

@ -111,6 +111,7 @@ void CForwardCallbackJIT::naked_main()
} }
// setup meta globals // setup meta globals
mov(dword_ptr[globals + mg_mres], MRES_UNSET);
mov(dword_ptr[globals + mg_status], MRES_UNSET); mov(dword_ptr[globals + mg_status], MRES_UNSET);
mov(dword_ptr[globals + mg_esp_save], esp); mov(dword_ptr[globals + mg_esp_save], esp);
@ -140,21 +141,10 @@ void CForwardCallbackJIT::naked_main()
jecxz(go_next_plugin); jecxz(go_next_plugin);
jnz(go_next_plugin); jnz(go_next_plugin);
if (plug == m_jitdata->plugins->front()) { // init meta globals // update meta globals
xor_(eax, eax); mov(eax, dword_ptr[globals + mg_mres]);
mov(dword_ptr[globals + mg_mres], MRES_IGNORED); mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
mov(dword_ptr[globals + mg_prev_mres], eax); // MRES_UNSET mov(dword_ptr[globals + mg_prev_mres], eax);
mov(dword_ptr[globals + mg_status], eax); // NULL
// FIXME: in some cases causes a crash
//mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
//mov(dword_ptr[globals + mg_prev_mres], MRES_UNSET);
}
else {
mov(eax, dword_ptr[globals + mg_mres]);
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
mov(dword_ptr[globals + mg_prev_mres], eax);
}
call_func(ecx); call_func(ecx);
@ -241,21 +231,10 @@ void CForwardCallbackJIT::naked_main()
jecxz(go_next_plugin); jecxz(go_next_plugin);
jnz(go_next_plugin); jnz(go_next_plugin);
if (plug == m_jitdata->plugins->front()) { // init meta globals // update meta globals
xor_(eax, eax); mov(eax, dword_ptr[globals + mg_mres]);
mov(dword_ptr[globals + mg_mres], MRES_IGNORED); mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
mov(dword_ptr[globals + mg_prev_mres], eax); // MRES_UNSET mov(dword_ptr[globals + mg_prev_mres], eax);
mov(dword_ptr[globals + mg_status], eax); // NULL
// FIXME: in some cases causes a crash
//mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
//mov(dword_ptr[globals + mg_prev_mres], MRES_UNSET);
}
else {
mov(eax, dword_ptr[globals + mg_mres]);
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
mov(dword_ptr[globals + mg_prev_mres], eax);
}
call_func(ecx); call_func(ecx);
@ -289,12 +268,6 @@ void CForwardCallbackJIT::naked_main()
call_func(ecx); call_func(ecx);
} }
// restore meta globals
movaps(xmm0, xmmword_ptr[esp + mg_backup + sizeof(int) * 2]);
movq(xmm1, qword_ptr[esp + mg_backup]);
movaps(xmmword_ptr[globals], xmm0);
movq(qword_ptr[globals + xmmreg_size], xmm1);
// setup return value and override it if needed // setup return value and override it if needed
if (m_jitdata->rettype == rt_integer) { if (m_jitdata->rettype == rt_integer) {
mov(eax, dword_ptr[esp + orig_ret]); mov(eax, dword_ptr[esp + orig_ret]);
@ -308,6 +281,12 @@ void CForwardCallbackJIT::naked_main()
fld(dword_ptr[eax]); fld(dword_ptr[eax]);
} }
// restore meta globals
movaps(xmm0, xmmword_ptr[esp + mg_backup + sizeof(int) * 2]);
movq(xmm1, qword_ptr[esp + mg_backup]);
movaps(xmmword_ptr[globals], xmm0);
movq(qword_ptr[globals + xmmreg_size], xmm1);
// epilogue // epilogue
mov(esp, ebp); mov(esp, ebp);
pop(ebp); pop(ebp);