possible fix for valgrinding problem on longer running kernels (2.4.18-SuSE, update 17 days)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@506 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_include.h b/coregrind/vg_include.h
index 40506c1..31ba8e9 100644
--- a/coregrind/vg_include.h
+++ b/coregrind/vg_include.h
@@ -788,10 +788,12 @@
the initial stack, which we can't move, is allocated here.
VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
have been rumoured to start stacks at 0x80000000, so that too is
- considered.
+ considered. It seems systems with longer uptimes tend to to use
+ stacks which start at 0x40000000 sometimes.
*/
#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
+#define VG_STARTUP_STACK_BASE_3 (Addr)0x40000000
#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
diff --git a/coregrind/vg_main.c b/coregrind/vg_main.c
index 1095aa5..95e772c 100644
--- a/coregrind/vg_main.c
+++ b/coregrind/vg_main.c
@@ -599,6 +599,11 @@
if (VG_STACK_MATCHES_BASE( VG_(esp_at_startup),
VG_STARTUP_STACK_BASE_2 )) {
sp = (UInt*)VG_STARTUP_STACK_BASE_2;
+ } else
+ if (VG_STACK_MATCHES_BASE( VG_(esp_at_startup),
+ VG_STARTUP_STACK_BASE_3 )) {
+ sp = (UInt*)VG_STARTUP_STACK_BASE_3;
+
} else {
args_grok_error(
"startup %esp is not near any VG_STARTUP_STACK_BASE_*\n "
diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c
index 12024e0..823c859 100644
--- a/coregrind/vg_scheduler.c
+++ b/coregrind/vg_scheduler.c
@@ -565,13 +565,15 @@
startup_esp = VG_(baseBlock)[VGOFF_(m_esp)];
if (VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_1)
- || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_2)) {
+ || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_2)
+ || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_3)) {
/* Jolly good! */
} else {
- VG_(printf)("%%esp at startup = %p is not near %p or %p; aborting\n",
+ VG_(printf)("%%esp at startup = %p is not near %p, %p or %p; aborting\n",
(void*)startup_esp,
(void*)VG_STARTUP_STACK_BASE_1,
- (void*)VG_STARTUP_STACK_BASE_2 );
+ (void*)VG_STARTUP_STACK_BASE_2,
+ (void*)VG_STARTUP_STACK_BASE_3 );
VG_(panic)("unexpected %esp at startup");
}
diff --git a/vg_include.h b/vg_include.h
index 40506c1..31ba8e9 100644
--- a/vg_include.h
+++ b/vg_include.h
@@ -788,10 +788,12 @@
the initial stack, which we can't move, is allocated here.
VG_(scheduler_init) checks this. Andrea Archelangi's 2.4 kernels
have been rumoured to start stacks at 0x80000000, so that too is
- considered.
+ considered. It seems systems with longer uptimes tend to to use
+ stacks which start at 0x40000000 sometimes.
*/
#define VG_STARTUP_STACK_BASE_1 (Addr)0xC0000000
#define VG_STARTUP_STACK_BASE_2 (Addr)0x80000000
+#define VG_STARTUP_STACK_BASE_3 (Addr)0x40000000
#define VG_STARTUP_STACK_SMALLERTHAN 0x100000 /* 1024k */
#define VG_STACK_MATCHES_BASE(zzstack, zzbase) \
diff --git a/vg_main.c b/vg_main.c
index 1095aa5..95e772c 100644
--- a/vg_main.c
+++ b/vg_main.c
@@ -599,6 +599,11 @@
if (VG_STACK_MATCHES_BASE( VG_(esp_at_startup),
VG_STARTUP_STACK_BASE_2 )) {
sp = (UInt*)VG_STARTUP_STACK_BASE_2;
+ } else
+ if (VG_STACK_MATCHES_BASE( VG_(esp_at_startup),
+ VG_STARTUP_STACK_BASE_3 )) {
+ sp = (UInt*)VG_STARTUP_STACK_BASE_3;
+
} else {
args_grok_error(
"startup %esp is not near any VG_STARTUP_STACK_BASE_*\n "
diff --git a/vg_scheduler.c b/vg_scheduler.c
index 12024e0..823c859 100644
--- a/vg_scheduler.c
+++ b/vg_scheduler.c
@@ -565,13 +565,15 @@
startup_esp = VG_(baseBlock)[VGOFF_(m_esp)];
if (VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_1)
- || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_2)) {
+ || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_2)
+ || VG_STACK_MATCHES_BASE(startup_esp, VG_STARTUP_STACK_BASE_3)) {
/* Jolly good! */
} else {
- VG_(printf)("%%esp at startup = %p is not near %p or %p; aborting\n",
+ VG_(printf)("%%esp at startup = %p is not near %p, %p or %p; aborting\n",
(void*)startup_esp,
(void*)VG_STARTUP_STACK_BASE_1,
- (void*)VG_STARTUP_STACK_BASE_2 );
+ (void*)VG_STARTUP_STACK_BASE_2,
+ (void*)VG_STARTUP_STACK_BASE_3 );
VG_(panic)("unexpected %esp at startup");
}