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");
    }