Date: Tue, 10 Aug 2004 13:53:14 -0400 From: Anish Mistry <mistry.7@osu.edu> To: John Birrell <jb@cimlogic.com.au> Cc: freebsd-current@freebsd.org Subject: Re: FreeBSD and wine mmap Message-ID: <200408101353.22714.mistry.7@osu.edu> In-Reply-To: <20040804223937.GA99521@freebsd3.cimlogic.com.au> References: <200407271731.12282.mistry.7@osu.edu> <200408041828.26762.mistry.7@osu.edu> <20040804223937.GA99521@freebsd3.cimlogic.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
--Boundary-00=_LuQGBy7Z7vDlpxv
Content-Type: Text/Plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
=2D----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Wednesday 04 August 2004 06:39 pm, you wrote:
> On Wed, Aug 04, 2004 at 06:28:02PM -0400, Anish Mistry wrote:
> > Ok, so we need something like vm_map_findspace(), but for process addre=
ss
> > mapping? ie. pmap_findspace() that will return an address to a large
> > enough free chunk?
>
> That's a good start, just to get something to work with. How this fits in
> with the vm code and whether it is ultimately suitable in the long run is
> probably up to Alan Cox. For now, just get something that (a) doesn't bre=
ak
> anything else; and (b) lets Wine behave the way it needs to.
>
> AFAIK, there are still pthread issues with Wine, but those can't be
> addressed until the mmap issue has a work-around.
I've got a small patch that gets by the initial problem about not being to=
=20
mmap the memory for the libraries, but the addresses that are mmap'ed seem =
to=20
seem to overlap with memory that the current pthread implementation want to=
=20
mmap for the "red zone" when wine tries to create a thread. It can't mmap=
=20
the "red zone" addresses since all those address mapping where gobbled up=20
before the thread launched.
I'll try to figure out a way to maybe leave a space for the "red zone" and =
see=20
if that works.
Someone who actually knows what they are doing should probably take a look.
=2D --=20
Anish Mistry
=2D----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (FreeBSD)
iD8DBQFBGQuRxqA5ziudZT0RAv0VAJ0bL3c9McGSCjtXLucNuIwJRWkt7QCdG6Uh
jJeycc2sW1sb4fFOsJ+vT/k=3D
=3D/uWq
=2D----END PGP SIGNATURE-----
--Boundary-00=_LuQGBy7Z7vDlpxv
Content-Type: text/x-diff;
charset="iso-8859-1";
name="vm_mmap.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="vm_mmap.patch"
--- vm_mmap.c.orig Thu Aug 5 03:04:33 2004
+++ vm_mmap.c Tue Aug 10 13:02:09 2004
@@ -208,6 +208,8 @@
vm_offset_t addr;
vm_size_t size, pageoff;
vm_prot_t prot, maxprot;
+ vm_map_t map;
+
void *handle;
int flags, error;
off_t pos;
@@ -276,9 +278,28 @@
if (addr == 0 ||
(addr >= round_page((vm_offset_t)vms->vm_taddr) &&
addr < round_page((vm_offset_t)vms->vm_daddr +
- lim_max(td->td_proc, RLIMIT_DATA))))
+ lim_max(td->td_proc, RLIMIT_DATA)))) {
+ /*
+ * XXX So much dirtyness someone who knows what they are doing
+ * will want to fix this monstrosity.
+ */
+ map = &td->td_proc->p_vmspace->vm_map;
+ vm_map_lock(map);
addr = round_page((vm_offset_t)vms->vm_daddr +
- lim_max(td->td_proc, RLIMIT_DATA));
+ lim_max(td->td_proc, RLIMIT_DATA));
+ if(vm_map_findspace(map, addr, size, &addr) != 0) {
+ /*
+ * since we can't grab the upper process address space bruteforce it.
+ */
+ for(addr = 2048*1024;addr <= round_page((vm_offset_t)vms->vm_taddr) &&
+ vm_map_findspace(map, addr, size, &addr) != 0
+ ;addr += PAGE_SIZE,addr = round_page(addr));
+
+/* printf("NFND 0x%X : data : 0x%X : FF : 0x%X\n",addr,(vm_offset_t)vms->vm_daddr,(vm_offset_t)map->first_free->start);*/
+ }
+ vm_map_unlock(map);
+ }
+
PROC_UNLOCK(td->td_proc);
}
if (flags & MAP_ANON) {
--Boundary-00=_LuQGBy7Z7vDlpxv--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200408101353.22714.mistry.7>
