pw_thread: Add missing top-of-stack value in thread stack snapshot

Change-Id: Ibcda63cc31871af4d8c4c4902ea683b759c72d8f
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/123490
Reviewed-by: RJ Ascani <rjascani@google.com>
Pigweed-Auto-Submit: Harish Kulkarni <harishsk@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Reviewed-by: Armando Montanez <amontanez@google.com>
diff --git a/pw_thread/public/pw_thread/thread_info.h b/pw_thread/public/pw_thread/thread_info.h
index 8d3275c..e18ebe5 100644
--- a/pw_thread/public/pw_thread/thread_info.h
+++ b/pw_thread/public/pw_thread/thread_info.h
@@ -52,6 +52,16 @@
 
   void clear_stack_high_addr() { clear_stack_info_ptr(kStackHighAddress); }
 
+  constexpr std::optional<uintptr_t> stack_pointer() const {
+    return get_stack_info_ptr(kStackPointer);
+  }
+
+  void set_stack_pointer(uintptr_t val) {
+    set_stack_info_ptr(kStackPointer, val);
+  }
+
+  void clear_stack_pointer() { clear_stack_info_ptr(kStackPointer); }
+
   constexpr std::optional<uintptr_t> stack_peak_addr() const {
     return get_stack_info_ptr(kStackPeakAddress);
   }
@@ -78,6 +88,7 @@
   enum ThreadInfoIndex {
     kStackLowAddress,
     kStackHighAddress,
+    kStackPointer,
     kStackPeakAddress,
     kThreadName,
     kMaxNumMembersDoNotUse,
diff --git a/pw_thread/thread_snapshot_service.cc b/pw_thread/thread_snapshot_service.cc
index c6a4450..63a94c6 100644
--- a/pw_thread/thread_snapshot_service.cc
+++ b/pw_thread/thread_snapshot_service.cc
@@ -50,6 +50,11 @@
     // Need stack start pointer to contextualize estimated peak.
     return Status::FailedPrecondition();
   }
+  if (thread_info.stack_pointer().has_value()) {
+    PW_TRY(
+        proto_encoder.WriteStackPointer(thread_info.stack_pointer().value()));
+  }
+
   if (thread_info.stack_peak_addr().has_value()) {
     PW_TRY(proto_encoder.WriteStackPointerEstPeak(
         thread_info.stack_peak_addr().value()));
diff --git a/pw_thread_freertos/thread_iteration.cc b/pw_thread_freertos/thread_iteration.cc
index b300879..0d0691d 100644
--- a/pw_thread_freertos/thread_iteration.cc
+++ b/pw_thread_freertos/thread_iteration.cc
@@ -37,6 +37,8 @@
       as_bytes(span(std::string_view(tcb.pcTaskName)));
   thread_info.set_thread_name(current_name);
 
+  thread_info.set_stack_pointer(reinterpret_cast<uintptr_t>(tcb.pxTopOfStack));
+
   // Current thread stack bounds.
   thread_info.set_stack_low_addr(reinterpret_cast<uintptr_t>(tcb.pxStack));
 #if configRECORD_STACK_HIGH_ADDRESS