10258f566SSiva Chandra Reddy //===-- Implementation of the pthread_attr_setstack -----------------===// 20258f566SSiva Chandra Reddy // 30258f566SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40258f566SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 50258f566SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60258f566SSiva Chandra Reddy // 70258f566SSiva Chandra Reddy //===----------------------------------------------------------------------===// 80258f566SSiva Chandra Reddy 90258f566SSiva Chandra Reddy #include "pthread_attr_setstack.h" 106a185718SNoah Goldstein #include "pthread_attr_setstacksize.h" 110258f566SSiva Chandra Reddy 120258f566SSiva Chandra Reddy #include "src/__support/common.h" 135ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 146a185718SNoah Goldstein #include "src/__support/threads/thread.h" // For STACK_ALIGNMENT 15*46944b0cSJob Henandez Lara #include "src/errno/libc_errno.h" 160258f566SSiva Chandra Reddy 170258f566SSiva Chandra Reddy #include <pthread.h> 180258f566SSiva Chandra Reddy #include <stdint.h> 190258f566SSiva Chandra Reddy 205ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 210258f566SSiva Chandra Reddy 220258f566SSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, pthread_attr_setstack, 230258f566SSiva Chandra Reddy (pthread_attr_t *__restrict attr, void *stack, 240258f566SSiva Chandra Reddy size_t stacksize)) { 256a185718SNoah Goldstein uintptr_t stackaddr = reinterpret_cast<uintptr_t>(stack); 266a185718SNoah Goldstein // TODO: Do we need to check for overflow on stackaddr + stacksize? 276a185718SNoah Goldstein if ((stackaddr % STACK_ALIGNMENT != 0) || 286a185718SNoah Goldstein ((stackaddr + stacksize) % STACK_ALIGNMENT != 0)) 296a185718SNoah Goldstein return EINVAL; 306a185718SNoah Goldstein 310258f566SSiva Chandra Reddy if (stacksize < PTHREAD_STACK_MIN) 320258f566SSiva Chandra Reddy return EINVAL; 336a185718SNoah Goldstein 340258f566SSiva Chandra Reddy attr->__stack = stack; 350258f566SSiva Chandra Reddy attr->__stacksize = stacksize; 360258f566SSiva Chandra Reddy return 0; 370258f566SSiva Chandra Reddy } 380258f566SSiva Chandra Reddy 395ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 40