mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
2003-09-23 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions [libc] (GLIBC_2.3.3): Add setcontext, getcontext, swapcontext, and makecontext. * sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Correct change for include Altivec support for PPC32. It was not compatible. * sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h: Adjust offsets for ucontext_t change. * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S: Adjust for ucontext_t change. Add compatibility code. * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S: Likewise. Patch by Paul Mackerras <paulus@samba.org>. 2003-02-25 Randolph Chung <tausq@debian.org> * sysdeps/hppa/Makefile: Include compat code in build. * sysdeps/hppa/libgcc-compat.c: New file. * sysdeps/hppa/Dist: Add libgcc-compat.c. * sysdeps/hppa/Versions [GLIBC_2.2]: Add __clz_tab.
This commit is contained in:
@ -351,11 +351,12 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Allocate some anonymous memory. If possible use the
|
||||
cache. */
|
||||
/* Allocate some anonymous memory. If possible use the cache. */
|
||||
size_t guardsize;
|
||||
size_t reqsize;
|
||||
void *mem;
|
||||
const int prot = (PROT_READ | PROT_WRITE
|
||||
| ((GL(dl_stack_flags) & PF_X) ? PROT_EXEC : 0));
|
||||
|
||||
#if COLORING_INCREMENT != 0
|
||||
/* Add one more page for stack coloring. Don't do it for stacks
|
||||
@ -392,7 +393,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
|
||||
size += pagesize_m1 + 1;
|
||||
#endif
|
||||
|
||||
mem = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
mem = mmap (NULL, size, prot,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | ARCH_MAP_FLAGS, -1, 0);
|
||||
|
||||
if (__builtin_expect (mem == MAP_FAILED, 0))
|
||||
@ -546,17 +547,16 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
|
||||
char *oldguard = mem + (((size - pd->guardsize) / 2) & ~pagesize_m1);
|
||||
|
||||
if (oldguard < guard
|
||||
&& mprotect (oldguard, guard - oldguard,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
|
||||
&& mprotect (oldguard, guard - oldguard, prot) != 0)
|
||||
goto mprot_error;
|
||||
|
||||
if (mprotect (guard + guardsize,
|
||||
oldguard + pd->guardsize - guard - guardsize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
|
||||
prot) != 0)
|
||||
goto mprot_error;
|
||||
#else
|
||||
if (mprotect ((char *) mem + guardsize, pd->guardsize - guardsize,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
|
||||
prot) != 0)
|
||||
goto mprot_error;
|
||||
#endif
|
||||
|
||||
@ -616,6 +616,45 @@ __deallocate_stack (struct pthread *pd)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
internal_function
|
||||
__make_stacks_executable (void)
|
||||
{
|
||||
#ifdef NEED_SEPARATE_REGISTER_STACK
|
||||
const size_t pagemask = ~(__getpagesize () - 1);
|
||||
#endif
|
||||
|
||||
lll_lock (stack_cache_lock);
|
||||
|
||||
int err = 0;
|
||||
list_t *runp;
|
||||
list_for_each (runp, &stack_used)
|
||||
{
|
||||
struct pthread *const pd = list_entry (runp, struct pthread, list);
|
||||
#ifdef NEED_SEPARATE_REGISTER_STACK
|
||||
void *stack = (pd->stackblock
|
||||
+ (((((pd->stackblock_size - pd->guardsize) / 2)
|
||||
& pagemask) + pd->guardsize) & pagemask));
|
||||
size_t len = pd->stackblock + pd->stackblock_size - stack;
|
||||
#else
|
||||
void *stack = pd->stackblock + pd->guardsize;
|
||||
size_t len = pd->stackblock_size - pd->guardsize;
|
||||
#endif
|
||||
if (mprotect (stack, len, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
|
||||
{
|
||||
err = errno;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lll_unlock (stack_cache_lock);
|
||||
|
||||
_dl_make_stack_executable ();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* In case of a fork() call the memory allocation in the child will be
|
||||
the same but only one thread is running. All stacks except that of
|
||||
the one running thread are not used anymore. We have to recycle
|
||||
|
Reference in New Issue
Block a user