Following Marcus Meissner's advice how to build a WoW64 setup (thanks!),
I have succeeded in building a set of co-installable i386/amd64 Debian
packages. Those won't make it into the "wheezy" release as I was just a
bit late for the freeze, but I have uploaded packages to experimental.
What didn't work was building the 64-bits of wine on
Debian/kfreebsd-amd64 (Debian userland including GNU libc on a FreeBSD
kernel):
<https://buildd.debian.org/status/fetch.php%3Fpkg%3Dwine%26arch%3Dkfreebsd-amd64%26ver%3D1.4.1-1.2%26stamp%3D1341358832>
Apparently the reason is that the uc_mcontext structure does not store
the DS, ES, FS, and GS registers. After I made the changes below,
everything compiled, but how useful is the result? Are those registers
contained in uc_mcontext on "plain" FreeBSD?
Cheers,
-Hilko
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 7d2b8d5..8190f03 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -183,10 +183,12 @@ extern int arch_prctl(int func, void *ptr);
#define R15_sig(context) ((context)->uc_mcontext.mc_r15)
#define CS_sig(context) ((context)->uc_mcontext.mc_cs)
+#if 0
#define DS_sig(context) ((context)->uc_mcontext.mc_ds)
#define ES_sig(context) ((context)->uc_mcontext.mc_es)
#define FS_sig(context) ((context)->uc_mcontext.mc_fs)
#define GS_sig(context) ((context)->uc_mcontext.mc_gs)
+#endif
#define SS_sig(context) ((context)->uc_mcontext.mc_ss)
#define EFL_sig(context) ((context)->uc_mcontext.mc_rflags)
@@ -1415,8 +1417,16 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
context->R15 = R15_sig(sigcontext);
context->Rip = RIP_sig(sigcontext);
context->SegCs = CS_sig(sigcontext);
+#ifdef FS_sig
context->SegFs = FS_sig(sigcontext);
+#else
+ __asm__("movw %%fs,%0" : "=m" (context->SegFs));
+#endif
+#ifdef GS_sig
context->SegGs = GS_sig(sigcontext);
+#else
+ __asm__("movw %%gs,%0" : "=m" (context->SegGs));
+#endif
context->EFlags = EFL_sig(sigcontext);
#ifdef DS_sig
context->SegDs = DS_sig(sigcontext);
@@ -1467,8 +1477,12 @@ static void restore_context( const CONTEXT *context, ucontext_t *sigcontext )
R15_sig(sigcontext) = context->R15;
RIP_sig(sigcontext) = context->Rip;
CS_sig(sigcontext) = context->SegCs;
+#ifdef FS_sig
FS_sig(sigcontext) = context->SegFs;
+#endif
+#ifdef GS_sig
GS_sig(sigcontext) = context->SegGs;
+#endif
EFL_sig(sigcontext) = context->EFlags;
#ifdef DS_sig
DS_sig(sigcontext) = context->SegDs;