--- src/lib/dde_rump/src/sys/rump/librump/rumpkern/rump_private.h
+++ src/lib/dde_rump/src/sys/rump/librump/rumpkern/rump_private.h
@@ -70,6 +70,9 @@
 	RUMP__FACTION_NET,
 
 	RUMP_COMPONENT_MAX,
+
+	/* alias for syscall type used to create ctor symbol */
+	RUMP_COMPONENT_KERN_SYSCALL = RUMP_COMPONENT_SYSCALL,
 };
 struct rump_component {
 	enum rump_component_type rc_type;
@@ -86,8 +89,7 @@
 
 #ifdef RUMP_USE_CTOR
 #define _RUMP_COMPONENT_REGISTER(type)					\
-static void rumpcomp_ctor##type(void) __attribute__((constructor));	\
-static void rumpcomp_ctor##type(void)					\
+void rumpcompctor_##type(void)						\
 {									\
 	rump_component_load(&rumpcomp##type);				\
 }
--- src/lib/dde_rump/src/sys/rump/librump/rumpkern/rumpkern_syscalls.c
+++ src/lib/dde_rump/src/sys/rump/librump/rumpkern/rumpkern_syscalls.c
@@ -147,7 +147,7 @@
 	{ 477,	sys_clock_nanosleep },
 };
 
-RUMP_COMPONENT(RUMP_COMPONENT_SYSCALL)
+RUMP_COMPONENT(RUMP_COMPONENT_KERN_SYSCALL)
 {
 
 	rump_syscall_boot_establish(mysys, __arraycount(mysys));
--- src/lib/dde_rump/src/sys/rump/librump/rumpvfs/vm_vfs.c
+++ src/lib/dde_rump/src/sys/rump/librump/rumpvfs/vm_vfs.c
@@ -49,6 +49,7 @@
 	struct vm_page **pgs;
 	vaddr_t va;
 	int pageout = 0;
+	bool const write = BUF_ISWRITE(bp);
 
 	KASSERT(npages > 0);
 	pgs = kmem_alloc(npages * sizeof(*pgs), KM_SLEEP);
@@ -64,8 +65,47 @@
 			KASSERT(uobj == pgs[i]->uobject);
 		}
 
+		if (bp->b_error) {
+			if (!write) {
+				pgs[i]->flags |= PG_RELEASED;
+				continue;
+			} else if (bp->b_error == ENOMEM) {
+				if (pgs[i]->flags & PG_PAGEOUT) {
+					pageout++;
+					pgs[i]->flags &= ~PG_PAGEOUT;
+				}
+				pgs[i]->flags &= ~PG_CLEAN;
+
+				mutex_enter(&uvm_pageqlock);
+				uvm_pageactivate(pgs[i]);
+				mutex_exit(&uvm_pageqlock);
+			}
+		}
+
+		/*
+		 * if the page is PG_FAKE, this must have been a read to
+		 * initialize the page.  clear PG_FAKE and activate the page.
+		 * we must also clear the pmap "modified" flag since it may
+		 * still be set from the page's previous identity.
+		 */
+
+		if ((pgs[i]->flags & PG_FAKE)) {
+			KASSERT(!write);
+			pgs[i]->flags &= ~PG_FAKE;
+			KASSERT((pgs[i]->flags & PG_CLEAN) != 0);
+
+#if defined(READAHEAD_STATS)
+			pgs[i]->pqflags |= PQ_READAHEAD;
+			uvm_ra_total.ev_count++;
+#endif /* defined(READAHEAD_STATS) */
+
+			mutex_enter(&uvm_pageqlock);
+			uvm_pageenqueue(pgs[i]);
+			pmap_clear_modify(pgs[i]);
+			mutex_exit(&uvm_pageqlock);
+		}
+
 		if (pgs[i]->flags & PG_PAGEOUT) {
-			KASSERT((pgs[i]->flags & PG_FAKE) == 0);
 			pageout++;
 			pgs[i]->flags &= ~PG_PAGEOUT;
 			pgs[i]->flags |= PG_RELEASED;
@@ -81,7 +121,7 @@
 	uvm_pagermapout((vaddr_t)bp->b_data, npages);
 	uvm_pageout_done(pageout);
 
-	if (BUF_ISWRITE(bp) && (bp->b_cflags & BC_AGE) != 0) {
+	if (write && (bp->b_cflags & BC_AGE) != 0) {
 		mutex_enter(bp->b_objlock);
 		vwakeup(bp);
 		mutex_exit(bp->b_objlock);
--- src/lib/dde_rump/src/sys/sys/module.h
+++ src/lib/dde_rump/src/sys/sys/module.h
@@ -114,8 +114,7 @@
 };
 LIST_HEAD(modinfo_boot_chain, modinfo_chain);
 #define _MODULE_REGISTER(name)						\
-static void modctor_##name(void) __attribute__((constructor));		\
-static void modctor_##name(void)					\
+void modctor_##name(void)						\
 {									\
 	static struct modinfo_chain mc = {				\
 		.mc_info = &name##_modinfo,				\