--- /dev/null
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=libucontext
+PKG_VERSION:=1.2
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=https://codeload.github.com/kaniini/libucontext/tar.gz/v$(PKG_VERSION)?
+PKG_HASH:=2657e087c493263e7bbbde152a5bc08ce22dc5a7970887ac4fd251b90b58401f
+
+PKG_MAINTAINER:=Volker Christian <me@vchrist.at>
+PKG_LICENSE:=ISC
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_BUILD_FLAGS:=no-mips16
+PKG_BUILD_PARALLEL:=1
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/meson.mk
+
+define Package/libucontext
+ SECTION:=libs
+ CATEGORY:=Libraries
+ TITLE:=libucontext is a library which provides the ucontext.h C API
+ URL:=https://github.com/kaniini/libucontext
+ DEPENDS:=@USE_MUSL
+endef
+
+define Package/libucontext-tests
+ SECTION:=utils
+ CATEGORY:=Utilities
+ TITLE:=Test applications for libucontext
+ URL:=https://github.com/kaniini/libucontext
+ DEPENDS:=libucontext
+endef
+
+define Package/libucontext/description
+ Thie package is a development package aimed to be linked to
+ libraries/applications which need the SYS-V ucontext API.
+endef
+
+define Build/InstallDev
+ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
+ $(CP) $(PKG_INSTALL_DIR)/usr/include/libucontext $(1)/usr/include/
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libucontext* $(1)/usr/lib/
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libucontext.pc $(1)/usr/lib/pkgconfig/
+endef
+
+define Package/libucontext/install
+ $(INSTALL_DIR) $(1)/usr/lib
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libucontext*.so.* $(1)/usr/lib/
+endef
+
+define Package/libucontext-tests/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(INSTALL_BIN) $(MESON_BUILD_DIR)/test_libucontext_posix $(1)/usr/bin/
+ $(INSTALL_BIN) $(MESON_BUILD_DIR)/test_libucontext $(1)/usr/bin/
+endef
+
+$(eval $(call BuildPackage,libucontext))
+$(eval $(call BuildPackage,libucontext-tests))
--- /dev/null
+--- a/test_libucontext.c
++++ b/test_libucontext.c
+@@ -9,6 +9,9 @@
+ #include <string.h>
+ #include <libucontext/libucontext.h>
+
++#define handle_error(msg) \
++ do { perror(msg); exit(EXIT_FAILURE); } while (0)
++
+ static libucontext_ucontext_t ctx[3];
+
+
+@@ -36,7 +39,8 @@ static void f1 (int a, int b, int c, int
+ printf("looks like all arguments are passed correctly\n");
+
+ printf("swap back to f2\n");
+- libucontext_swapcontext(&ctx[1], &ctx[2]);
++ if (libucontext_swapcontext(&ctx[1], &ctx[2]) != 0)
++ handle_error("libucontext_swapcontext");
+ printf("finish f1\n");
+ }
+
+@@ -44,7 +48,8 @@ static void f1 (int a, int b, int c, int
+ static void f2 (void) {
+ printf("start f2\n");
+ printf("swap to f1\n");
+- libucontext_swapcontext(&ctx[2], &ctx[1]);
++ if (libucontext_swapcontext(&ctx[2], &ctx[1]) != 0)
++ handle_error("libucontext_swapcontext");
+ printf("finish f2, should swap to f1\n");
+ }
+
+@@ -63,7 +68,8 @@ int main (int argc, const char *argv[])
+ printf("setting up context 1\n");
+
+
+- libucontext_getcontext(&ctx[1]);
++ if (libucontext_getcontext(&ctx[1]) != 0)
++ handle_error("libucontext_getcontext");
+ ctx[1].uc_stack.ss_sp = st1;
+ ctx[1].uc_stack.ss_size = sizeof st1;
+ ctx[1].uc_link = &ctx[0];
+@@ -83,16 +89,20 @@ int main (int argc, const char *argv[])
+ printf("doing initial swapcontext\n");
+
+
+- libucontext_swapcontext(&ctx[0], &ctx[2]);
++ if (libucontext_swapcontext(&ctx[0], &ctx[2]) != 0)
++ handle_error("libucontext_swapcontext");
+
+
+ printf("returned from initial swapcontext\n");
+
+
+ /* test ability to use getcontext/setcontext without makecontext */
+- libucontext_getcontext(&ctx[1]);
++ if (libucontext_getcontext(&ctx[1]) != 0)
++ handle_error("libucontext_getcontext");
+ printf("done = %d\n", done);
+- if (done++ == 0) libucontext_setcontext(&ctx[1]);
++ if (done++ == 0)
++ if (libucontext_setcontext(&ctx[1]) != 0)
++ handle_error("libucontext_setcontext");
+ if (done != 2) {
+ fprintf(stderr, "wrong value for done. got %d, expected 2\n", done);
+ abort();
+--- a/test_libucontext_posix.c
++++ b/test_libucontext_posix.c
+@@ -9,6 +9,9 @@
+ #include <string.h>
+ #include <ucontext.h>
+
++#define handle_error(msg) \
++ do { perror(msg); exit(EXIT_FAILURE); } while (0)
++
+ static ucontext_t ctx[3];
+
+
+@@ -36,7 +39,8 @@ static void f1 (int a, int b, int c, int
+ printf("looks like all arguments are passed correctly\n");
+
+ printf("swap back to f2\n");
+- swapcontext(&ctx[1], &ctx[2]);
++ if (swapcontext(&ctx[1], &ctx[2]) != 0)
++ handle_error("swapcontext");
+ printf("finish f1\n");
+ }
+
+@@ -44,7 +48,8 @@ static void f1 (int a, int b, int c, int
+ static void f2 (void) {
+ printf("start f2\n");
+ printf("swap to f1\n");
+- swapcontext(&ctx[2], &ctx[1]);
++ if (swapcontext(&ctx[2], &ctx[1]) != 0)
++ handle_error("swapcontext");
+ printf("finish f2, should swap to f1\n");
+ }
+
+@@ -83,16 +88,19 @@ int main (int argc, const char *argv[])
+ printf("doing initial swapcontext\n");
+
+
+- swapcontext(&ctx[0], &ctx[2]);
+-
++ if (swapcontext(&ctx[0], &ctx[2]) != 0)
++ handle_error("swapcontext");
+
+ printf("returned from initial swapcontext\n");
+
+
+ /* test ability to use getcontext/setcontext without makecontext */
+- getcontext(&ctx[1]);
++ if (getcontext(&ctx[1]) != 0)
++ handle_error("getcontext");
+ printf("done = %d\n", done);
+- if (done++ == 0) setcontext(&ctx[1]);
++ if (done++ == 0)
++ if (setcontext(&ctx[1]) != 0)
++ handle_error("setcontext");
+ if (done != 2) {
+ fprintf(stderr, "wrong value for done. got %d, expected 2\n", done);
+ abort();