Date: Mon, 30 May 2005 20:04:28 +0200 From: "jean-marc DETREZ" <jm.detrez@cegetel.net> To: <wine-patches@winehq.com>, <emulation@freebsd.org> Subject: patch for unbreaking wine on freebsd (with the patch!!!!) Message-ID: <20050530180342.A6C7B1A453F@smtp.cegetel.net>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
------=_NextPart_000_0004_01C56552.CABBDC00
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Hi,
I'm currently testing a patch I've made for unbreaking wine on FreeBSD.I'ts
seems that like other OS a call to mmap() return not always the desired
address range.
For NetBSD it appears that a special function was compiled "try_mmap_fixed"
who call mmap with MAP_FIXED after verifying that the memory address is
free.
I'm use this function to Create Heap System at base address 0x80000000 , I
didn't always use that function for all calls to mmap because it seems that
cause performance issues.
I made a little correction of "try_mmap_fixed" because it's seems to me
that the function didn't really test the result (vec).
What do you think of that, if it work for all (emulation@freebsd.com: could
you test) could you insert it in the future wine release?
Don't miss to give me feedback, I've a few more patch to send.
Jean-marc.
The patch is for libs/wine/mmap.c
------=_NextPart_000_0004_01C56552.CABBDC00
Content-Type: application/octet-stream;
name="mmap.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="mmap.patch"
--- mmap.orig Wed Dec 15 11:51:51 2004=0A=
+++ mmap.c Sat May 28 21:58:35 2005=0A=
@@ -59,7 +59,7 @@ static inline int munmap( void *ptr, siz=0A=
#endif=0A=
=0A=
=0A=
-#if (defined(__svr4__) || defined(__NetBSD__)) && !defined(MAP_TRYFIXED)=0A=
+#if (defined(__svr4__) || defined(__NetBSD__) || defined(__FreeBSD__)) =
&& !defined(MAP_TRYFIXED)=0A=
/***********************************************************************=0A=
* try_mmap_fixed=0A=
*=0A=
@@ -115,8 +115,9 @@ static int try_mmap_fixed (void *addr, s=0A=
/* We call mincore() for every page in the desired range.=0A=
If any of these calls succeeds, the page is already=0A=
mapped and we must fail. */=0A=
+ /*patch for BSD testing the result of mincore not only if failed */=0A=
for ( i =3D 0; i < len; i +=3D pagesize )=0A=
- if ( mincore( (caddr_t)addr + i, pagesize, &vec ) !=3D -1 )=0A=
+ if ( mincore( (caddr_t)addr + i, pagesize, &vec ) !=3D -1 =
&& (vec&1))=0A=
_exit(1);=0A=
=0A=
/* Perform the mapping with MAP_FIXED set. This is safe=0A=
@@ -137,7 +138,7 @@ static int try_mmap_fixed (void *addr, s=0A=
=0A=
return result =3D=3D addr;=0A=
}=0A=
-#endif /* (__svr4__ || __NetBSD__) && !MAP_TRYFIXED */=0A=
+#endif /* (__svr4__ || __NetBSD__ || __FreeBSD__) && !MAP_TRYFIXED */=0A=
=0A=
=0A=
/***********************************************************************=0A=
@@ -182,10 +183,21 @@ void *wine_anon_mmap( void *start, size_=0A=
#ifdef MAP_TRYFIXED=0A=
/* If available, this will attempt a fixed mapping in-kernel */=0A=
flags |=3D MAP_TRYFIXED;=0A=
-#elif defined(__svr4__) || defined(__NetBSD__)=0A=
+=0A=
+#elif defined(__svr4__) || defined(__NetBSD__) =0A=
if ( try_mmap_fixed( start, size, prot, flags, fdzero, 0 ) )=0A=
return start;=0A=
+=0A=
+#elif defined(__FreeBSD__) =0A=
+ /* for creating system heap use this to assure the adress of start is =
good*/=0A=
+ if (start=3D=3D (void *)0x80000000)=0A=
+ {=0A=
+ if (try_mmap_fixed( start, size, prot, flags, fdzero, 0 ) )=0A=
+ return start;=0A=
+ TRACE("Creating System Heap in FreeBSD using try_mmap_fixed");=0A=
+ }=0A=
#endif=0A=
+=0A=
}=0A=
return mmap( start, size, prot, flags, fdzero, 0 );=0A=
#else=0A=
@@ -249,6 +261,7 @@ static void reserve_dos_area(void)=0A=
wine_anon_mmap( NULL, page_size, PROT_NONE, MAP_NORESERVE|MAP_FIXED =
);=0A=
wine_mmap_add_reserved_area( NULL, dos_area_size );=0A=
}=0A=
+=0A=
=0A=
=0A=
/***********************************************************************=0A=
------=_NextPart_000_0004_01C56552.CABBDC00--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050530180342.A6C7B1A453F>
