1*0258f566SSiva Chandra Reddy //===-- Implementation of the pthread_attr_setstack -----------------===// 2*0258f566SSiva Chandra Reddy // 3*0258f566SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0258f566SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5*0258f566SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0258f566SSiva Chandra Reddy // 7*0258f566SSiva Chandra Reddy //===----------------------------------------------------------------------===// 8*0258f566SSiva Chandra Reddy 9*0258f566SSiva Chandra Reddy #include "pthread_attr_setstack.h" 10*0258f566SSiva Chandra Reddy 11*0258f566SSiva Chandra Reddy #include "src/__support/common.h" 12*0258f566SSiva Chandra Reddy 13*0258f566SSiva Chandra Reddy #include <errno.h> 14*0258f566SSiva Chandra Reddy #include <linux/param.h> // For EXEC_PAGESIZE. 15*0258f566SSiva Chandra Reddy #include <pthread.h> 16*0258f566SSiva Chandra Reddy #include <stdint.h> 17*0258f566SSiva Chandra Reddy 18*0258f566SSiva Chandra Reddy namespace __llvm_libc { 19*0258f566SSiva Chandra Reddy 20*0258f566SSiva Chandra Reddy LLVM_LIBC_FUNCTION(int, pthread_attr_setstack, 21*0258f566SSiva Chandra Reddy (pthread_attr_t *__restrict attr, void *stack, 22*0258f566SSiva Chandra Reddy size_t stacksize)) { 23*0258f566SSiva Chandra Reddy if (stacksize < PTHREAD_STACK_MIN) 24*0258f566SSiva Chandra Reddy return EINVAL; 25*0258f566SSiva Chandra Reddy uintptr_t stackaddr = reinterpret_cast<uintptr_t>(stack); 26*0258f566SSiva Chandra Reddy if ((stackaddr % 16 != 0) || ((stackaddr + stacksize) % 16 != 0)) 27*0258f566SSiva Chandra Reddy return EINVAL; 28*0258f566SSiva Chandra Reddy attr->__stack = stack; 29*0258f566SSiva Chandra Reddy attr->__stacksize = stacksize; 30*0258f566SSiva Chandra Reddy return 0; 31*0258f566SSiva Chandra Reddy } 32*0258f566SSiva Chandra Reddy 33*0258f566SSiva Chandra Reddy } // namespace __llvm_libc 34