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)