From c1bb7108a2ffe7e6c95224c17b0ff62ccb2639f8 Mon Sep 17 00:00:00 2001 From: Siva Chandra Date: Sun, 12 Mar 2023 08:31:03 +0000 Subject: [PATCH] [libc] Special case sniffing of thread start args for riscv. --- libc/src/__support/threads/linux/thread.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libc/src/__support/threads/linux/thread.cpp b/libc/src/__support/threads/linux/thread.cpp index c0bbd3d..e9b95ee 100644 --- a/libc/src/__support/threads/linux/thread.cpp +++ b/libc/src/__support/threads/linux/thread.cpp @@ -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(__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(__builtin_frame_address(0)); #endif } -- 2.7.4