Index: kernel/arch/abs32le/include/mm/km.h
===================================================================
--- kernel/arch/abs32le/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/abs32le/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,6 +36,9 @@
 #define KERN_abs32le_KM_H_
 
+#include <typedefs.h>
+
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/abs32le/src/mm/km.c
===================================================================
--- kernel/arch/abs32le/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/abs32le/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -32,4 +32,5 @@
 
 #include <arch/mm/km.h>
+#include <typedefs.h>
 
 void km_identity_arch_init(void)
@@ -41,4 +42,9 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return false;
+}
+
 /** @}
  */
Index: kernel/arch/amd64/include/mm/km.h
===================================================================
--- kernel/arch/amd64/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/amd64/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_amd64_KM_H_
 
+#include <typedefs.h>
+
 #define KM_AMD64_IDENTITY_START		UINT64_C(0xffff800000000000)
 #define KM_AMD64_IDENTITY_SIZE		UINT64_C(0x0000400000000000)
@@ -44,4 +46,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/amd64/src/mm/km.c
===================================================================
--- kernel/arch/amd64/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/amd64/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_AMD64_NON_IDENTITY_START,
+	    KM_AMD64_NON_IDENTITY_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/arm32/include/mm/km.h
===================================================================
--- kernel/arch/arm32/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/arm32/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_arm32_KM_H_
 
+#include <typedefs.h>
+
 #define KM_ARM32_IDENTITY_START		UINT32_C(0x80000000)
 #define KM_ARM32_IDENTITY_SIZE		UINT32_C(0x40000000)
@@ -44,4 +46,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/arm32/src/mm/km.c
===================================================================
--- kernel/arch/arm32/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/arm32/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_ARM32_NON_IDENTITY_START,
+	    KM_ARM32_NON_IDENTITY_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/ia32/include/mm/km.h
===================================================================
--- kernel/arch/ia32/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ia32/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_ia32_KM_H_
 
+#include <typedefs.h>
+
 #define KM_IA32_IDENTITY_START		UINT32_C(0x80000000)
 #define KM_IA32_IDENTITY_SIZE		UINT32_C(0x40000000)
@@ -44,4 +46,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/ia32/src/mm/km.c
===================================================================
--- kernel/arch/ia32/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ia32/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_IA32_NON_IDENTITY_START, KM_IA32_NON_IDENTITY_SIZE,
+	    addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/ia64/include/mm/km.h
===================================================================
--- kernel/arch/ia64/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ia64/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_ia64_KM_H_
 
+#include <typedefs.h>
+
 /*
  * Be conservative and assume the minimal (3 + 51)-bit virtual address width
@@ -50,4 +52,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/ia64/src/mm/km.c
===================================================================
--- kernel/arch/ia64/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ia64/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_IA64_NON_IDENTITY_START, KM_IA64_NON_IDENTITY_SIZE,
+	    addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/mips32/include/mm/km.h
===================================================================
--- kernel/arch/mips32/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/mips32/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_mips32_KM_H_
 
+#include <typedefs.h>
+
 #define KM_MIPS32_KSEG0_START	UINT32_C(0x80000000)
 #define KM_MIPS32_KSEG0_SIZE	UINT32_C(0x20000000)
@@ -47,4 +49,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/mips32/src/mm/km.c
===================================================================
--- kernel/arch/mips32/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/mips32/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_MIPS32_KSSEG_START, KM_MIPS32_KSSEG_SIZE, addr, 1)
+	    || iswithin(KM_MIPS32_KSEG3_START, KM_MIPS32_KSEG3_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/mips64/include/mm/km.h
===================================================================
--- kernel/arch/mips64/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/mips64/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,6 +36,9 @@
 #define KERN_mips64_KM_H_
 
+#include <typedefs.h>
+
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/mips64/src/mm/km.c
===================================================================
--- kernel/arch/mips64/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/mips64/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -32,4 +32,5 @@
 
 #include <arch/mm/km.h>
+#include <typedefs.h>
 
 void km_identity_arch_init(void)
@@ -41,4 +42,9 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return false;
+}
+
 /** @}
  */
Index: kernel/arch/ppc32/include/mm/km.h
===================================================================
--- kernel/arch/ppc32/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ppc32/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_ppc32_KM_H_
 
+#include <typedefs.h>
+
 #define KM_PPC32_IDENTITY_START		UINT32_C(0x80000000)
 #define KM_PPC32_IDENTITY_SIZE		UINT32_C(0x40000000)
@@ -44,4 +46,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/ppc32/src/mm/km.c
===================================================================
--- kernel/arch/ppc32/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/ppc32/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_PPC32_NON_IDENTITY_START,
+	    KM_PPC32_NON_IDENTITY_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/sparc64/include/mm/sun4u/km.h
===================================================================
--- kernel/arch/sparc64/include/mm/sun4u/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/sparc64/include/mm/sun4u/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_sparc64_sun4u_KM_H_
 
+#include <typedefs.h>
+
 /*
  * Be conservative and assume the 44-bit virtual address width as found
@@ -53,4 +55,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/sparc64/include/mm/sun4v/km.h
===================================================================
--- kernel/arch/sparc64/include/mm/sun4v/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/sparc64/include/mm/sun4v/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -36,4 +36,6 @@
 #define KERN_sparc64_sun4v_KM_H_
 
+#include <typedefs.h>
+
 /*
  * Do not use the 4 GiB area on either side of the VA hole to meet the
@@ -49,4 +51,5 @@
 extern void km_identity_arch_init(void);
 extern void km_non_identity_arch_init(void);
+extern bool km_is_non_identity_arch(uintptr_t);
 
 #endif
Index: kernel/arch/sparc64/src/mm/sun4u/km.c
===================================================================
--- kernel/arch/sparc64/src/mm/sun4u/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/sparc64/src/mm/sun4u/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_SPARC64_US_NON_IDENTITY_START,
+	    KM_SPARC64_US_NON_IDENTITY_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/arch/sparc64/src/mm/sun4v/km.c
===================================================================
--- kernel/arch/sparc64/src/mm/sun4v/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/arch/sparc64/src/mm/sun4v/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -34,4 +34,6 @@
 #include <mm/km.h>
 #include <config.h>
+#include <typedefs.h>
+#include <macros.h>
 
 void km_identity_arch_init(void)
@@ -47,4 +49,10 @@
 }
 
+bool km_is_non_identity_arch(uintptr_t addr)
+{
+	return iswithin(KM_SPARC64_T1_NON_IDENTITY_START,
+	    KM_SPARC64_T1_NON_IDENTITY_SIZE, addr, 1);
+}
+
 /** @}
  */
Index: kernel/generic/include/mm/km.h
===================================================================
--- kernel/generic/include/mm/km.h	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/generic/include/mm/km.h	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -46,4 +46,6 @@
 extern void km_page_free(uintptr_t, size_t);
 
+extern bool km_is_non_identity(uintptr_t);
+
 #endif
 
Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision 464a52fb3f84550859625f9698a1bfc98e9127e0)
+++ kernel/generic/src/mm/km.c	(revision 1b478f661c486eaaf171a6561c652459502ed22f)
@@ -61,4 +61,9 @@
 }
 
+bool km_is_non_identity(uintptr_t addr)
+{
+	return km_is_non_identity_arch(addr);
+}
+
 void km_non_identity_span_add(uintptr_t base, size_t size)
 {
