diff options
author | Carlos O'Donell <carlos@redhat.com> | 2014-03-05 00:11:01 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2014-03-13 20:38:27 -0400 |
commit | 2e03fae7b711b87733f8c897cb42ea74d2dc156a (patch) | |
tree | ca1bc47286ee3ce91a2805c72f554bf9f338fc7e /nptl | |
parent | 43ca83ecc482f34e002d5f0accfb4a7cef471e4a (diff) | |
download | glibc-2e03fae7b711b87733f8c897cb42ea74d2dc156a.zip glibc-2e03fae7b711b87733f8c897cb42ea74d2dc156a.tar.gz glibc-2e03fae7b711b87733f8c897cb42ea74d2dc156a.tar.bz2 |
hppa: Add _STACK_GROWS_* cases to pthread_attr_[sg]etstack.
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?).
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/pthread_attr_getstack.c | 4 | ||||
-rw-r--r-- | nptl/pthread_attr_setstack.c | 8 |
2 files changed, 12 insertions, 0 deletions
diff --git a/nptl/pthread_attr_getstack.c b/nptl/pthread_attr_getstack.c index 3f4fd8d..0e245a0 100644 --- a/nptl/pthread_attr_getstack.c +++ b/nptl/pthread_attr_getstack.c @@ -32,7 +32,11 @@ __pthread_attr_getstack (attr, stackaddr, stacksize) iattr = (struct pthread_attr *) attr; /* Store the result. */ +#if _STACK_GROWS_DOWN *stackaddr = (char *) iattr->stackaddr - iattr->stacksize; +#else + *stackaddr = (char *) iattr->stackaddr; +#endif *stacksize = iattr->stacksize; return 0; diff --git a/nptl/pthread_attr_setstack.c b/nptl/pthread_attr_setstack.c index 19a5b54..4785501 100644 --- a/nptl/pthread_attr_setstack.c +++ b/nptl/pthread_attr_setstack.c @@ -48,7 +48,11 @@ __pthread_attr_setstack (attr, stackaddr, stacksize) #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; @@ -81,7 +85,11 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr, # 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; |