This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi!
This patch changes IA-64 to use FLOATING_STACKS.
I had to tweak pthread_allocate_stack a little bit for this.
Glibc builds with this just fine on IA-64 and passes make check too (on
07-09 checkout, so test-gencat fails but that has been fixed since then and
is unrelated).
I think Alpha/Sparc32/Sparc64 could turn FLOATING_STACKS too, it will just
need testing (but IMHO it should just work there).
2001-07-19 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/useldt.h: Fix typo in ARCH_STACK_MAX_SIZE comment.
* sysdeps/ia64/pt-machine.h (FLOATING_STACKS): New.
(ARCH_STACK_MAX_SIZE): New.
* manager.c (pthread_allocate_stack): Handle FLOATING_STACKS with
NEED_SEPARATE_REGISTER_STACK.
--- libc/linuxthreads/sysdeps/i386/useldt.h.jj Wed Apr 25 06:07:51 2001
+++ libc/linuxthreads/sysdeps/i386/useldt.h Thu Jul 19 09:00:17 2001
@@ -201,5 +201,5 @@ extern int __modify_ldt (int, struct mod
/* We want the OS to assign stack addresses. */
#define FLOATING_STACKS 1
-/* Maximum size o fthe stack if the rlimit is unlimited. */
+/* Maximum size of the stack if the rlimit is unlimited. */
#define ARCH_STACK_MAX_SIZE 8*1024*1024
--- libc/linuxthreads/sysdeps/ia64/pt-machine.h.jj Mon Jan 8 12:58:35 2001
+++ libc/linuxthreads/sysdeps/ia64/pt-machine.h Thu Jul 19 09:01:18 2001
@@ -31,6 +31,12 @@
#define NEED_SEPARATE_REGISTER_STACK
+/* We want the OS to assign stack addresses. */
+#define FLOATING_STACKS 1
+
+/* Maximum size of the stack if the rlimit is unlimited. */
+#define ARCH_STACK_MAX_SIZE 32*1024*1024
+
/* Get some notion of the current stack. Need not be exactly the top
of the stack, just something somewhere in the current frame.
r12 (sp) is the stack pointer. */
--- libc/linuxthreads/manager.c.jj Mon Jun 25 07:31:17 2001
+++ libc/linuxthreads/manager.c Thu Jul 19 11:12:38 2001
@@ -353,7 +353,53 @@ static int pthread_allocate_stack(const
void *map_addr;
/* Allocate space for stack and thread descriptor at default address */
-#ifdef NEED_SEPARATE_REGISTER_STACK
+#if FLOATING_STACKS
+ if (attr != NULL)
+ {
+ guardsize = page_roundup (attr->__guardsize, granularity);
+ stacksize = __pthread_max_stacksize - guardsize;
+ stacksize = MIN (stacksize,
+ page_roundup (attr->__stacksize, granularity));
+ }
+ else
+ {
+ guardsize = granularity;
+ stacksize = __pthread_max_stacksize - guardsize;
+ }
+
+ map_addr = mmap(NULL, stacksize + guardsize,
+ PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (map_addr == MAP_FAILED)
+ /* No more memory available. */
+ return -1;
+
+# ifdef NEED_SEPARATE_REGISTER_STACK
+ guardaddr = map_addr + stacksize / 2;
+ if (guardsize > 0)
+ mprotect (guardaddr, guardsize, PROT_NONE);
+
+ new_thread_bottom = (char *) map_addr;
+ new_thread = ((pthread_descr) (new_thread_bottom + stacksize
+ + guardsize)) - 1;
+# elif _STACK_GROWS_DOWN
+ guardaddr = map_addr;
+ if (guardsize > 0)
+ mprotect (guardaddr, guardsize, PROT_NONE);
+
+ new_thread_bottom = (char *) map_addr + guardsize;
+ new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
+# elif _STACK_GROWS_UP
+ guardaddr = map_addr + stacksize;
+ if (guardsize > 0)
+ mprotect (guardaddr, guardsize, PROT_NONE);
+
+ new_thread = (pthread_descr) map_addr;
+ new_thread_bottom = (char *) (new_thread + 1);
+# else
+# error You must define a stack direction
+# endif /* Stack direction */
+#else /* !FLOATING_STACKS */
void *res_addr;
if (attr != NULL)
@@ -369,6 +415,7 @@ static int pthread_allocate_stack(const
stacksize = STACK_SIZE - granularity;
}
+# ifdef NEED_SEPARATE_REGISTER_STACK
new_thread = default_new_thread;
new_thread_bottom = (char *) (new_thread + 1) - stacksize - guardsize;
/* Includes guard area, unlike the normal case. Use the bottom
@@ -379,8 +426,6 @@ static int pthread_allocate_stack(const
in the same region. The cost is that we might be able to map
slightly fewer stacks. */
- /* XXX Fix for floating stacks with variable sizes. */
-
/* First the main stack: */
map_addr = (caddr_t)((char *)(new_thread + 1) - stacksize / 2);
res_addr = mmap(map_addr, stacksize / 2,
@@ -409,61 +454,7 @@ static int pthread_allocate_stack(const
guardaddr = new_thread_bottom + stacksize/2;
/* We leave the guard area in the middle unmapped. */
-#else /* !NEED_SEPARATE_REGISTER_STACK */
-# if FLOATING_STACKS
- if (attr != NULL)
- {
- guardsize = page_roundup (attr->__guardsize, granularity);
- stacksize = __pthread_max_stacksize - guardsize;
- stacksize = MIN (stacksize,
- page_roundup (attr->__stacksize, granularity));
- }
- else
- {
- guardsize = granularity;
- stacksize = __pthread_max_stacksize - guardsize;
- }
-
- map_addr = mmap(NULL, stacksize + guardsize,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (map_addr == MAP_FAILED)
- /* No more memory available. */
- return -1;
-
-# ifdef _STACK_GROWS_DOWN
- guardaddr = map_addr;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
- new_thread_bottom = (char *) map_addr + guardsize;
- new_thread = ((pthread_descr) (new_thread_bottom + stacksize)) - 1;
-# elif _STACK_GROWS_UP
- guardaddr = map_addr + stacksize;
- if (guardsize > 0)
- mprotect (guardaddr, guardsize, PROT_NONE);
-
- new_thread = (pthread_descr) map_addr;
- new_thread_bottom = (char *) (new_thread + 1);
-# else
-# error You must define a stack direction
-# endif /* Stack direction */
-# else /* !FLOATING_STACKS */
- void *res_addr;
-
- if (attr != NULL)
- {
- guardsize = page_roundup (attr->__guardsize, granularity);
- stacksize = STACK_SIZE - guardsize;
- stacksize = MIN (stacksize,
- page_roundup (attr->__stacksize, granularity));
- }
- else
- {
- guardsize = granularity;
- stacksize = STACK_SIZE - granularity;
- }
-
+# else /* !NEED_SEPARATE_REGISTER_STACK */
# ifdef _STACK_GROWS_DOWN
new_thread = default_new_thread;
new_thread_bottom = (char *) (new_thread + 1) - stacksize;
@@ -501,8 +492,8 @@ static int pthread_allocate_stack(const
mprotect (guardaddr, guardsize, PROT_NONE);
# endif /* stack direction */
-# endif
-#endif /* !NEED_SEPARATE_REGISTER_STACK */
+# endif /* !NEED_SEPARATE_REGISTER_STACK */
+#endif /* !FLOATING_STACKS */
}
*out_new_thread = new_thread;
*out_new_thread_bottom = new_thread_bottom;
Jakub
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |