#include <stdio.h>
char stack[0x10000] __attribute__((aligned(16))) = {0};
void test(void *ctx) {
printf("%s\n", (const char*)ctx);
}
void call_with_new_stack(void* sp, void (*fn)(void*), const void* ctx)
{
asm volatile(
"xchg %%rsp, %%rdi\n\t" //
"sub $8, %%rsp\n\t"
"push %%rdi\n\t"
"mov %%rdx, %%rdi\n\t"
"call *%%rsi\n\t"
"pop %%rsp\n\t"
: : "D"(sp), "S"(fn), "d"(ctx) : "memory"
);
}
int main() {
call_with_new_stack(stack + sizeof(stack), &test, "Hello, world!");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjaGFyIHN0YWNrWzB4MTAwMDBdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7MH07Cgp2b2lkIHRlc3Qodm9pZCAqY3R4KSB7CiAgICBwcmludGYoIiVzXG4iLCAoY29uc3QgY2hhciopY3R4KTsKfQoKdm9pZCBjYWxsX3dpdGhfbmV3X3N0YWNrKHZvaWQqIHNwLCB2b2lkICgqZm4pKHZvaWQqKSwgY29uc3Qgdm9pZCogY3R4KQp7CiAgICBhc20gdm9sYXRpbGUoCiAgICAgICAgInhjaGcgJSVyc3AsICUlcmRpXG5cdCIgIC8vIAogICAgICAgICJzdWIgJDgsICUlcnNwXG5cdCIKICAgICAgICAicHVzaCAlJXJkaVxuXHQiCiAgICAgICAgIm1vdiAlJXJkeCwgJSVyZGlcblx0IgogICAgICAgICJjYWxsIColJXJzaVxuXHQiCiAgICAgICAgInBvcCAlJXJzcFxuXHQiCiAgICAgICAgOiA6ICJEIihzcCksICJTIihmbiksICJkIihjdHgpIDogIm1lbW9yeSIKICAgICk7Cn0KCmludCBtYWluKCkgewogICAgY2FsbF93aXRoX25ld19zdGFjayhzdGFjayArIHNpemVvZihzdGFjayksICZ0ZXN0LCAiSGVsbG8sIHdvcmxkISIpOwogICAgcmV0dXJuIDA7Cn0K