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