Last active
January 1, 2022 07:50
-
-
Save X547/4a0a6a2aec1ee1994ac1855b90e94195 to your computer and use it in GitHub Desktop.
Initial Wine patch for Haiku (wine-6.23). Clang is required for build.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From a94d195b2ef1188052d0b950bc889b5eb0dfc3dc Mon Sep 17 00:00:00 2001 | |
From: X512 <danger_mail@list.ru> | |
Date: Fri, 31 Dec 2021 08:17:23 +0900 | |
Subject: Haiku: fix build and minimal operation | |
--- | |
dlls/nsiproxy.sys/ndis.c | 10 ++++++++ | |
dlls/ntdll/unix/file.c | 2 ++ | |
dlls/ntdll/unix/loader.c | 4 +++ | |
dlls/ntdll/unix/serial.c | 2 ++ | |
dlls/ntdll/unix/server.c | 3 +++ | |
dlls/ntdll/unix/signal_x86_64.c | 45 +++++++++++++++++++++++++++++++++ | |
dlls/ntdll/unix/socket.c | 7 +++++ | |
dlls/winex11.drv/bitblt.c | 1 + | |
dlls/ws2_32/unixlib.c | 6 +++++ | |
server/change.c | 3 +++ | |
server/fd.c | 3 +++ | |
server/signal.c | 3 +++ | |
server/sock.c | 8 ++++++ | |
13 files changed, 97 insertions(+) | |
diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c | |
index 3e37bce..ed8e206 100644 | |
--- a/dlls/nsiproxy.sys/ndis.c | |
+++ b/dlls/nsiproxy.sys/ndis.c | |
@@ -264,6 +264,9 @@ static WCHAR *strdupAtoW( const char *str ) | |
static struct if_entry *add_entry( DWORD index, char *name ) | |
{ | |
+#ifdef __HAIKU__ | |
+ return NULL; | |
+#else | |
struct if_entry *entry; | |
int name_len = strlen( name ); | |
@@ -292,6 +295,7 @@ static struct if_entry *add_entry( DWORD index, char *name ) | |
list_add_tail( &if_list, &entry->entry ); | |
return entry; | |
+#endif | |
} | |
static void update_if_table( void ) | |
@@ -327,6 +331,7 @@ static void ifinfo_fill_dynamic( struct if_entry *entry, struct nsi_ndis_ifinfo_ | |
fd = socket( PF_INET, SOCK_DGRAM, 0 ); | |
if (fd == -1) return; | |
+#ifndef __HAIKU__ | |
if (!ioctl( fd, SIOCGIFFLAGS, &req )) | |
{ | |
if (req.ifr_flags & IFF_UP) data->oper_status = IfOperStatusUp; | |
@@ -335,6 +340,7 @@ static void ifinfo_fill_dynamic( struct if_entry *entry, struct nsi_ndis_ifinfo_ | |
#endif | |
else data->oper_status = IfOperStatusDown; | |
} else data->oper_status = IfOperStatusUnknown; | |
+#endif | |
data->flags.unk = 0; | |
data->flags.not_media_conn = 0; | |
@@ -342,8 +348,12 @@ static void ifinfo_fill_dynamic( struct if_entry *entry, struct nsi_ndis_ifinfo_ | |
data->media_conn_state = MediaConnectStateConnected; | |
data->unk = 0; | |
+#ifndef __HAIKU__ | |
if (!ioctl( fd, SIOCGIFMTU, &req )) data->mtu = req.ifr_mtu; | |
else data->mtu = 0; | |
+#else | |
+ data->mtu = 0; | |
+#endif | |
close( fd ); | |
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c | |
index 10d8f3d..43e2105 100644 | |
--- a/dlls/ntdll/unix/file.c | |
+++ b/dlls/ntdll/unix/file.c | |
@@ -6529,6 +6529,7 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io | |
} | |
if (!get_mountmgr_fs_info( handle, fd, &drive, sizeof(drive) )) fs_type = drive.fs_type; | |
+#ifndef __HAIKU__ | |
else | |
{ | |
struct statfs stfs; | |
@@ -6560,6 +6561,7 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io | |
#endif | |
} | |
} | |
+#endif | |
switch (fs_type) | |
{ | |
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c | |
index 82d099d..a1e4515 100644 | |
--- a/dlls/ntdll/unix/loader.c | |
+++ b/dlls/ntdll/unix/loader.c | |
@@ -870,7 +870,11 @@ static NTSTATUS map_so_dll( const IMAGE_NT_HEADERS *nt_descr, HMODULE module ) | |
+ sizeof(IMAGE_NT_HEADERS) | |
+ nb_sections * sizeof(IMAGE_SECTION_HEADER)); | |
+#ifdef __HAIKU__ | |
+ mprotect(addr, size, PROT_READ | PROT_WRITE); | |
+#else | |
if (anon_mmap_fixed( addr, size, PROT_READ | PROT_WRITE, 0 ) != addr) return STATUS_NO_MEMORY; | |
+#endif | |
dos = (IMAGE_DOS_HEADER *)addr; | |
nt = (IMAGE_NT_HEADERS *)((BYTE *)(dos + 1) + sizeof(builtin_signature)); | |
diff --git a/dlls/ntdll/unix/serial.c b/dlls/ntdll/unix/serial.c | |
index 83244d0..6d1d27c 100644 | |
--- a/dlls/ntdll/unix/serial.c | |
+++ b/dlls/ntdll/unix/serial.c | |
@@ -280,9 +280,11 @@ static NTSTATUS get_line_control(int fd, SERIAL_LINE_CONTROL* slc) | |
switch (port.c_cflag & CSIZE) | |
{ | |
case CS5: slc->WordLength = 5; break; | |
+#ifndef __HAIKU__ | |
case CS6: slc->WordLength = 6; break; | |
case CS7: slc->WordLength = 7; break; | |
case CS8: slc->WordLength = 8; break; | |
+#endif | |
default: ERR("unknown size %x\n", (UINT)(port.c_cflag & CSIZE)); | |
} | |
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c | |
index 1dcd079..e6eb2c3 100644 | |
--- a/dlls/ntdll/unix/server.c | |
+++ b/dlls/ntdll/unix/server.c | |
@@ -76,6 +76,9 @@ | |
#define _POSIX_SPAWN_DISABLE_ASLR 0x0100 | |
#endif | |
#endif | |
+#ifdef __HAIKU__ | |
+#define SIGIO SIGPOLL | |
+#endif | |
#include "ntstatus.h" | |
#define WIN32_NO_STATUS | |
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c | |
index 9e9a96d..957f796 100644 | |
--- a/dlls/ntdll/unix/signal_x86_64.c | |
+++ b/dlls/ntdll/unix/signal_x86_64.c | |
@@ -64,6 +64,11 @@ | |
#ifdef __APPLE__ | |
# include <mach/mach.h> | |
#endif | |
+#ifdef __HAIKU__ | |
+# include <SupportDefs.h> | |
+extern status_t _kern_generic_syscall(const char *subsystem, uint32 function, | |
+ void *buffer, size_t bufferSize); | |
+#endif | |
#define NONAMELESSUNION | |
#define NONAMELESSSTRUCT | |
@@ -232,6 +237,34 @@ __ASM_GLOBAL_FUNC( alloc_fs_sel, | |
#define FPU_sig(context) ((XMM_SAVE_AREA32 *)&(context)->uc_mcontext->__fs.__fpu_fcw) | |
#define XState_sig(context) NULL | |
+#elif defined (__HAIKU__) | |
+ | |
+#define RAX_sig(context) ((context)->uc_mcontext.rax) | |
+#define RBX_sig(context) ((context)->uc_mcontext.rbx) | |
+#define RCX_sig(context) ((context)->uc_mcontext.rcx) | |
+#define RDX_sig(context) ((context)->uc_mcontext.rdx) | |
+#define RSI_sig(context) ((context)->uc_mcontext.rsi) | |
+#define RDI_sig(context) ((context)->uc_mcontext.rdi) | |
+#define RBP_sig(context) ((context)->uc_mcontext.rbp) | |
+#define R8_sig(context) ((context)->uc_mcontext.r8) | |
+#define R9_sig(context) ((context)->uc_mcontext.r9) | |
+#define R10_sig(context) ((context)->uc_mcontext.r10) | |
+#define R11_sig(context) ((context)->uc_mcontext.r11) | |
+#define R12_sig(context) ((context)->uc_mcontext.r12) | |
+#define R13_sig(context) ((context)->uc_mcontext.r13) | |
+#define R14_sig(context) ((context)->uc_mcontext.r14) | |
+#define R15_sig(context) ((context)->uc_mcontext.r15) | |
+#define CS_sig(context) NULL | |
+#define FS_sig(context) NULL | |
+#define GS_sig(context) NULL | |
+#define EFL_sig(context) ((context)->uc_mcontext.rflags) | |
+#define RIP_sig(context) ((context)->uc_mcontext.rip) | |
+#define RSP_sig(context) ((context)->uc_mcontext.rsp) | |
+#define TRAP_sig(context) TRAP_x86_PAGEFLT | |
+#define ERROR_sig(context) 0 | |
+#define FPU_sig(context) ((XMM_SAVE_AREA32 *)&(context)->uc_mcontext.fpu) | |
+#define XState_sig(context) NULL | |
+ | |
#else | |
#error You must define the signal context functions for your platform | |
#endif | |
@@ -1511,10 +1544,12 @@ static inline void set_sigcontext( const CONTEXT *context, ucontext_t *sigcontex | |
R14_sig(sigcontext) = context->R14; | |
R15_sig(sigcontext) = context->R15; | |
RIP_sig(sigcontext) = context->Rip; | |
+#ifndef __HAIKU__ | |
CS_sig(sigcontext) = context->SegCs; | |
FS_sig(sigcontext) = context->SegFs; | |
GS_sig(sigcontext) = context->SegGs; | |
EFL_sig(sigcontext) = context->EFlags; | |
+#endif | |
#ifdef DS_sig | |
DS_sig(sigcontext) = context->SegDs; | |
#endif | |
@@ -2171,7 +2206,9 @@ static void setup_raise_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec | |
} | |
} | |
+#ifndef __HAIKU__ | |
CS_sig(sigcontext) = cs64_sel; | |
+#endif | |
RIP_sig(sigcontext) = (ULONG_PTR)pKiUserExceptionDispatcher; | |
RSP_sig(sigcontext) = (ULONG_PTR)stack; | |
/* clear single-step, direction, and align check flag */ | |
@@ -2550,6 +2587,12 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext ) | |
EXCEPTION_RECORD rec = { 0 }; | |
struct xcontext context; | |
ucontext_t *ucontext = sigcontext; | |
+ printf("segv_handler\n"); | |
+ printf(" IP: %#" PRIx64 "\n", RIP_sig(ucontext)); | |
+ printf(" SP: %#" PRIx64 "\n", RSP_sig(ucontext)); | |
+ printf(" FP: %#" PRIx64 "\n", RBP_sig(ucontext)); | |
+ printf(" address: %#" PRIx64 "\n", siginfo->si_addr); | |
+ _exit(1); | |
rec.ExceptionAddress = (void *)RIP_sig(ucontext); | |
save_context( &context, sigcontext ); | |
@@ -2911,6 +2954,8 @@ void signal_init_thread( TEB *teb ) | |
thread's gsbase. Have each thread record its gsbase pointer into its | |
TEB so alloc_tls_slot() can find it. */ | |
teb->Reserved5[0] = amd64_thread_data()->pthread_teb; | |
+#elif defined (__HAIKU__) | |
+ _kern_generic_syscall("thread", /*THREAD_SET_GS_BASE*/ 1, teb, 0); | |
#else | |
# error Please define setting %gs for your architecture | |
#endif | |
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c | |
index 2e79b9b..335b9fa 100644 | |
--- a/dlls/ntdll/unix/socket.c | |
+++ b/dlls/ntdll/unix/socket.c | |
@@ -168,7 +168,9 @@ static NTSTATUS sock_errno_to_status( int err ) | |
case EDESTADDRREQ: return STATUS_INVALID_PARAMETER; | |
case EMSGSIZE: return STATUS_BUFFER_OVERFLOW; | |
case EPROTONOSUPPORT: | |
+#ifndef __HAIKU__ | |
case ESOCKTNOSUPPORT: | |
+#endif | |
case EPFNOSUPPORT: | |
case EAFNOSUPPORT: | |
case EPROTOTYPE: return STATUS_NOT_SUPPORTED; | |
@@ -1450,11 +1452,16 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc | |
} | |
else | |
{ | |
+#ifdef __HAIKU__ | |
+ status = sock_errno_to_status( -1 ); | |
+ break; | |
+#else | |
if ((ret = ioctl( fd, SIOCATMARK, &value )) < 0) | |
{ | |
status = sock_errno_to_status( errno ); | |
break; | |
} | |
+#endif | |
/* windows is reversed with respect to unix */ | |
*(int *)out_buffer = !value; | |
} | |
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c | |
index fad183b..fe47611 100644 | |
--- a/dlls/winex11.drv/bitblt.c | |
+++ b/dlls/winex11.drv/bitblt.c | |
@@ -41,6 +41,7 @@ | |
# include <sys/ipc.h> | |
# endif | |
#endif | |
+#undef HAVE_LIBXXSHM | |
#include "windef.h" | |
#include "winbase.h" | |
diff --git a/dlls/ws2_32/unixlib.c b/dlls/ws2_32/unixlib.c | |
index 67edf06..4b9274b 100644 | |
--- a/dlls/ws2_32/unixlib.c | |
+++ b/dlls/ws2_32/unixlib.c | |
@@ -166,7 +166,9 @@ static const int ip_protocol_map[][2] = | |
MAP( IPPROTO_ICMP ), | |
MAP( IPPROTO_IGMP ), | |
MAP( IPPROTO_RAW ), | |
+#ifndef __HAIKU__ | |
{WS_IPPROTO_IPV4, IPPROTO_IPIP}, | |
+#endif | |
}; | |
#undef MAP | |
@@ -338,7 +340,9 @@ static unsigned int errno_from_unix( int err ) | |
case EPROTOTYPE: return WSAEPROTOTYPE; | |
case ENOPROTOOPT: return WSAENOPROTOOPT; | |
case EPROTONOSUPPORT: return WSAEPROTONOSUPPORT; | |
+#ifndef __HAIKU__ | |
case ESOCKTNOSUPPORT: return WSAESOCKTNOSUPPORT; | |
+#endif | |
case EOPNOTSUPP: return WSAEOPNOTSUPP; | |
case EPFNOSUPPORT: return WSAEPFNOSUPPORT; | |
case EAFNOSUPPORT: return WSAEAFNOSUPPORT; | |
@@ -354,7 +358,9 @@ static unsigned int errno_from_unix( int err ) | |
case EISCONN: return WSAEISCONN; | |
case ENOTCONN: return WSAENOTCONN; | |
case ESHUTDOWN: return WSAESHUTDOWN; | |
+#ifndef __HAIKU__ | |
case ETOOMANYREFS: return WSAETOOMANYREFS; | |
+#endif | |
case ETIMEDOUT: return WSAETIMEDOUT; | |
case ECONNREFUSED: return WSAECONNREFUSED; | |
case ELOOP: return WSAELOOP; | |
diff --git a/server/change.c b/server/change.c | |
index a01d689..a26f7d3 100644 | |
--- a/server/change.c | |
+++ b/server/change.c | |
@@ -36,6 +36,9 @@ | |
#ifdef HAVE_SYS_INOTIFY_H | |
#include <sys/inotify.h> | |
#endif | |
+#ifdef __HAIKU__ | |
+#define SIGIO SIGPOLL | |
+#endif | |
#include "ntstatus.h" | |
#define WIN32_NO_STATUS | |
diff --git a/server/fd.c b/server/fd.c | |
index c9a2118..1a0840f 100644 | |
--- a/server/fd.c | |
+++ b/server/fd.c | |
@@ -88,6 +88,9 @@ | |
#ifdef HAVE_SYS_SYSCALL_H | |
#include <sys/syscall.h> | |
#endif | |
+#ifdef __HAIKU__ | |
+#undef ioctl | |
+#endif | |
#include "ntstatus.h" | |
#define WIN32_NO_STATUS | |
diff --git a/server/signal.c b/server/signal.c | |
index 19b76d4..05dafe1 100644 | |
--- a/server/signal.c | |
+++ b/server/signal.c | |
@@ -28,6 +28,9 @@ | |
#include <sys/resource.h> | |
#endif | |
#include <unistd.h> | |
+#ifdef __HAIKU__ | |
+#define SIGIO SIGPOLL | |
+#endif | |
#include "file.h" | |
#include "object.h" | |
diff --git a/server/sock.c b/server/sock.c | |
index c9b7113..daeb937 100644 | |
--- a/server/sock.c | |
+++ b/server/sock.c | |
@@ -1483,7 +1483,9 @@ static int get_unix_protocol( int protocol ) | |
case WS_IPPROTO_ICMP: return IPPROTO_ICMP; | |
case WS_IPPROTO_IGMP: return IPPROTO_IGMP; | |
case WS_IPPROTO_IP: return IPPROTO_IP; | |
+#ifndef __HAIKU__ | |
case WS_IPPROTO_IPV4: return IPPROTO_IPIP; | |
+#endif | |
case WS_IPPROTO_IPV6: return IPPROTO_IPV6; | |
case WS_IPPROTO_RAW: return IPPROTO_RAW; | |
case WS_IPPROTO_TCP: return IPPROTO_TCP; | |
@@ -1943,7 +1945,9 @@ static unsigned int sock_get_error( int err ) | |
case EPROTOTYPE: return WSAEPROTOTYPE; | |
case ENOPROTOOPT: return WSAENOPROTOOPT; | |
case EPROTONOSUPPORT: return WSAEPROTONOSUPPORT; | |
+#ifndef __HAIKU__ | |
case ESOCKTNOSUPPORT: return WSAESOCKTNOSUPPORT; | |
+#endif | |
case EOPNOTSUPP: return WSAEOPNOTSUPP; | |
case EPFNOSUPPORT: return WSAEPFNOSUPPORT; | |
case EAFNOSUPPORT: return WSAEAFNOSUPPORT; | |
@@ -1959,7 +1963,9 @@ static unsigned int sock_get_error( int err ) | |
case EISCONN: return WSAEISCONN; | |
case ENOTCONN: return WSAENOTCONN; | |
case ESHUTDOWN: return WSAESHUTDOWN; | |
+#ifndef __HAIKU__ | |
case ETOOMANYREFS: return WSAETOOMANYREFS; | |
+#endif | |
case ETIMEDOUT: return WSAETIMEDOUT; | |
case ECONNREFUSED: return WSAECONNREFUSED; | |
case ELOOP: return WSAELOOP; | |
@@ -2010,7 +2016,9 @@ static int sock_get_ntstatus( int err ) | |
case EDESTADDRREQ: return STATUS_INVALID_PARAMETER; | |
case EMSGSIZE: return STATUS_BUFFER_OVERFLOW; | |
case EPROTONOSUPPORT: | |
+#ifndef __HAIKU__ | |
case ESOCKTNOSUPPORT: | |
+#endif | |
case EPFNOSUPPORT: | |
case EAFNOSUPPORT: | |
case EPROTOTYPE: return STATUS_NOT_SUPPORTED; | |
-- | |
2.30.2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment