Module Name:    src
Committed By:   jmcneill
Date:           Sun Jun 21 17:25:04 UTC 2020

Modified Files:
        src/sys/arch/aarch64/aarch64: aarch64_machdep.c
        src/sys/arch/arm/arm32: arm32_machdep.c
        src/sys/arch/arm/fdt: arm_fdt.c arm_fdtvar.h

Log Message:
Add support for installing modules that were loaded by the bootloader.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/aarch64/aarch64/aarch64_machdep.c
cvs rdiff -u -r1.134 -r1.135 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/fdt/arm_fdt.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/fdt/arm_fdtvar.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/arch/aarch64/aarch64/aarch64_machdep.c
diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.42 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.43
--- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.42	Mon Apr 13 05:40:25 2020
+++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c	Sun Jun 21 17:25:03 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.42 2020/04/13 05:40:25 maxv Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.43 2020/06/21 17:25:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.42 2020/04/13 05:40:25 maxv Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.43 2020/06/21 17:25:03 jmcneill Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_cpuoptions.h"
@@ -530,6 +530,9 @@ machdep_init(void)
 void
 module_init_md(void)
 {
+#ifdef FDT
+	arm_fdt_module_init();
+#endif
 }
 #endif /* MODULAR */
 

Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.134 src/sys/arch/arm/arm32/arm32_machdep.c:1.135
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.134	Sat Jun 20 15:45:22 2020
+++ src/sys/arch/arm/arm32/arm32_machdep.c	Sun Jun 21 17:25:03 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: arm32_machdep.c,v 1.134 2020/06/20 15:45:22 skrll Exp $	*/
+/*	$NetBSD: arm32_machdep.c,v 1.135 2020/06/21 17:25:03 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.134 2020/06/20 15:45:22 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.135 2020/06/21 17:25:03 jmcneill Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_arm_start.h"
@@ -687,6 +687,9 @@ dosoftints(void)
 void
 module_init_md(void)
 {
+#ifdef FDT
+	arm_fdt_module_init();
+#endif
 }
 #endif /* MODULAR */
 

Index: src/sys/arch/arm/fdt/arm_fdt.c
diff -u src/sys/arch/arm/fdt/arm_fdt.c:1.10 src/sys/arch/arm/fdt/arm_fdt.c:1.11
--- src/sys/arch/arm/fdt/arm_fdt.c:1.10	Sun Jan  5 17:16:07 2020
+++ src/sys/arch/arm/fdt/arm_fdt.c	Sun Jun 21 17:25:03 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdt.c,v 1.10 2020/01/05 17:16:07 jmcneill Exp $ */
+/* $NetBSD: arm_fdt.c,v 1.11 2020/06/21 17:25:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <[email protected]>
@@ -27,9 +27,10 @@
  */
 
 #include "opt_arm_timer.h"
+#include "opt_modular.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.10 2020/01/05 17:16:07 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 1.11 2020/06/21 17:25:03 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -37,6 +38,9 @@ __KERNEL_RCSID(0, "$NetBSD: arm_fdt.c,v 
 #include <sys/device.h>
 #include <sys/kmem.h>
 #include <sys/bus.h>
+#include <sys/module.h>
+
+#include <uvm/uvm_extern.h>
 
 #include <dev/fdt/fdtvar.h>
 #include <dev/ofw/openfirm.h>
@@ -200,3 +204,52 @@ cpu_initclocks(void)
 	_arm_fdt_timer_init();
 }
 #endif
+
+void
+arm_fdt_module_init(void)
+{
+#ifdef MODULAR
+	const int chosen = OF_finddevice("/chosen");
+	const char *module_name;
+	const uint64_t *data;
+	u_int index;
+	paddr_t pa;
+	vaddr_t va;
+	int len;
+
+	if (chosen == -1)
+		return;
+
+	data = fdtbus_get_prop(chosen, "netbsd,modules", &len);
+	if (data == NULL)
+		return;
+
+	for (index = 0; index < len / 16; index++, data += 2) {
+		module_name = fdtbus_get_string_index(chosen,
+		    "netbsd,module-names", index);
+		if (module_name == NULL)
+			break;
+
+		const paddr_t startpa = (paddr_t)be64dec(data + 0);
+		const size_t size = (size_t)be64dec(data + 1);
+		const paddr_t endpa = round_page(startpa + size);
+
+		const vaddr_t startva = uvm_km_alloc(kernel_map, endpa - startpa,
+		    0, UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
+		if (startva == 0) {
+			printf("ERROR: Cannot allocate VA for module %s\n",
+			    module_name);
+			continue;
+		}
+
+		for (pa = startpa, va = startva;
+		     pa < endpa;
+		     pa += PAGE_SIZE, va += PAGE_SIZE) {
+			pmap_kenter_pa(va, pa, VM_PROT_ALL, PMAP_WRITE_BACK);
+		}
+		pmap_update(pmap_kernel());
+
+		module_prime(module_name, (void *)(uintptr_t)startva, size);
+	}
+#endif /* !MODULAR */
+}

Index: src/sys/arch/arm/fdt/arm_fdtvar.h
diff -u src/sys/arch/arm/fdt/arm_fdtvar.h:1.16 src/sys/arch/arm/fdt/arm_fdtvar.h:1.17
--- src/sys/arch/arm/fdt/arm_fdtvar.h:1.16	Sun Jan  5 17:16:07 2020
+++ src/sys/arch/arm/fdt/arm_fdtvar.h	Sun Jun 21 17:25:03 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_fdtvar.h,v 1.16 2020/01/05 17:16:07 jmcneill Exp $ */
+/* $NetBSD: arm_fdtvar.h,v 1.17 2020/06/21 17:25:03 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared D. McNeill <[email protected]>
@@ -97,4 +97,6 @@ void	arm_fdt_irq_handler(void *);
 
 void	arm_fdt_memory_dump(paddr_t);
 
+void	arm_fdt_module_init(void);
+
 #endif /* !_ARM_ARM_FDTVAR_H */

Reply via email to