From dde953d61282fe49c4e699d97ff21a215b053784 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 10 Jun 2017 18:20:58 -0400 Subject: [PATCH] fix a libco issue that was breaking xorstate consistency --- BizHawk.Emulation.Cores/Waterbox/PeRunner.cs | 13 +++++++++++++ output64/dll/libco.so | Bin 6158 -> 6670 bytes waterbox/libco/amd64.c | 5 +++++ waterbox/libco/libco.so | Bin 6158 -> 6670 bytes 4 files changed, 18 insertions(+) diff --git a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs index accda78ffa..5fbf1d1362 100644 --- a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs +++ b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs @@ -756,6 +756,19 @@ namespace BizHawk.Emulation.Cores.Waterbox { using (this.EnterExit()) { + // if libco is used, the jmp_buf for the main cothread can have stack stuff in it. + // this isn't a problem, since we only savestate when the core is not running, and + // the next time it's run, that buf will be overridden again. + // but it breaks xor state verification, so when we seal, nuke it. + + // this could be the responsibility of something else other than the PeRunner; I am not sure yet... + IImportResolver libco; + if (_exports.TryGetValue("libco.so", out libco)) + { + Console.WriteLine("Calling co_clean()..."); + Marshal.GetDelegateForFunctionPointer(libco.SafeResolve("co_clean"))(); + } + _sealedheap.Seal(); foreach (var h in _heaps) { diff --git a/output64/dll/libco.so b/output64/dll/libco.so index 8be4a5459f8c49cb7d9b51eb6bb1e11c59995603..1a4cad5b7146d2bf62184c92fc5c37c3f0369789 100644 GIT binary patch delta 796 zcmYk4OK1~87{_NOyD_e5x>=eu(MqB;G@&IXQi>KUY4I?Hs)eEj4>s`;5H(f^;;n&L zFowi!rWZX3J}%LiOY|^>GP!Q^AzpyZ*;)!4H1>|K797Y&}&UHy;M~5!gZb zAf!u@M-MO-Cd%5gN!I?p_U$-b7kzY)auK69wJ1ZA4ixc}j#7{KNJm6~`Nb~Pk{RTQ ze8?s*_|GyVl{q%vOT3dZFD|o?ILEXJF2gL?+bv_qU1KDSYI-7B? z%akd0Sy=pGK^hcp*9Z;0OuFbw2o-L3^7&+ci@X;2a)*#~b0dS0SGIQeo26EM zugMv;pu6aO6VP5zhi` z`1FZId@2gAEDK!$Uic+w2k7vn{scqtyHJmxkmxeT-_wS!s+8iwEv7Se_L4~mBBDCP z5uXC{KyJ@~5|A6^rmH3)x4}J70*`>)z=#Xq?s+4m+`67CSXYcHeLLV`On)x4V4R+? L(!tNP5%T>7>&CBY delta 718 zcmYk3&ubGw6vt;K*$`K=-K*D^Bfa#;MJ%p+tMTI@f$g{~qVAJnBHxu3t zjC~x`S-s!S541bbEvR=g^nrJ@iBWnS8yxBSev(`e69Cs?rd-m-N2|yjtp0l;npmYB z=$Y^-^Ny~cUO+oo!NWkiAdH;!J%}OSf_?{P1tXihV<=w4@Oj$~&*xmmI1GaWGN`A4 z1G4&mOR~6%UJ={^_W?}`7GO7*7mH= #include +#include #ifdef __cplusplus extern "C" { @@ -23,6 +24,10 @@ static void crash() { assert(0); /* called only if cothread_t entrypoint returns */ } +void co_clean() { + memset(co_active_buffer, 0, sizeof(co_active_buffer)); +} + cothread_t co_active() { if(!co_active_handle) co_active_handle = &co_active_buffer; return co_active_handle; diff --git a/waterbox/libco/libco.so b/waterbox/libco/libco.so index 8be4a5459f8c49cb7d9b51eb6bb1e11c59995603..1a4cad5b7146d2bf62184c92fc5c37c3f0369789 100644 GIT binary patch delta 796 zcmYk4OK1~87{_NOyD_e5x>=eu(MqB;G@&IXQi>KUY4I?Hs)eEj4>s`;5H(f^;;n&L zFowi!rWZX3J}%LiOY|^>GP!Q^AzpyZ*;)!4H1>|K797Y&}&UHy;M~5!gZb zAf!u@M-MO-Cd%5gN!I?p_U$-b7kzY)auK69wJ1ZA4ixc}j#7{KNJm6~`Nb~Pk{RTQ ze8?s*_|GyVl{q%vOT3dZFD|o?ILEXJF2gL?+bv_qU1KDSYI-7B? z%akd0Sy=pGK^hcp*9Z;0OuFbw2o-L3^7&+ci@X;2a)*#~b0dS0SGIQeo26EM zugMv;pu6aO6VP5zhi` z`1FZId@2gAEDK!$Uic+w2k7vn{scqtyHJmxkmxeT-_wS!s+8iwEv7Se_L4~mBBDCP z5uXC{KyJ@~5|A6^rmH3)x4}J70*`>)z=#Xq?s+4m+`67CSXYcHeLLV`On)x4V4R+? L(!tNP5%T>7>&CBY delta 718 zcmYk3&ubGw6vt;K*$`K=-K*D^Bfa#;MJ%p+tMTI@f$g{~qVAJnBHxu3t zjC~x`S-s!S541bbEvR=g^nrJ@iBWnS8yxBSev(`e69Cs?rd-m-N2|yjtp0l;npmYB z=$Y^-^Ny~cUO+oo!NWkiAdH;!J%}OSf_?{P1tXihV<=w4@Oj$~&*xmmI1GaWGN`A4 z1G4&mOR~6%UJ={^_W?}`7GO7*7mH=