diff --git a/libc/src/__support/threads/linux/thread.cpp b/libc/src/__support/threads/linux/thread.cpp index c0bbd3d77e885..e9b95eed99a58 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 }