Module Name: src
Committed By: uebayasi
Date: Wed Feb 10 08:12:02 UTC 2010
Modified Files:
src/sys/uvm [uebayasi-xip]: uvm_km.c uvm_km.h
Log Message:
Initial attempt to implement uvm_pageofzero_xip(), which returns a pointer
to a single read-only zeroed page. This is meant to be used for XIP now.
Only compile tested.
To generate a diff of this commit:
cvs rdiff -u -r1.104 -r1.104.2.1 src/sys/uvm/uvm_km.c
cvs rdiff -u -r1.18 -r1.18.6.1 src/sys/uvm/uvm_km.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.104 src/sys/uvm/uvm_km.c:1.104.2.1
--- src/sys/uvm/uvm_km.c:1.104 Sat Nov 7 07:27:49 2009
+++ src/sys/uvm/uvm_km.c Wed Feb 10 08:12:02 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_km.c,v 1.104 2009/11/07 07:27:49 cegger Exp $ */
+/* $NetBSD: uvm_km.c,v 1.104.2.1 2010/02/10 08:12:02 uebayasi Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -128,15 +128,17 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.104 2009/11/07 07:27:49 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.104.2.1 2010/02/10 08:12:02 uebayasi Exp $");
#include "opt_uvmhist.h"
+#include "opt_xip.h"
#include <sys/param.h>
#include <sys/malloc.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/pool.h>
+#include <sys/once.h>
#include <uvm/uvm.h>
@@ -793,3 +795,50 @@
uvm_km_free(map, addr, PAGE_SIZE, UVM_KMF_WIRED);
#endif /* PMAP_UNMAP_POOLPAGE */
}
+
+#ifdef XIP
+/*
+ * uvm_pageofzero_xip: return a read-only page filled with zeroes.
+ *
+ * XXXUEBS Need better names.
+ */
+
+static void *uvm_pageofzero_xip_vaddr;
+static paddr_t uvm_pageofzero_xip_paddr;
+static int uvm_pageofzero_xip_init(void);
+
+void *
+uvm_pageofzero_xip(void)
+{
+ static ONCE_DECL(uvm_pageofzero_xip_inited);
+
+ RUN_ONCE(&uvm_pageofzero_xip_inited, uvm_pageofzero_xip_init);
+ return uvm_pageofzero_xip_vaddr;
+}
+
+paddr_t
+uvm_pageofzero_xip_phys_addr(void)
+{
+ static ONCE_DECL(uvm_pageofzero_xip_inited);
+
+ RUN_ONCE(&uvm_pageofzero_xip_inited, uvm_pageofzero_xip_init);
+ return uvm_pageofzero_xip_paddr;
+}
+
+static int
+uvm_pageofzero_xip_init(void)
+{
+ bool rv;
+
+ ASSERT_SLEEPABLE();
+
+ uvm_pageofzero_xip_vaddr = (void *)uvm_km_alloc_poolpage(kernel_map, true);
+ KASSERT(uvm_pageofzero_xip_vaddr != NULL);
+
+ rv = pmap_extract(pmap_kernel(), (vaddr_t)uvm_pageofzero_xip_vaddr,
+ &uvm_pageofzero_xip_paddr);
+ KASSERT(rv == true && uvm_pageofzero_xip_paddr != 0);
+
+ return 0;
+}
+#endif
Index: src/sys/uvm/uvm_km.h
diff -u src/sys/uvm/uvm_km.h:1.18 src/sys/uvm/uvm_km.h:1.18.6.1
--- src/sys/uvm/uvm_km.h:1.18 Mon Dec 1 10:54:57 2008
+++ src/sys/uvm/uvm_km.h Wed Feb 10 08:12:02 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_km.h,v 1.18 2008/12/01 10:54:57 ad Exp $ */
+/* $NetBSD: uvm_km.h,v 1.18.6.1 2010/02/10 08:12:02 uebayasi Exp $ */
/*
*
@@ -57,6 +57,11 @@
#endif /* defined(DEBUG) */
void uvm_km_va_drain(struct vm_map *, uvm_flag_t);
+#ifdef XIP
+void *uvm_pageofzero_xip(void);
+paddr_t uvm_pageofzero_xip_phys_addr(void);
+#endif
+
#endif /* _KERNEL */
#endif /* _UVM_UVM_KM_H_ */