Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision 5c4356b5f3f4cd3beea6f5bb4dc3ed4422fe8dd5)
+++ kernel/arch/ia32/src/mm/frame.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -47,4 +47,5 @@
 
 #define PHYSMEM_LIMIT32  UINT64_C(0x100000000)
+#define PHYSMEM_LIMIT_DMA   UINT64_C(0x1000000)
 
 size_t hardcoded_unmapped_ktext_size = 0;
@@ -91,11 +92,26 @@
 				else
 					conf = minconf;
-				zone_create(pfn, count, conf,
-				    ZONE_AVAILABLE | ZONE_LOWMEM);
+
+				if ((pfn * PAGE_SIZE) < PHYSMEM_LIMIT_DMA) {
+					size_t dma_count = min(
+					    PHYSMEM_LIMIT_DMA / PAGE_SIZE - pfn,
+					    count);
+					zone_create(pfn, dma_count, conf,
+					    ZONE_AVAILABLE | ZONE_DMA);
+					count -= dma_count;
+					pfn += dma_count;
+				}
+
+				conf = pfn;
+				if (count) {
+					zone_create(pfn, count, conf,
+					    ZONE_AVAILABLE | ZONE_LOWMEM);
+				}
 			} else {
 				conf = zone_external_conf_alloc(count);
-				if (conf != 0)
+				if (conf != 0) {
 					zone_create(pfn, count, conf,
 					    ZONE_AVAILABLE | ZONE_HIGHMEM);
+				}
 			}
 		} else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) ||
Index: kernel/generic/include/mm/frame.h
===================================================================
--- kernel/generic/include/mm/frame.h	(revision 5c4356b5f3f4cd3beea6f5bb4dc3ed4422fe8dd5)
+++ kernel/generic/include/mm/frame.h	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -63,4 +63,6 @@
 /** Allocate a frame which cannot be identity-mapped. */
 #define FRAME_HIGHMEM	  0x20
+/** Allocate a frame which needs to be from DMA zone. */
+#define FRAME_DMA         0x40
 
 typedef uint8_t zone_flags_t;
@@ -77,4 +79,6 @@
 /** Zone contains memory that cannot be identity-mapped */
 #define ZONE_HIGHMEM	0x10
+/** Zone contains memory suitable for old ISA DMA */
+#define ZONE_DMA        0x20
 
 /** Mask of zone bits that must be matched exactly. */
@@ -82,8 +86,9 @@
 
 #define FRAME_TO_ZONE_FLAGS(ff)	\
-	((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
+	((((ff) & FRAME_DMA) ? ZONE_DMA : \
+	    (((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
 	    (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \
-	    ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \
-	    ZONE_AVAILABLE) 
+	    ZONE_LOWMEM /* | ZONE_HIGHMEM */))) | \
+	    ZONE_AVAILABLE)
 
 #define ZONE_FLAGS_MATCH(zf, f) \
Index: kernel/generic/include/time/clock.h
===================================================================
--- kernel/generic/include/time/clock.h	(revision 5c4356b5f3f4cd3beea6f5bb4dc3ed4422fe8dd5)
+++ kernel/generic/include/time/clock.h	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -38,5 +38,5 @@
 #include <typedefs.h>
 
-#define HZ  100
+#define HZ  1000
 
 /** Uptime structure */
Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision 5c4356b5f3f4cd3beea6f5bb4dc3ed4422fe8dd5)
+++ kernel/generic/src/ddi/ddi.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -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 5c4356b5f3f4cd3beea6f5bb4dc3ed4422fe8dd5)
+++ kernel/generic/src/mm/frame.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -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);
