Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision e1326cf1ae3be8cc73d854a6f6e7fac37a4af1df)
+++ kernel/generic/src/ddi/ddi.c	(revision 92b59c75e99c75924f485a9b71dece3141406bb8)
@@ -336,5 +336,5 @@
 		order = fnzb(pages - 1) + 1;
 	
-	*phys = frame_alloc_noreserve(order, 0);
+	*phys = frame_alloc_noreserve(order, FRAME_DMA);
 	if (*phys == NULL)
 		return ENOMEM;
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision e1326cf1ae3be8cc73d854a6f6e7fac37a4af1df)
+++ kernel/generic/src/mm/frame.c	(revision 92b59c75e99c75924f485a9b71dece3141406bb8)
@@ -518,5 +518,7 @@
 NO_TRACE static void zone_mark_unavailable(zone_t *zone, size_t frame_idx)
 {
-	ASSERT(zone->flags & ZONE_AVAILABLE);
+	if (!(zone->flags & ZONE_AVAILABLE))
+		return;
+//	ASSERT(zone->flags & ZONE_AVAILABLE);
 	
 	frame_t *frame = zone_get_frame(zone, frame_idx);
@@ -935,6 +937,9 @@
 			}
 			
-			if (confframe >= start + count)
-				panic("Cannot find configuration data for zone.");
+			if (confframe >= start + count) {
+				flags &= ~ZONE_AVAILABLE;
+				goto nonavail;
+//				panic("Cannot find configuration data for zone.");
+			}
 		}
 		
@@ -960,5 +965,6 @@
 		return znum;
 	}
-	
+nonavail:
+	(void)0; // label trick
 	/* Non-available zone */
 	size_t znum = zones_insert_zone(start, count, flags);
