[libc] Special case sniffing of thread start args for riscv.
authorSiva Chandra <sivachandra@google.com>
Sun, 12 Mar 2023 08:31:03 +0000 (08:31 +0000)
committerSiva Chandra <sivachandra@google.com>
Mon, 13 Mar 2023 07:29:35 +0000 (07:29 +0000)
libc/src/__support/threads/linux/thread.cpp

index c0bbd3d..e9b95ee 100644 (file)
@@ -116,12 +116,15 @@ __attribute__((always_inline)) inline uintptr_t get_start_args_addr() {
          // on to the stack. So, we have to step past two 64-bit values to get
          // to the start args.
          + sizeof(uintptr_t) * 2;
-#elif defined(LIBC_TARGET_ARCH_IS_AARCH64) ||                                  \
-    defined(LIBC_TARGET_ARCH_IS_RISCV64)
+#elif defined(LIBC_TARGET_ARCH_IS_AARCH64)
   // The frame pointer after cloning the new thread in the Thread::run method
   // is set to the stack pointer where start args are stored. So, we fetch
   // from there.
   return reinterpret_cast<uintptr_t>(__builtin_frame_address(1));
+#elif defined(LIBC_TARGET_ARCH_IS_RISCV64)
+  // The current frame pointer is the previous stack pointer where the start
+  // args are stored.
+  return reinterpret_cast<uintptr_t>(__builtin_frame_address(0));
 #endif
 }