|
From: <sv...@va...> - 2005-09-12 10:14:20
|
Author: sewardj
Date: 2005-09-12 11:14:16 +0100 (Mon, 12 Sep 2005)
New Revision: 4624
Log:
Set up a client data (brk) segment and partially restore brk support
in syswrap-generic.c:do_brk().
Modified:
branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c
branches/ASPACEM/coregrind/m_main.c
branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c
Modified: branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.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
--- branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-12 09:39:3=
7 UTC (rev 4623)
+++ branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-12 10:14:1=
6 UTC (rev 4624)
@@ -63,8 +63,8 @@
Addr VG_(clstk_end);
UWord VG_(clstk_id);
=20
-Addr VG_(brk_base); /* start of brk */
-Addr VG_(brk_limit); /* current brk */
+Addr VG_(brk_base) =3D 0; /* start of brk */
+Addr VG_(brk_limit) =3D 0; /* current brk */
=20
Addr VG_(shadow_base); /* tool's shadow memory */
Addr VG_(shadow_end);
Modified: branches/ASPACEM/coregrind/m_main.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
--- branches/ASPACEM/coregrind/m_main.c 2005-09-12 09:39:37 UTC (rev 4623=
)
+++ branches/ASPACEM/coregrind/m_main.c 2005-09-12 10:14:16 UTC (rev 4624=
)
@@ -760,6 +760,37 @@
return client_SP;
}
=20
+
+/* Allocate the client data segment. It is an expandable anonymous
+ mapping abutting a shrinkable reservation of size max_dseg_size.
+ The data segment starts at VG_(brk_base), which is page-aligned,
+ and runs up to VG_(brk_limit), which isn't. */
+static void setup_client_dataseg ( SizeT max_size )
+{
+ Bool ok;
+ SysRes sres;
+ SizeT anon_size =3D VKI_PAGE_SIZE;
+ SizeT resvn_size =3D max_size - anon_size;
+ Addr anon_start =3D VG_(brk_base);
+ Addr resvn_start =3D anon_start + anon_size;
+
+ vg_assert(VG_IS_PAGE_ALIGNED(anon_size));
+ vg_assert(VG_IS_PAGE_ALIGNED(resvn_size));
+ vg_assert(VG_IS_PAGE_ALIGNED(anon_start));
+ vg_assert(VG_IS_PAGE_ALIGNED(resvn_start));
+
+ ok =3D VG_(create_reservation)( resvn_start, resvn_size, SmLower, ano=
n_size );
+ vg_assert(ok);
+ sres =3D VG_(mmap_anon_fixed_client)(=20
+ (void*)anon_start, anon_size,=20
+ VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC=20
+ );
+ vg_assert(!sres.isError);
+ vg_assert(sres.val =3D=3D anon_start);
+}
+
+
+
/*=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=3D*/
/*=3D=3D=3D Find executable =
=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=3D=3D=3D=3D*/
@@ -873,7 +904,7 @@
=20
/* Copy necessary bits of 'info' that were filled in */
*client_eip =3D info->init_eip;
- VG_(brk_base) =3D VG_(brk_limit) =3D info->brkbase;
+ VG_(brk_base) =3D VG_(brk_limit) =3D VG_PGROUNDUP(info->brkbase);
}
=20
=20
@@ -2266,13 +2297,14 @@
// p: fix_environment() [for 'env']
//--------------------------------------------------------------
VG_(debugLog)(1, "main", "Setup client stack\n");
- { void* init_sp =3D argv - 1;
-
- SizeT one_meg =3D 1024 * 1024;
- SizeT eight_megs =3D 8 * one_meg;
+ {=20
+ void* init_sp =3D argv - 1;
+ SizeT m1 =3D 1024 * 1024;
+ SizeT m8 =3D 8 * m1;
SizeT stack_max_size =3D (SizeT)VG_(client_rlimit_stack).rlim_cur;
- if (stack_max_size < one_meg) stack_max_size =3D one_meg;
- if (stack_max_size > eight_megs) stack_max_size =3D eight_megs;
+ if (stack_max_size < m1) stack_max_size =3D m1;
+ if (stack_max_size > m8) stack_max_size =3D m8;
+ stack_max_size =3D VG_PGROUNDUP(stack_max_size);
=20
initial_client_SP
=3D setup_client_stack( init_sp, cl_argv, env, &info,
@@ -2288,6 +2320,23 @@
(void*)initial_client_SP, vg_argc,=20
(void*)VG_(brk_base) );
=20
+ //--------------------------------------------------------------
+ // Setup client data (brk) segment. Initially a 1-page segment
+ // which abuts a shrinkable reservation.=20
+ // p: load_client() [for 'info' and hence VG_(brk_base)]
+ //setup_client_dataseg();
+ VG_(debugLog)(1, "main", "Setup client data (brk) segment\n");
+ {=20
+ SizeT m1 =3D 1024 * 1024;
+ SizeT m8 =3D 8 * m1;
+ SizeT dseg_max_size =3D (SizeT)VG_(client_rlimit_data).rlim_cur;
+ if (dseg_max_size < m1) dseg_max_size =3D m1;
+ if (dseg_max_size > m8) dseg_max_size =3D m8;
+ dseg_max_size =3D VG_PGROUNDUP(dseg_max_size);
+
+ setup_client_dataseg( dseg_max_size );
+ }
+
//=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
// Finished setting up operating environment. Now initialise
// Valgrind. (This is where the old VG_(main)() started.)
Modified: branches/ASPACEM/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
--- branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-12 09:=
39:37 UTC (rev 4623)
+++ branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-12 10:=
14:16 UTC (rev 4624)
@@ -783,7 +783,23 @@
Data seg end, for brk()
------------------------------------------------------------------ */
=20
-static Addr do_brk(Addr newbrk)
+/* +--------+------------+
+ | anon | resvn |
+ +--------+------------+
+
+ ^ ^ ^
+ | | boundary is page aligned
+ | VG_(brk_limit) -- no alignment constraint
+ VG_(brk_base) -- page aligned -- does not move
+
+ Both the anon part and the reservation part are always at least
+ one page. =20
+*/
+
+/* Set the new data segment end to NEWBRK. If this succeeds, return
+ NEWBRK, else return the current data segment end. */
+
+static Addr do_brk ( Addr newbrk )
{
Addr ret =3D VG_(brk_limit);
static const Bool debug =3D False;
@@ -799,9 +815,12 @@
if (0) show_segments("in_brk");
# endif
=20
- if (newbrk < VG_(brk_base) || newbrk >=3D VG_(client_end))
+ if (newbrk < VG_(brk_base))
+ /* Clearly impossible. */
return VG_(brk_limit);
=20
+vg_assert(0);
+
/* brk isn't allowed to grow over anything else */
seg =3D VG_(find_segment)(VG_(brk_limit) -1);
=20
|