Waterbox savestate changes - genesis should be mostly working now (?)

This commit is contained in:
nattthebear 2017-05-20 20:56:44 -04:00
parent b1ff4fbff8
commit 10cfab4710
1 changed files with 46 additions and 23 deletions

View File

@ -269,7 +269,7 @@ namespace BizHawk.Emulation.Cores.Waterbox
}
}
private class EndOfMainException : Exception
private class EndOfMainException : Exception
{
}
@ -302,10 +302,9 @@ namespace BizHawk.Emulation.Cores.Waterbox
public IntPtr DoGlobalDtors;
}
private IntPtr CreateVtable(string moduleName, ICollection<string> entries)
private void PopulateVtable(string moduleName, ICollection<string> entries, IntPtr table)
{
var imports = _parent._exports[moduleName];
var ret = Z.US(_parent._sealedheap.Allocate((ulong)(entries.Count * IntPtr.Size), 16));
var pointers = entries.Select(e =>
{
var ptr = imports.Resolve(e);
@ -318,8 +317,34 @@ namespace BizHawk.Emulation.Cores.Waterbox
}
return ptr;
}).ToArray();
Marshal.Copy(pointers, 0, ret, pointers.Length);
return ret;
Marshal.Copy(pointers, 0, table, pointers.Length);
}
/// <summary>
/// called by the PeRunner to reset pointers after a loadsave
/// </summary>
public void ReloadVtables()
{
_traps.Clear();
PopulateVtable("__syscalls", Enumerable.Range(0, 340).Select(i => "n" + i).ToList(), _syscallVtable);
PopulateVtable("__syscalls", new[] // ldso
{
"dladdr", "dlinfo", "dlsym", "dlopen", "dlclose", "dlerror", "reset_tls"
}, _ldsoVtable);
PopulateVtable("__syscalls", new[] // psx
{
"start_main", "convert_thread", "unmapself", "log_output"
}, _psxVtable);
}
private IntPtr _syscallVtable;
private IntPtr _ldsoVtable;
private IntPtr _psxVtable;
private IntPtr AllocVtable(int count)
{
return Z.US(_parent._invisibleheap.Allocate((ulong)(count * IntPtr.Size), 16));
}
[BizExport(CallingConvention.Cdecl, EntryPoint = "__psx_init")]
@ -335,27 +360,24 @@ namespace BizHawk.Emulation.Cores.Waterbox
Marshal.WriteInt64(Z.US(argArea + 24), 0x7261626f6f66);
}
context.SyscallVtable = CreateVtable("__syscalls", Enumerable.Range(0, 340).Select(i => "n" + i).ToList());
context.LdsoVtable = CreateVtable("__syscalls", new[] // ldso
{
"dladdr", "dlinfo", "dlsym", "dlopen", "dlclose", "dlerror", "reset_tls"
});
context.PsxVtable = CreateVtable("__syscalls", new[] // psx
{
"start_main", "convert_thread", "unmapself", "log_output"
});
var extraTable = CreateVtable("__syscalls", new[]
context.SyscallVtable = _syscallVtable = AllocVtable(340);
context.LdsoVtable = _ldsoVtable = AllocVtable(7);
context.PsxVtable = _psxVtable = AllocVtable(4);
ReloadVtables();
// TODO: we can't set these pointers 4 and preserve across session
// until we find out where they get saved to and add a way to reset them
/*var extraTable = CreateVtable("__syscalls", new[]
{
"pthread_surrogate", "pthread_create", "do_global_ctors", "do_global_dtors"
});
{
var tmp = new IntPtr[4];
Marshal.Copy(extraTable, tmp, 0, 4);
context.PthreadSurrogate = tmp[0];
context.PthreadCreate = tmp[1];
context.DoGlobalCtors = tmp[2];
context.DoGlobalDtors = tmp[3];
}
var tmp = new IntPtr[4];
Marshal.Copy(extraTable, tmp, 0, 4);
context.PthreadSurrogate = tmp[0];
context.PthreadCreate = tmp[1];
context.DoGlobalCtors = tmp[2];
context.DoGlobalDtors = tmp[3];*/
return 0; // success
}
@ -655,6 +677,7 @@ namespace BizHawk.Emulation.Cores.Waterbox
// Exvoker imports need to be reconnected
Console.WriteLine("Restoring PeRunner state from a different core...");
ConnectAllImports();
_psx.ReloadVtables();
}
}
}