From: Dirk Mueller Date: Mon, 15 Jul 2002 19:39:51 +0000 (+0000) Subject: possible fix for valgrinding problem on longer running kernels (2.4.18-SuSE, update... X-Git-Tag: svn/VALGRIND_1_0_3~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=157ebdd5b0d2b622ff50a575112269f30ea6ef40;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/coregrind/vg_include.h b/coregrind/vg_include.h index 40506c126b..31ba8e9215 100644 --- a/coregrind/vg_include.h +++ b/coregrind/vg_include.h @@ -788,10 +788,12 @@ extern Int VG_(longjmpd_on_signal); 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 1095aa5122..95e772c0c1 100644 --- a/coregrind/vg_main.c +++ b/coregrind/vg_main.c @@ -599,6 +599,11 @@ static void process_cmd_line_options ( void ) 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 12024e0599..823c85908d 100644 --- a/coregrind/vg_scheduler.c +++ b/coregrind/vg_scheduler.c @@ -565,13 +565,15 @@ void VG_(scheduler_init) ( void ) 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 40506c126b..31ba8e9215 100644 --- a/vg_include.h +++ b/vg_include.h @@ -788,10 +788,12 @@ extern Int VG_(longjmpd_on_signal); 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 1095aa5122..95e772c0c1 100644 --- a/vg_main.c +++ b/vg_main.c @@ -599,6 +599,11 @@ static void process_cmd_line_options ( void ) 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 12024e0599..823c85908d 100644 --- a/vg_scheduler.c +++ b/vg_scheduler.c @@ -565,13 +565,15 @@ void VG_(scheduler_init) ( void ) 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"); }