[PATCH] GNU/kFreeBSD port

Robert Millan rmh at aybabtu.com
Thu Feb 2 10:05:50 CST 2006


Hi!

I ported wine to GNU/kFreeBSD.  It still has some issues related to DOS Mode
emulation, but in general it works fine (I tested it with regedit.exe.so).

Thanks to the peers around in #winehackers for the assistance in my questions
about threading.

ChangeLog:

2006-02-02  Robert Millan  <robertmh at gnu.org>

	* configure.ac: Build -glibc/-pthread binaries on GNU/kFreeBSD as well.
	* configure: Regenerate.
	* include/wine/port.h: On FreeBSD, make sure __FreeBSD_kernel__ is
	defined.
	* dlls/kernel/cpu.c: Enable for GNU/kFreeBSD the same kernel-specific
	interface/parameter that is used with FreeBSD.  Use __FreeBSD_kernel__
	macro to identify kernel of FreeBSD, regardless of userland.
	* dlls/kernel/heap.c: Ditto.
	* dlls/ntdll/cdrom.c: Ditto.
	* dlls/ntdll/directory.c: Ditto.
	* dlls/ntdll/signal_i386.c: Ditto.
	* dlls/winsock/socket.c: Ditto.
	* libs/wine/ldt.c: Ditto.
	* libs/wine/mmap.c: Ditto.
	* server/context_i386.c: Ditto.
	* dlls/ntdll/file.c: Ditto.  On kernel of FreeBSD, include <sys/mount.h>
	regardless of where statfs was found (since we need the flag macros).

-- 
Robert Millan
-------------- next part --------------
2006-02-02  Robert Millan  <robertmh at gnu.org>

	* configure.ac: Build -glibc/-pthread binaries on GNU/kFreeBSD as well.
	* configure: Regenerate.
	* include/wine/port.h: On FreeBSD, make sure __FreeBSD_kernel__ is
	defined.
	* dlls/kernel/cpu.c: Enable for GNU/kFreeBSD the same kernel-specific
	interface/parameter that is used with FreeBSD.  Use __FreeBSD_kernel__
	macro to identify kernel of FreeBSD, regardless of userland.
	* dlls/kernel/heap.c: Ditto.
	* dlls/ntdll/cdrom.c: Ditto.
	* dlls/ntdll/directory.c: Ditto.
	* dlls/ntdll/signal_i386.c: Ditto.
	* dlls/winsock/socket.c: Ditto.
	* libs/wine/ldt.c: Ditto.
	* libs/wine/mmap.c: Ditto.
	* server/context_i386.c: Ditto.
	* dlls/ntdll/file.c: Ditto.  On kernel of FreeBSD, include <sys/mount.h>
	regardless of where statfs was found (since we need the flag macros).

Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.425
diff -u -r1.425 configure.ac
--- configure.ac	26 Jan 2006 12:47:07 -0000	1.425
+++ configure.ac	2 Feb 2006 15:45:50 -0000
@@ -1091,7 +1091,7 @@
 esac
 
 case $host_os in
-  linux*)
+  linux* | k*bsd*-gnu)
     case $host_cpu in
       *i[[3456789]]86*) AC_SUBST(WINE_BINARIES,"wine-glibc wine-kthread wine-pthread wine-preloader") ;;
       *) AC_SUBST(WINE_BINARIES,"wine-glibc wine-kthread wine-pthread") ;;
Index: dlls/kernel/cpu.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/cpu.c,v
retrieving revision 1.16
diff -u -r1.16 cpu.c
--- dlls/kernel/cpu.c	20 Jun 2005 10:40:37 -0000	1.16
+++ dlls/kernel/cpu.c	2 Feb 2006 15:45:51 -0000
@@ -511,7 +511,7 @@
 
         }
         memcpy(si,&cachedsi,sizeof(*si));
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD_kernel__)
 	{
 	unsigned int regs[4], regs2[4];
 	int ret, len, num;
Index: dlls/kernel/heap.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/heap.c,v
retrieving revision 1.27
diff -u -r1.27 heap.c
--- dlls/kernel/heap.c	12 Jan 2006 12:46:25 -0000	1.27
+++ dlls/kernel/heap.c	2 Feb 2006 15:45:51 -0000
@@ -1138,7 +1138,7 @@
 #ifdef linux
     FILE *f;
 #endif
-#if defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     int *tmp;
     int size_sys;
     int mib[2] = { CTL_HW };
@@ -1209,7 +1209,7 @@
                                       / (TotalPhysical / 100);
         }
     }
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     mib[1] = HW_PHYSMEM;
     sysctl(mib, 2, NULL, &size_sys, NULL, 0);
     tmp = malloc(size_sys * sizeof(int));
Index: dlls/ntdll/cdrom.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/cdrom.c,v
retrieving revision 1.75
diff -u -r1.75 cdrom.c
--- dlls/ntdll/cdrom.c	1 Dec 2005 12:01:43 -0000	1.75
+++ dlls/ntdll/cdrom.c	2 Feb 2006 15:45:52 -0000
@@ -480,7 +480,7 @@
    cdrom_cache[dev].toc_good = 1;
    return STATUS_SUCCESS;
 
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
 
    int i, tsz;
    struct ioc_toc_header hdr;
@@ -617,7 +617,7 @@
         return 1;
     }
     return 0;
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD_kernel__)
     FIXME("not implemented for BSD\n");
     return 0;
 #else
@@ -728,7 +728,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, CDROMRESET));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode(ioctl(fd, CDIOCRESET, NULL));
 #else
     return STATUS_NOT_SUPPORTED;
@@ -744,7 +744,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, doEject ? CDROMEJECT : CDROMCLOSETRAY));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode((ioctl(fd, CDIOCALLOW, NULL)) ||
                                (ioctl(fd, doEject ? CDIOCEJECT : CDIOCCLOSE, NULL)) ||
                                (ioctl(fd, CDIOCPREVENT, NULL)));
@@ -762,7 +762,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, CDROM_LOCKDOOR, rmv->PreventMediaRemoval));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode(ioctl(fd, (rmv->PreventMediaRemoval) ? CDIOCPREVENT : CDIOCALLOW, NULL));
 #else
     return STATUS_NOT_SUPPORTED;
@@ -920,7 +920,7 @@
 
  end:
     ret = CDROM_GetStatusCode(io);
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     unsigned            size;
     SUB_Q_HEADER*       hdr = (SUB_Q_HEADER*)data;
     int                 io;
@@ -1090,7 +1090,7 @@
 	  msf.cdmsf_min1, msf.cdmsf_sec1, msf.cdmsf_frame1);
  end:
     ret = CDROM_GetStatusCode(io);
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     struct	ioc_play_msf	msf;
     int         io;
 
@@ -1135,7 +1135,7 @@
 #if defined(linux)
     struct cdrom_msf0	msf;
     struct cdrom_subchnl sc;
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     struct ioc_play_msf	msf;
     struct ioc_read_subchannel	read_sc;
     struct cd_sub_channel_info	sc;
@@ -1188,7 +1188,7 @@
       return CDROM_GetStatusCode(ioctl(fd, CDROMSEEK, &msf));
     }
     return STATUS_SUCCESS;
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     read_sc.address_format = CD_MSF_FORMAT;
     read_sc.track          = 0;
     read_sc.data_len       = sizeof(sc);
@@ -1228,7 +1228,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, CDROMPAUSE));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode(ioctl(fd, CDIOCPAUSE, NULL));
 #else
     return STATUS_NOT_SUPPORTED;
@@ -1244,7 +1244,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, CDROMRESUME));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode(ioctl(fd, CDIOCRESUME, NULL));
 #else
     return STATUS_NOT_SUPPORTED;
@@ -1260,7 +1260,7 @@
 {
 #if defined(linux)
     return CDROM_GetStatusCode(ioctl(fd, CDROMSTOP));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return CDROM_GetStatusCode(ioctl(fd, CDIOCSTOP, NULL));
 #else
     return STATUS_NOT_SUPPORTED;
@@ -1287,7 +1287,7 @@
         vc->PortVolume[3] = volc.channel3;
     }
     return CDROM_GetStatusCode(io);
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     struct  ioc_vol     volc;
     int io;
 
@@ -1321,7 +1321,7 @@
     volc.channel3 = vc->PortVolume[3];
 
     return CDROM_GetStatusCode(ioctl(fd, CDROMVOLCTRL, &volc));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     struct  ioc_vol     volc;
 
     volc.vol[0] = vc->PortVolume[0];
@@ -1753,7 +1753,7 @@
     ret =CDROM_GetStatusCode(ioctl(fd, DVD_AUTH, &auth_info));
     *sid_out = auth_info.lsa.agid;
     return ret;
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return STATUS_NOT_SUPPORTED;
 #else
     return STATUS_NOT_SUPPORTED;
@@ -1776,7 +1776,7 @@
 
     TRACE("\n");
     return CDROM_GetStatusCode(ioctl(fd, DVD_AUTH, &auth_info));
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     return STATUS_NOT_SUPPORTED;
 #else
     return STATUS_NOT_SUPPORTED;
@@ -1906,7 +1906,7 @@
 	FIXME("Unknown keytype 0x%x\n",key->KeyType);
     }
     return ret;
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__NetBSD__)
     TRACE("bsd\n");
     return STATUS_NOT_SUPPORTED;
 #else
Index: dlls/ntdll/directory.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/directory.c,v
retrieving revision 1.46
diff -u -r1.46 directory.c
--- dlls/ntdll/directory.c	27 Jan 2006 12:01:01 -0000	1.46
+++ dlls/ntdll/directory.c	2 Feb 2006 15:45:52 -0000
@@ -288,7 +288,7 @@
 }
 #endif
 
-#ifdef __FreeBSD__
+#ifdef __FreeBSD_kernel__
 #include <fstab.h>
 static char *parse_mount_entries( FILE *f, dev_t dev, ino_t ino )
 {
@@ -391,7 +391,7 @@
     }
     RtlLeaveCriticalSection( &dir_section );
 
-#elif defined( __FreeBSD__ )
+#elif defined( __FreeBSD_kernel__ )
     char *device = NULL;
     int fd, res = -1;
     struct stat st;
Index: dlls/ntdll/file.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/file.c,v
retrieving revision 1.117
diff -u -r1.117 file.c
--- dlls/ntdll/file.c	27 Jan 2006 15:22:02 -0000	1.117
+++ dlls/ntdll/file.c	2 Feb 2006 15:45:53 -0000
@@ -57,6 +57,10 @@
 # endif
 #endif
 
+#if defined(__FreeBSD_kernel__) && (!defined(MNT_RDONLY) || !defined(MNT_LOCAL))
+# include <sys/mount.h>
+#endif
+
 #ifdef HAVE_IOKIT_IOKITLIB_H
 # include <IOKit/IOKitLib.h>
 # include <CoreFoundation/CFNumber.h> /* for kCFBooleanTrue, kCFBooleanFalse */
@@ -1594,7 +1598,7 @@
             info->DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM;
             break;
         }
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD_kernel__)
         struct statfs stfs;
 
         /* The proper way to do this in FreeBSD seems to be with the
Index: dlls/ntdll/signal_i386.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_i386.c,v
retrieving revision 1.114
diff -u -r1.114 signal_i386.c
--- dlls/ntdll/signal_i386.c	27 Jan 2006 15:22:33 -0000	1.114
+++ dlls/ntdll/signal_i386.c	2 Feb 2006 15:45:54 -0000
@@ -204,7 +204,7 @@
 
 #endif /* bsdi */
 
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
 
 typedef struct sigcontext SIGCONTEXT;
 
@@ -328,7 +328,7 @@
 
 #endif /* __APPLE__ */
 
-#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__) ||\
+#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD_kernel__) ||\
     defined(__OpenBSD__) || defined(__EMX__) || defined(__CYGWIN__)
 
 #define EAX_sig(context)     ((context)->sc_eax)
@@ -358,7 +358,7 @@
 #define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->cr2)
 #endif
 
-#ifdef __FreeBSD__
+#ifdef __FreeBSD_kernel__
 #define EFL_sig(context)     ((context)->sc_efl)
 /* FreeBSD, see i386/i386/traps.c::trap_pfault va->err kludge  */
 #define FAULT_ADDRESS        ((void *)HANDLER_CONTEXT->sc_err)
@@ -369,7 +369,7 @@
 #define EIP_sig(context)     (*((unsigned long*)&(context)->sc_eip))
 #define ESP_sig(context)     (*((unsigned long*)&(context)->sc_esp))
 
-#endif  /* linux || __NetBSD__ || __FreeBSD__ || __OpenBSD__ */
+#endif  /* linux || __NetBSD__ || __FreeBSD_kernel__ || __OpenBSD__ */
 
 #if defined(__svr4__) || defined(_SCO_DS) || defined(__sun)
 
@@ -1374,7 +1374,7 @@
     sigaddset( &sig_act.sa_mask, SIGUSR1 );
     sigaddset( &sig_act.sa_mask, SIGUSR2 );
 
-#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
     sig_act.sa_flags = SA_RESTART;
 #elif defined (__svr4__) || defined(_SCO_DS) || defined(__APPLE__)
     sig_act.sa_flags = SA_SIGINFO | SA_RESTART;
Index: dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.206
diff -u -r1.206 socket.c
--- dlls/winsock/socket.c	4 Jan 2006 14:45:46 -0000	1.206
+++ dlls/winsock/socket.c	2 Feb 2006 15:45:56 -0000
@@ -144,10 +144,10 @@
 #endif
 
 
-#ifdef __FreeBSD__
+#ifdef __FreeBSD_kernel__
 # define sipx_network    sipx_addr.x_net
 # define sipx_node       sipx_addr.x_host.c_host
-#endif  /* __FreeBSD__ */
+#endif  /* __FreeBSD_kernel__ */
 
 #ifndef INADDR_NONE
 #define INADDR_NONE ~0UL
Index: include/wine/port.h
===================================================================
RCS file: /home/wine/wine/include/wine/port.h,v
retrieving revision 1.71
diff -u -r1.71 port.h
--- include/wine/port.h	14 Jan 2006 16:58:50 -0000	1.71
+++ include/wine/port.h	2 Feb 2006 15:45:56 -0000
@@ -443,4 +443,8 @@
 
 #endif /* NO_LIBWINE_PORT */
 
+#if defined(__FreeBSD__) && !defined(__FreeBSD_kernel__)
+#define __FreeBSD_kernel__
+#endif
+
 #endif /* !defined(__WINE_WINE_PORT_H) */
Index: libs/wine/ldt.c
===================================================================
RCS file: /home/wine/wine/libs/wine/ldt.c,v
retrieving revision 1.11
diff -u -r1.11 ldt.c
--- libs/wine/ldt.c	23 Jan 2006 11:09:01 -0000	1.11
+++ libs/wine/ldt.c	2 Feb 2006 15:45:56 -0000
@@ -109,12 +109,12 @@
 #endif
 #endif
 
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
 #include <machine/segments.h>
 
 extern int i386_get_ldt(int, union descriptor *, int);
 extern int i386_set_ldt(int, union descriptor *, int);
-#endif  /* __NetBSD__ || __FreeBSD__ || __OpenBSD__ */
+#endif  /* __NetBSD__ || __FreeBSD_kernel__ || __OpenBSD__ */
 
 #ifdef __APPLE__
 #include <i386/user_ldt.h>
@@ -203,7 +203,7 @@
         if ((ret = modify_ldt(0x11, &ldt_info, sizeof(ldt_info))) < 0)
             perror( "modify_ldt" );
     }
-#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#elif defined(__NetBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
     {
 	LDT_ENTRY entry_copy = *entry;
 	/* The kernel will only let us set LDTs with user priority level */
Index: libs/wine/mmap.c
===================================================================
RCS file: /home/wine/wine/libs/wine/mmap.c,v
retrieving revision 1.11
diff -u -r1.11 mmap.c
--- libs/wine/mmap.c	23 Jan 2006 16:46:27 -0000	1.11
+++ libs/wine/mmap.c	2 Feb 2006 15:45:56 -0000
@@ -199,7 +199,7 @@
 
     if (!(flags & MAP_FIXED))
     {
-#ifdef __FreeBSD__
+#ifdef __FreeBSD_kernel__
         /* Even FreeBSD 5.3 does not properly support NULL here. */
         if( start == NULL ) start = (void *)0x110000;
 #endif
@@ -283,7 +283,7 @@
 {
     struct reserved_area *area;
     struct list *ptr;
-#if defined(__i386__) && !defined(__FreeBSD__)  /* commented out until FreeBSD gets fixed */
+#if defined(__i386__) && !defined(__FreeBSD_kernel__)  /* commented out until FreeBSD gets fixed */
     char stack;
     char * const stack_ptr = &stack;
     char *user_space_limit = (char *)0x80000000;
Index: server/context_i386.c
===================================================================
RCS file: /home/wine/wine/server/context_i386.c,v
retrieving revision 1.35
diff -u -r1.35 context_i386.c
--- server/context_i386.c	11 Jan 2006 20:36:18 -0000	1.35
+++ server/context_i386.c	2 Feb 2006 15:45:57 -0000
@@ -19,6 +19,7 @@
  */
 
 #include "config.h"
+#include "wine/port.h"
 
 #ifdef __i386__
 
@@ -340,7 +341,7 @@
     file_set_error();
 }
 
-#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__NetBSD__)
 #include <machine/reg.h>
 
 /* retrieve a thread context */
@@ -495,9 +496,9 @@
     file_set_error();
 }
 
-#else  /* linux || __sun__ || __FreeBSD__ */
+#else  /* linux || __sun__ || __FreeBSD_kernel__ */
 #error You must implement get/set_thread_context_ptrace for your platform
-#endif  /* linux || __sun__ || __FreeBSD__ */
+#endif  /* linux || __sun__ || __FreeBSD_kernel__ */
 
 
 /* copy a context structure according to the flags */


More information about the wine-patches mailing list