Index: kernel/generic/include/mm/frame.h
===================================================================
--- kernel/generic/include/mm/frame.h	(revision e6a6c02954a45ba875ec2de8c72742d0183240e7)
+++ kernel/generic/include/mm/frame.h	(revision 8bdcffa853c11b32f7445df1a38ecc63fec8d0e3)
@@ -163,4 +163,5 @@
 extern void frame_mark_unavailable(pfn_t, size_t);
 extern size_t zone_conf_size(size_t);
+extern pfn_t zone_external_conf_alloc(size_t);
 extern bool zone_merge(size_t, size_t);
 extern void zone_merge_all(void);
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision e6a6c02954a45ba875ec2de8c72742d0183240e7)
+++ kernel/generic/src/mm/frame.c	(revision 8bdcffa853c11b32f7445df1a38ecc63fec8d0e3)
@@ -865,4 +865,13 @@
 {
 	return (count * sizeof(frame_t) + buddy_conf_size(fnzb(count)));
+}
+
+/** Allocate external configuration frames from low memory. */
+pfn_t zone_external_conf_alloc(size_t count)
+{
+	size_t size = zone_conf_size(count);
+	size_t order = ispwr2(size) ? fnzb(size) : (fnzb(size) + 1);
+
+	return ADDR2PFN((uintptr_t) frame_alloc(order, FRAME_LOWMEM));
 }
 
