[pkg-wine-party] Bug#733605: wine-1.6.1: FTBFS on hurd-i386
Source: wine
Version: 1.6.1-8
Severity: important
Tags: patch
User: debian-hurd@lists.debian.org
Usertags: hurd
Hi,
Currently wine-1.6.1 FTBFS on GNU/Hurd, see
https://buildd.debian.org/status/fetch.php?pkg=wine&arch=hurd-i386&ver=1.6.1-8&stamp=1388378306
Attached is a patch enabling the build:
- dlls/mountmgr.sys/diskarb.c and dlls/ntdll/directory.c: Define
PATH_MAX to 4096 since it is not available for GNU/Hurd. A better
solution using dynamic string allocation will be provided in a separate
patch.
- libs/wine/ldt.c: Add LDT support for GNU/Hurd
- dlls/ntdll/signal_i386.c: Add i386 signal handling support for GNU/Hurd
Applications tested (but slow to start) include clock, notepad and wordpad.
Thanks!
--- a/dlls/mountmgr.sys/diskarb.c
+++ b/dlls/mountmgr.sys/diskarb.c
@@ -37,6 +37,9 @@
#ifdef HAVE_DISKARBITRATION_DISKARBITRATION_H
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
static void appeared_callback( DADiskRef disk, void *context )
{
CFDictionaryRef dict = DADiskCopyDescription( disk );
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -3204,6 +3204,9 @@
RtlFreeHeap( GetProcessHeap(), 0, info );
}
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
static NTSTATUS read_changes_apc( void *user, PIO_STATUS_BLOCK iosb, NTSTATUS status, void **apc )
{
struct read_changes_info *info = user;
--- a/libs/wine/ldt.c
+++ b/libs/wine/ldt.c
@@ -80,6 +80,11 @@
#endif /* linux */
+#ifdef __GNU__
+#include <mach/i386/mach_i386.h>
+#include <mach/mach_traps.h>
+#endif /* GNU */
+
#if defined(__svr4__) || defined(_SCO_DS)
#include <sys/sysi86.h>
#ifndef __sun__
@@ -203,6 +208,52 @@
#elif defined(__APPLE__)
if ((ret = i386_set_ldt(index, (union ldt_entry *)entry, 1)) < 0)
perror("i386_set_ldt");
+#elif defined(__GNU__)
+ {
+ /*
+mach/i386/mach_i386.defs:
+type descriptor_t = struct[2] of int;
+type descriptor_list_t = array[*] of descriptor_t;
+
+include/winnt.h:
+typedef struct _LDT_ENTRY {
+ WORD LimitLow;
+ WORD BaseLow;
+ union {
+ struct {
+ BYTE BaseMid;
+ BYTE Flags1;
+ BYTE Flags2;
+ BYTE BaseHi;
+ } Bytes;
+ struct {
+ unsigned BaseMid: 8;
+ unsigned Type : 5;
+ unsigned Dpl : 2;
+ unsigned Pres : 1;
+ unsigned LimitHi : 4;
+ unsigned Sys : 1;
+ unsigned Reserved_0 : 1;
+ unsigned Default_Big : 1;
+ unsigned Granularity : 1;
+ unsigned BaseHi : 8;
+ } Bits;
+ } HighWord;
+} LDT_ENTRY, *PLDT_ENTRY;
+
+ */
+ LDT_ENTRY entry_copy = *entry;
+ // thread_t target_thread = 1;
+ // FIXME: Check the conversion */
+ //ret = i386_set_ldt(target_thread, index, (descriptor_list_t)&entry_copy, 1);
+ ret = i386_set_ldt(mach_thread_self(), sel, (descriptor_list_t)&entry_copy, 1);
+ if (ret != KERN_SUCCESS)
+ {
+ perror("i386_set_ldt");
+ fprintf( stderr, "i386_set_ldt failed\n" );
+ exit(1);
+ }
+ }
#else
fprintf( stderr, "No LDT support on this platform\n" );
exit(1);
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -235,6 +235,36 @@
#define FPU_sig(context) NULL /* FIXME */
#define FPUX_sig(context) NULL /* FIXME */
+#elif defined (__GNU__)
+
+#include <sys/ucontext.h>
+
+typedef ucontext_t SIGCONTEXT;
+
+#define EAX_sig(context) ((context)->uc_mcontext.gregs[REG_EAX])
+#define EBX_sig(context) ((context)->uc_mcontext.gregs[REG_EBX])
+#define ECX_sig(context) ((context)->uc_mcontext.gregs[REG_ECX])
+#define EDX_sig(context) ((context)->uc_mcontext.gregs[REG_EDX])
+#define ESI_sig(context) ((context)->uc_mcontext.gregs[REG_ESI])
+#define EDI_sig(context) ((context)->uc_mcontext.gregs[REG_EDI])
+#define EBP_sig(context) ((context)->uc_mcontext.gregs[REG_EBP])
+#define ESP_sig(context) ((context)->uc_mcontext.gregs[REG_ESP])
+
+#define CS_sig(context) ((context)->uc_mcontext.gregs[REG_CS])
+#define DS_sig(context) ((context)->uc_mcontext.gregs[REG_DS])
+#define ES_sig(context) ((context)->uc_mcontext.gregs[REG_ES])
+#define SS_sig(context) ((context)->uc_mcontext.gregs[REG_SS])
+#define FS_sig(context) ((context)->uc_mcontext.gregs[REG_FS])
+#define GS_sig(context) ((context)->uc_mcontext.gregs[REG_GS])
+
+#define EFL_sig(context) ((context)->uc_mcontext.gregs[REG_EFL])
+#define EIP_sig(context) ((context)->uc_mcontext.gregs[REG_EIP])
+#define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO])
+#define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR])
+
+#define FPU_sig(context) ((FLOATING_SAVE_AREA*)(&(context)->uc_mcontext.fpregs.fp_reg_set.fpchip_state))
+#define FPUX_sig(context) NULL
+
#elif defined (__OpenBSD__)
typedef struct sigcontext SIGCONTEXT;
Reply to: