Skip to content

Commit 0cf2f70

Browse files
committed
Fix two jit bugs
1 parent 0fff979 commit 0cf2f70

File tree

1 file changed

+15
-36
lines changed

1 file changed

+15
-36
lines changed

metamod/src/callback_jit.cpp

+15-36
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ void CForwardCallbackJIT::naked_main()
111111
}
112112

113113
// setup meta globals
114+
mov(dword_ptr[globals + mg_mres], MRES_UNSET);
114115
mov(dword_ptr[globals + mg_status], MRES_UNSET);
115116
mov(dword_ptr[globals + mg_esp_save], esp);
116117

@@ -140,21 +141,10 @@ void CForwardCallbackJIT::naked_main()
140141
jecxz(go_next_plugin);
141142
jnz(go_next_plugin);
142143

143-
if (plug == m_jitdata->plugins->front()) { // init meta globals
144-
xor_(eax, eax);
145-
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
146-
mov(dword_ptr[globals + mg_prev_mres], eax); // MRES_UNSET
147-
mov(dword_ptr[globals + mg_status], eax); // NULL
148-
149-
// FIXME: in some cases causes a crash
150-
//mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
151-
//mov(dword_ptr[globals + mg_prev_mres], MRES_UNSET);
152-
}
153-
else {
154-
mov(eax, dword_ptr[globals + mg_mres]);
155-
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
156-
mov(dword_ptr[globals + mg_prev_mres], eax);
157-
}
144+
// update meta globals
145+
mov(eax, dword_ptr[globals + mg_mres]);
146+
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
147+
mov(dword_ptr[globals + mg_prev_mres], eax);
158148

159149
call_func(ecx);
160150

@@ -241,21 +231,10 @@ void CForwardCallbackJIT::naked_main()
241231
jecxz(go_next_plugin);
242232
jnz(go_next_plugin);
243233

244-
if (plug == m_jitdata->plugins->front()) { // init meta globals
245-
xor_(eax, eax);
246-
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
247-
mov(dword_ptr[globals + mg_prev_mres], eax); // MRES_UNSET
248-
mov(dword_ptr[globals + mg_status], eax); // NULL
249-
250-
// FIXME: in some cases causes a crash
251-
//mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
252-
//mov(dword_ptr[globals + mg_prev_mres], MRES_UNSET);
253-
}
254-
else {
255-
mov(eax, dword_ptr[globals + mg_mres]);
256-
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
257-
mov(dword_ptr[globals + mg_prev_mres], eax);
258-
}
234+
// update meta globals
235+
mov(eax, dword_ptr[globals + mg_mres]);
236+
mov(dword_ptr[globals + mg_mres], MRES_IGNORED);
237+
mov(dword_ptr[globals + mg_prev_mres], eax);
259238

260239
call_func(ecx);
261240

@@ -289,12 +268,6 @@ void CForwardCallbackJIT::naked_main()
289268
call_func(ecx);
290269
}
291270

292-
// restore meta globals
293-
movaps(xmm0, xmmword_ptr[esp + mg_backup + sizeof(int) * 2]);
294-
movq(xmm1, qword_ptr[esp + mg_backup]);
295-
movaps(xmmword_ptr[globals], xmm0);
296-
movq(qword_ptr[globals + xmmreg_size], xmm1);
297-
298271
// setup return value and override it if needed
299272
if (m_jitdata->rettype == rt_integer) {
300273
mov(eax, dword_ptr[esp + orig_ret]);
@@ -308,6 +281,12 @@ void CForwardCallbackJIT::naked_main()
308281
fld(dword_ptr[eax]);
309282
}
310283

284+
// restore meta globals
285+
movaps(xmm0, xmmword_ptr[esp + mg_backup + sizeof(int) * 2]);
286+
movq(xmm1, qword_ptr[esp + mg_backup]);
287+
movaps(xmmword_ptr[globals], xmm0);
288+
movq(qword_ptr[globals + xmmreg_size], xmm1);
289+
311290
// epilogue
312291
mov(esp, ebp);
313292
pop(ebp);

0 commit comments

Comments
 (0)