|
From: <sv...@va...> - 2007-01-09 16:47:24
|
Author: sewardj
Date: 2007-01-09 16:47:20 +0000 (Tue, 09 Jan 2007)
New Revision: 6495
Log:
ML_(generic_PRE_sys_mmap): In the case of a hinted mapping (for the
client) which aspacemgr accepts at the hint address but the kernel
declines, try again as a non-hinted mapping. Fixes ld.so mapping
failures observed on ppc32-linux, although the problem potentially
applies to all Linux targets.
Modified:
trunk/coregrind/m_syswrap/syswrap-generic.c
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-generic.c 2007-01-09 13:24:19 UTC (=
rev 6494)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2007-01-09 16:47:20 UTC (=
rev 6495)
@@ -1888,6 +1888,25 @@
arg4 | VKI_MAP_FIXED,
arg5, arg6);
=20
+ /* A refinement: it may be that the kernel refused aspacem's choice
+ of address. If we were originally asked for a hinted mapping,
+ there is still a last chance: try again at any address.
+ Hence: */
+ if (mreq.rkind =3D=3D MHint && sres.isError) {
+ mreq.start =3D 0;
+ mreq.len =3D arg2;
+ mreq.rkind =3D MAny;
+ advised =3D VG_(am_get_advisory)( &mreq, True/*client*/, &mreq_ok =
);
+ if (!mreq_ok) {
+ /* Our request was bounced, so we'd better fail. */
+ return VG_(mk_SysRes_Error)( VKI_EINVAL );
+ }
+ /* and try again with the kernel */
+ sres =3D VG_(am_do_mmap_NO_NOTIFY)(advised, arg2, arg3,
+ arg4 | VKI_MAP_FIXED,
+ arg5, arg6);
+ }
+
if (!sres.isError) {
/* Notify aspacem and the tool. */
ML_(notify_aspacem_and_tool_of_mmap)(=20
|