mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-09 04:11:27 +08:00
2e03fae7b7
This is one of a several NPTL patches to build glibc on hppa. The pthread_attr_[sg]etstack functions are defined by POSIX as taking a stackaddr that is the lowest addressable byte of the storage used for the stack. However, the internal iattr variable of the same name in NPTL is actually the final stack address as usable in the stack pointer for the machine. Therefore the NPTL implementation must add and subtract stacksize for _STACK_GROWS_DOWN architectures. HPPA is a _STACK_GROWS_UP architecture and doesn't need to add or subtract anything, the stack address *is* the lowest addressable byte of the storage. Tested on hppa-linux-gnu, with no regressions. Can't impact any other targets because of the conditionals. If nobody objects I'll check this in at the end of the week. I can't see there being any objections to this patch except that it introduces more code to maintain for an old architecture (perhaps we'll get another _S_G_U target in the future?).
103 lines
2.5 KiB
C
103 lines
2.5 KiB
C
/* Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <limits.h>
|
|
#include "pthreadP.h"
|
|
|
|
|
|
#ifndef NEW_VERNUM
|
|
# define NEW_VERNUM GLIBC_2_3_3
|
|
#endif
|
|
|
|
|
|
int
|
|
__pthread_attr_setstack (attr, stackaddr, stacksize)
|
|
pthread_attr_t *attr;
|
|
void *stackaddr;
|
|
size_t stacksize;
|
|
{
|
|
struct pthread_attr *iattr;
|
|
|
|
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
iattr = (struct pthread_attr *) attr;
|
|
|
|
/* Catch invalid sizes. */
|
|
int ret = check_stacksize_attr (stacksize);
|
|
if (ret)
|
|
return ret;
|
|
|
|
#ifdef EXTRA_PARAM_CHECKS
|
|
EXTRA_PARAM_CHECKS;
|
|
#endif
|
|
|
|
iattr->stacksize = stacksize;
|
|
#if _STACK_GROWS_DOWN
|
|
iattr->stackaddr = (char *) stackaddr + stacksize;
|
|
#else
|
|
iattr->stackaddr = (char *) stackaddr;
|
|
#endif
|
|
iattr->flags |= ATTR_FLAG_STACKADDR;
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if PTHREAD_STACK_MIN == 16384
|
|
strong_alias (__pthread_attr_setstack, pthread_attr_setstack)
|
|
#else
|
|
# include <shlib-compat.h>
|
|
versioned_symbol (libpthread, __pthread_attr_setstack, pthread_attr_setstack,
|
|
NEW_VERNUM);
|
|
|
|
# if SHLIB_COMPAT(libpthread, GLIBC_2_2, NEW_VERNUM)
|
|
|
|
int
|
|
__old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
|
|
size_t stacksize)
|
|
{
|
|
struct pthread_attr *iattr;
|
|
|
|
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
|
|
iattr = (struct pthread_attr *) attr;
|
|
|
|
/* Catch invalid sizes. */
|
|
if (stacksize < 16384)
|
|
return EINVAL;
|
|
|
|
# ifdef EXTRA_PARAM_CHECKS
|
|
EXTRA_PARAM_CHECKS;
|
|
# endif
|
|
|
|
iattr->stacksize = stacksize;
|
|
#if _STACK_GROWS_DOWN
|
|
iattr->stackaddr = (char *) stackaddr + stacksize;
|
|
#else
|
|
iattr->stackaddr = (char *) stackaddr;
|
|
#endif
|
|
iattr->flags |= ATTR_FLAG_STACKADDR;
|
|
|
|
return 0;
|
|
}
|
|
|
|
compat_symbol (libpthread, __old_pthread_attr_setstack, pthread_attr_setstack,
|
|
GLIBC_2_2);
|
|
# endif
|
|
|
|
#endif
|