In message <[email protected]>,Andrew
Deason writes:
>It looks like glibc does have a getcontext/makecontext for aarch64, but
>I'm not looking into this deeply at the moment. I can verify later or
>someone else can speak up, but you can also just try it and see if it
>works :)
I have meant to fix this for a while (i.e. write a configure test).
Even though your glibc might have a ucontext that doesn't mean it works
(or works well enough). For instance, I think MacOS' (ppc only perhaps)
and Linux/ppc32's implementation are sufficiently broken but present
in glibc.
Try building and running the following. It should
/*
* this should print something like:
main: sp 0x7fff0c4ae318 alt_sp 0x136f010
main: swapcontext(&main_context, &thread_context)
thread: sp 0x1372fe0
thread: swapcontext(&thread_context, &main_context)
main: back from thread
*/
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#define STACK_SIZE 16384
static ucontext_t main_context, thread_context;
static char *alt_stack;
static void
thread(void)
{
unsigned long stack_ptr;
unsigned long offset;
printf("thread: sp %p\n", &stack_ptr);
offset = (unsigned long) &stack_ptr - (unsigned long) alt_stack;
if (offset > STACK_SIZE) {
fprintf(stderr, "failed to switch to alternate stack?\n");
exit(EXIT_FAILURE);
}
printf("thread: swapcontext(&thread_context, &main_context)\n");
if (swapcontext(&thread_context, &main_context) == -1)
perror("swapcontext");
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
unsigned long stack_ptr;
if (getcontext(&thread_context) == -1) {
perror("getcontext");
exit(EXIT_FAILURE);
}
alt_stack = malloc(STACK_SIZE);
if (!alt_stack) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("main: sp %p alt_sp %p\n", &stack_ptr, alt_stack);
thread_context.uc_stack.ss_sp = alt_stack;
thread_context.uc_stack.ss_size = STACK_SIZE;
makecontext(&thread_context, thread, 0);
printf("main: swapcontext(&main_context, &thread_context)\n");
if (swapcontext(&main_context, &thread_context) == -1) {
perror("swapcontext");
exit(EXIT_FAILURE);
}
printf("main: back from thread\n");
free(alt_stack);
exit(EXIT_SUCCESS);
}
_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel