Index: kernel/generic/include/config.h
===================================================================
--- kernel/generic/include/config.h	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
+++ kernel/generic/include/config.h	(revision 40c8c17482d672e755c855c6fd5664b0e933e483)
@@ -95,4 +95,7 @@
 
 	bool non_identity_configured;   
+
+	/** End of physical memory. */
+	uint64_t physmem_end;
 } config_t;
 
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
+++ kernel/generic/src/main/main.c	(revision 40c8c17482d672e755c855c6fd5664b0e933e483)
@@ -91,5 +91,6 @@
 config_t config = {
 	.identity_configured = false,
-	.non_identity_configured = false
+	.non_identity_configured = false,
+	.physmem_end = 0
 };
 
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
+++ kernel/generic/src/mm/frame.c	(revision 40c8c17482d672e755c855c6fd5664b0e933e483)
@@ -900,4 +900,7 @@
 		 */
 		ASSERT(confframe != ADDR2PFN((uintptr_t ) NULL));
+
+		/* Update the known end of physical memory. */
+		config.physmem_end = max(config.physmem_end, PFN2ADDR(start + count));
 		
 		/* If confframe is supposed to be inside our zone, then make sure
