|
From: <sv...@va...> - 2006-01-18 04:16:31
|
Author: sewardj
Date: 2006-01-18 04:16:27 +0000 (Wed, 18 Jan 2006)
New Revision: 5545
Log:
Valgrind-side handling (fast case) for the ppc64 ELF stack redzone.
Modified:
trunk/memcheck/mc_main.c
Modified: trunk/memcheck/mc_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
--- trunk/memcheck/mc_main.c 2006-01-18 04:15:42 UTC (rev 5544)
+++ trunk/memcheck/mc_main.c 2006-01-18 04:16:27 UTC (rev 5545)
@@ -1006,6 +1006,7 @@
any attempt to access it will elicit an addressing error,
and that's good enough.
*/
+ /* 128 bytes (16 ULongs) is the magic value for ELF amd64. */
if (EXPECTED_TAKEN( len =3D=3D 128
&& VG_IS_8_ALIGNED(base)=20
)) {
@@ -1050,7 +1051,74 @@
}
}
=20
+ /* 288 bytes (36 ULongs) is the magic value for ELF ppc64. */
+ if (EXPECTED_TAKEN( len =3D=3D 288
+ && VG_IS_8_ALIGNED(base)=20
+ )) {
+ /* Now we know the address range is suitably sized and
+ aligned. */
+ UWord a_lo =3D (UWord)base;
+ UWord a_hi =3D (UWord)(base + 287);
+ UWord sec_lo =3D a_lo >> 16;
+ UWord sec_hi =3D a_hi >> 16;
+
+ if (EXPECTED_TAKEN( sec_lo =3D=3D sec_hi=20
+ && sec_lo <=3D N_PRIMARY_MAP
+ )) {
+ /* Now we know that the entire address range falls within a
+ single secondary map, and that that secondary 'lives' in
+ the main primary map. */
+ SecMap* sm =3D primary_map[sec_lo];
+
+ if (EXPECTED_TAKEN( !is_distinguished_sm(sm) )) {
+ /* And finally, now we know that the secondary in question
+ is modifiable. */
+ UWord v_off =3D a_lo & 0xFFFF;
+ ULong* p =3D (ULong*)(&sm->vbyte[v_off]);
+ p[ 0] =3D VGM_WORD64_INVALID;
+ p[ 1] =3D VGM_WORD64_INVALID;
+ p[ 2] =3D VGM_WORD64_INVALID;
+ p[ 3] =3D VGM_WORD64_INVALID;
+ p[ 4] =3D VGM_WORD64_INVALID;
+ p[ 5] =3D VGM_WORD64_INVALID;
+ p[ 6] =3D VGM_WORD64_INVALID;
+ p[ 7] =3D VGM_WORD64_INVALID;
+ p[ 8] =3D VGM_WORD64_INVALID;
+ p[ 9] =3D VGM_WORD64_INVALID;
+ p[10] =3D VGM_WORD64_INVALID;
+ p[11] =3D VGM_WORD64_INVALID;
+ p[12] =3D VGM_WORD64_INVALID;
+ p[13] =3D VGM_WORD64_INVALID;
+ p[14] =3D VGM_WORD64_INVALID;
+ p[15] =3D VGM_WORD64_INVALID;
+ p[16] =3D VGM_WORD64_INVALID;
+ p[17] =3D VGM_WORD64_INVALID;
+ p[18] =3D VGM_WORD64_INVALID;
+ p[19] =3D VGM_WORD64_INVALID;
+ p[20] =3D VGM_WORD64_INVALID;
+ p[21] =3D VGM_WORD64_INVALID;
+ p[22] =3D VGM_WORD64_INVALID;
+ p[23] =3D VGM_WORD64_INVALID;
+ p[24] =3D VGM_WORD64_INVALID;
+ p[25] =3D VGM_WORD64_INVALID;
+ p[26] =3D VGM_WORD64_INVALID;
+ p[27] =3D VGM_WORD64_INVALID;
+ p[28] =3D VGM_WORD64_INVALID;
+ p[29] =3D VGM_WORD64_INVALID;
+ p[30] =3D VGM_WORD64_INVALID;
+ p[31] =3D VGM_WORD64_INVALID;
+ p[32] =3D VGM_WORD64_INVALID;
+ p[33] =3D VGM_WORD64_INVALID;
+ p[34] =3D VGM_WORD64_INVALID;
+ p[35] =3D VGM_WORD64_INVALID;
+ return;
+ }
+ }
+ }
+
/* else fall into slow case */
+ if (0) VG_(printf)("MC_(helperc_MAKE_STACK_UNINIT): "
+ "slow case, %d\n", len);
mc_make_writable(base, len);
}
=20
|