diff --git a/libretro-common/libco/amd64.c b/libretro-common/libco/amd64.c index cd38a65534..c2d6ee0c88 100644 --- a/libretro-common/libco/amd64.c +++ b/libretro-common/libco/amd64.c @@ -146,6 +146,15 @@ cothread_t co_create(unsigned int size, void (*entrypoint)(void)) size += 512; /* allocate additional space for storage */ size &= ~15; /* align stack to 16-byte boundary */ +#ifdef __GENODE__ + if((handle = (cothread_t)genode_alloc_secondary_stack(size))) + { + long long *p = (long long*)((char*)handle); /* OS returns top of stack */ + *--p = (long long)crash; /* crash if entrypoint returns */ + *--p = (long long)entrypoint; /* start of function */ + *(long long*)handle = (long long)p; /* stack pointer */ + } +#else if((handle = (cothread_t)malloc(size))) { long long *p = (long long*)((char*)handle + size); /* seek to top of stack */ @@ -153,13 +162,18 @@ cothread_t co_create(unsigned int size, void (*entrypoint)(void)) *--p = (long long)entrypoint; /* start of function */ *(long long*)handle = (long long)p; /* stack pointer */ } +#endif return handle; } void co_delete(cothread_t handle) { +#ifdef __GENODE__ + genode_free_secondary_stack(handle); +#else free(handle); +#endif } #ifndef CO_USE_INLINE_ASM diff --git a/libretro-common/libco/genode.cpp b/libretro-common/libco/genode.cpp new file mode 100644 index 0000000000..2f2bdac52a --- /dev/null +++ b/libretro-common/libco/genode.cpp @@ -0,0 +1,29 @@ +/* + libco.genode_secondary_stack (2018-09-15) + author: Emery Hemingway + license: public domain +*/ + +/* Genode include */ +#include + +/* Libco include */ +#include + +extern "C" +void *genode_alloc_secondary_stack(unsigned long stack_size) +{ + try { + return Genode::Thread::myself()->alloc_secondary_stack("libco", stack_size); } + catch (...) { + Genode::error("libco: failed to allocate ", stack_size, " byte secondary stack"); + return nullptr; + } + +} + +extern "C" +void genode_free_secondary_stack(void *stack) +{ + Genode::Thread::myself()->free_secondary_stack(stack); +} diff --git a/libretro-common/libco/libco.c b/libretro-common/libco/libco.c index 8d6f9343b9..50b6442c4b 100644 --- a/libretro-common/libco/libco.c +++ b/libretro-common/libco/libco.c @@ -4,6 +4,11 @@ license: public domain */ +#ifdef __GENODE__ +void *genode_alloc_secondary_stack(unsigned long stack_size); +void genode_free_secondary_stack(void *stack); +#endif + #if defined _MSC_VER #include #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)