In message <20140902161525.8c4f9270f04841ecb0670...@sinenomine.net>,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 OpenAFS-devel@openafs.org https://lists.openafs.org/mailman/listinfo/openafs-devel