]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
drd: Process stack registration client requests
authorBart Van Assche <bvanassche@acm.org>
Sat, 20 Feb 2021 04:24:57 +0000 (20:24 -0800)
committerBart Van Assche <bvanassche@acm.org>
Sat, 20 Feb 2021 16:44:50 +0000 (08:44 -0800)
Reset stack information if the client registers a new stack

NEWS
drd/drd_main.c
drd/drd_thread.c
drd/drd_thread.h

diff --git a/NEWS b/NEWS
index c910af0f4eec7735fa0e5cc721f3931b448744d5..cdd103b01ed9d3f5030f28f9591aa883dde3b5ed 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -120,6 +120,7 @@ where XXXXXX is the bug number as listed below.
 431556  Complete arm64 FADDP v8.2 instruction support
 432102  Add support for DWARF5 as produced by GCC11
 432161  Addition of arm64 v8.2 FADDP, FNEG and FSQRT
+432381  drd: Process STACK_REGISTER client requests
 432672  vg_regtest: test-specific environment variables not reset between tests
 432809  VEX should support REX.W + POPF
 432861  PPC modsw and modsd give incorrect results for 1 mod 12
index 7873c1f9771672af07f3575df952f8ec1848304c..2f2279e52d9c0951ad8360a439aefbd509b22461 100644 (file)
@@ -629,6 +629,13 @@ static void drd_stop_using_mem_stack_signal(Addr a, SizeT len)
                       True);
 }
 
+static void drd_register_stack(Addr start, Addr end)
+{
+   DrdThreadId drd_tid = DRD_(thread_get_running_tid)();
+
+   DRD_(thread_register_stack)(drd_tid, start, end);
+}
+
 static
 void drd_pre_thread_create(const ThreadId creator, const ThreadId created)
 {
@@ -852,6 +859,7 @@ void drd_pre_clo_init(void)
    VG_(track_die_mem_munmap)       (drd_stop_using_nonstack_mem);
    VG_(track_die_mem_stack)        (drd_stop_using_mem_stack);
    VG_(track_die_mem_stack_signal) (drd_stop_using_mem_stack_signal);
+   VG_(track_register_stack)       (drd_register_stack);
    VG_(track_pre_deliver_signal)   (drd_pre_deliver_signal);
    VG_(track_post_deliver_signal)  (drd_post_deliver_signal);
    VG_(track_start_client_code)    (drd_start_client_code);
index 548c74843b0488a214380ccf77309fba53d00f5d..32064c3b152644cdfe7db7f5e15d30cbd3a2deb0 100644 (file)
@@ -431,6 +431,17 @@ void DRD_(thread_post_join)(DrdThreadId drd_joiner, DrdThreadId drd_joinee)
    DRD_(thread_delayed_delete)(drd_joinee);
 }
 
+void DRD_(thread_register_stack)(DrdThreadId tid, Addr addr1, Addr addr2)
+{
+   tl_assert(0 <= (int)tid && tid < DRD_N_THREADS
+             && tid != DRD_INVALID_THREADID);
+   tl_assert(addr1 < addr2);
+   DRD_(g_threadinfo)[tid].stack_min     = addr2;
+   DRD_(g_threadinfo)[tid].stack_min_min = addr2;
+   DRD_(g_threadinfo)[tid].stack_startup = addr2;
+   DRD_(g_threadinfo)[tid].stack_max     = addr2;
+}
+
 /**
  * NPTL hack: NPTL allocates the 'struct pthread' on top of the stack,
  * and accesses this data structure from multiple threads without locking.
index 063ae35fc90ae374de9e8192f93001a472c30bd4..0f7d783733d512d6d5f9b3ed11f0e5a66a88229a 100644 (file)
@@ -153,6 +153,7 @@ void DRD_(thread_delete)(const DrdThreadId tid, Bool detached);
 void DRD_(thread_finished)(const DrdThreadId tid);
 void DRD_(drd_thread_atfork_child)(const DrdThreadId tid);
 void DRD_(thread_pre_cancel)(const DrdThreadId tid);
+void DRD_(thread_register_stack)(DrdThreadId tid, Addr addr1, Addr addr2);
 void DRD_(thread_set_stack_startup)(const DrdThreadId tid,
                                     const Addr stack_startup);
 Addr DRD_(thread_get_stack_min)(const DrdThreadId tid);