|
From: <sv...@va...> - 2005-05-07 17:57:46
|
Author: tom
Date: 2005-05-07 18:57:39 +0100 (Sat, 07 May 2005)
New Revision: 3628
Modified:
trunk/coregrind/m_sigframe/sigframe-amd64-linux.c
trunk/coregrind/m_sigframe/sigframe-x86-linux.c
trunk/coregrind/vg_signals.c
Log:
Rework signal stack handling to avoid doing arithmetic on void pointers
and to avoid trashing the red zone while delivering a signal on the main
stack on amd64 systems.
Modified: trunk/coregrind/m_sigframe/sigframe-amd64-linux.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/coregrind/m_sigframe/sigframe-amd64-linux.c 2005-05-07 12:16:45=
UTC (rev 3627)
+++ trunk/coregrind/m_sigframe/sigframe-amd64-linux.c 2005-05-07 17:57:39=
UTC (rev 3628)
@@ -404,7 +404,8 @@
=20
/* For tracking memory events, indicate the entire frame has been
allocated. */
- VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, size )=
;
+ VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE,
+ size + VGA_STACK_REDZONE_SIZE );
=20
return True;
}
@@ -600,7 +601,8 @@
=20
size =3D restore_rt_sigframe(tst, (struct rt_sigframe *)rsp, &sigNo);
=20
- VG_TRACK( die_mem_stack_signal, rsp - VGA_STACK_REDZONE_SIZE, size );
+ VG_TRACK( die_mem_stack_signal, rsp - VGA_STACK_REDZONE_SIZE,
+ size + VGA_STACK_REDZONE_SIZE );
=20
if (VG_(clo_trace_signals))
VG_(message)(
Modified: trunk/coregrind/m_sigframe/sigframe-x86-linux.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/coregrind/m_sigframe/sigframe-x86-linux.c 2005-05-07 12:16:45 U=
TC (rev 3627)
+++ trunk/coregrind/m_sigframe/sigframe-x86-linux.c 2005-05-07 17:57:39 U=
TC (rev 3628)
@@ -425,7 +425,8 @@
=20
/* For tracking memory events, indicate the entire frame has been
allocated. */
- VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, size )=
;
+ VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE,
+ size + VGA_STACK_REDZONE_SIZE );
=20
return True;
}
@@ -682,7 +683,8 @@
else
size =3D restore_rt_sigframe(tst, (struct rt_sigframe *)esp, &sigN=
o);
=20
- VG_TRACK( die_mem_stack_signal, esp - VGA_STACK_REDZONE_SIZE, size );
+ VG_TRACK( die_mem_stack_signal, esp - VGA_STACK_REDZONE_SIZE,
+ size + VGA_STACK_REDZONE_SIZE );
=20
if (VG_(clo_trace_signals))
VG_(message)(
Modified: trunk/coregrind/vg_signals.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/coregrind/vg_signals.c 2005-05-07 12:16:45 UTC (rev 3627)
+++ trunk/coregrind/vg_signals.c 2005-05-07 17:57:39 UTC (rev 3628)
@@ -474,10 +474,6 @@
VG_(threads)[tid].altstack.ss_sp =3D ss->ss_sp;
VG_(threads)[tid].altstack.ss_size =3D ss->ss_size;
VG_(threads)[tid].altstack.ss_flags =3D 0;
-
- VG_TRACK( new_mem_stack_signal,
- ss->ss_sp + ss->ss_size - VGA_STACK_REDZONE_SIZE,
- VGA_STACK_REDZONE_SIZE );
}
}
SET_SYSCALL_RETVAL(tid, 0);
@@ -809,7 +805,7 @@
VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True );
=20
} else {
- esp_top_of_frame =3D STACK_PTR(tst->arch);
+ esp_top_of_frame =3D STACK_PTR(tst->arch) - VGA_STACK_REDZONE_SIZE=
;
=20
/* Signal delivery to tools */
VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );
|