Module Name: src
Committed By: riastradh
Date: Thu May 14 19:24:35 UTC 2020
Modified Files:
src/sys/arch/evbarm/fdt: fdt_machdep.c
Log Message:
Deduplicate address-range querying/mapping logic.
To generate a diff of this commit:
cvs rdiff -u -r1.69 -r1.70 src/sys/arch/evbarm/fdt/fdt_machdep.c
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/evbarm/fdt/fdt_machdep.c
diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.69 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.70
--- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.69 Thu May 14 19:21:06 2020
+++ src/sys/arch/evbarm/fdt/fdt_machdep.c Thu May 14 19:24:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.69 2020/05/14 19:21:06 riastradh Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.70 2020/05/14 19:24:35 riastradh Exp $ */
/*-
* Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.69 2020/05/14 19:21:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.70 2020/05/14 19:24:35 riastradh Exp $");
#include "opt_machdep.h"
#include "opt_bootconfig.h"
@@ -334,20 +334,20 @@ fdt_build_bootconfig(uint64_t mem_start,
}
static void
-fdt_probe_initrd(uint64_t *pstart, uint64_t *pend)
+fdt_probe_range(const char *startname, const char *endname,
+ uint64_t *pstart, uint64_t *pend)
{
+ int chosen, len;
+ const void *start_data, *end_data;
+
*pstart = *pend = 0;
-#ifdef MEMORY_DISK_DYNAMIC
- const int chosen = OF_finddevice("/chosen");
+ chosen = OF_finddevice("/chosen");
if (chosen < 0)
return;
- int len;
- const void *start_data = fdtbus_get_prop(chosen,
- "linux,initrd-start", &len);
- const void *end_data = fdtbus_get_prop(chosen,
- "linux,initrd-end", NULL);
+ start_data = fdtbus_get_prop(chosen, startname, &len);
+ end_data = fdtbus_get_prop(chosen, endname, NULL);
if (start_data == NULL || end_data == NULL)
return;
@@ -361,131 +361,92 @@ fdt_probe_initrd(uint64_t *pstart, uint6
*pend = be64dec(end_data);
break;
default:
- printf("Unsupported len %d for /chosen/initrd-start\n", len);
+ printf("Unsupported len %d for /chosen `%s'\n",
+ len, startname);
return;
}
-#endif
}
-static void
-fdt_setup_initrd(void)
+static void *
+fdt_map_range(uint64_t start, uint64_t end, uint64_t *psize,
+ const char *purpose)
{
-#ifdef MEMORY_DISK_DYNAMIC
- const uint64_t initrd_size = initrd_end - initrd_start;
- paddr_t startpa = trunc_page(initrd_start);
- paddr_t endpa = round_page(initrd_end);
+ const paddr_t startpa = trunc_page(start);
+ const paddr_t endpa = round_page(end);
paddr_t pa;
vaddr_t va;
- void *md_start;
+ void *ptr;
- if (initrd_size == 0)
- return;
+ *psize = end - start;
+ if (*psize == 0)
+ return NULL;
- va = uvm_km_alloc(kernel_map, initrd_size, 0,
- UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
+ va = uvm_km_alloc(kernel_map, *psize, 0, UVM_KMF_VAONLY|UVM_KMF_NOWAIT);
if (va == 0) {
- printf("Failed to allocate VA for initrd\n");
- return;
+ printf("Failed to allocate VA for %s\n", purpose);
+ return NULL;
}
-
- md_start = (void *)va;
+ ptr = (void *)(va + (start & (PAGE_SIZE-1)));
for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
pmap_update(pmap_kernel());
- md_root_setconf(md_start, initrd_size);
+ return ptr;
+}
+
+static void
+fdt_probe_initrd(uint64_t *pstart, uint64_t *pend)
+{
+ *pstart = *pend = 0;
+
+#ifdef MEMORY_DISK_DYNAMIC
+ fdt_probe_range("linux,initrd-start", "linux,initrd-end", pstart, pend);
#endif
}
static void
-fdt_probe_rndseed(uint64_t *pstart, uint64_t *pend)
+fdt_setup_initrd(void)
{
- int chosen, len;
- const void *start_data, *end_data;
+#ifdef MEMORY_DISK_DYNAMIC
+ void *md_start;
+ uint64_t initrd_size;
- *pstart = *pend = 0;
- chosen = OF_finddevice("/chosen");
- if (chosen < 0)
+ md_start = fdt_map_range(initrd_start, initrd_end, &initrd_size,
+ "initrd");
+ if (md_start == NULL)
return;
+ md_root_setconf(md_start, initrd_size);
+#endif
+}
- start_data = fdtbus_get_prop(chosen, "netbsd,rndseed-start", &len);
- end_data = fdtbus_get_prop(chosen, "netbsd,rndseed-end", NULL);
- if (start_data == NULL || end_data == NULL)
- return;
+static void
+fdt_probe_rndseed(uint64_t *pstart, uint64_t *pend)
+{
- switch (len) {
- case 4:
- *pstart = be32dec(start_data);
- *pend = be32dec(end_data);
- break;
- case 8:
- *pstart = be64dec(start_data);
- *pend = be64dec(end_data);
- break;
- default:
- printf("Unsupported len %d for /chosen/rndseed-start\n", len);
- return;
- }
+ fdt_probe_range("netbsd,rndseed-start", "netbsd,rndseed-end",
+ pstart, pend);
}
static void
fdt_setup_rndseed(void)
{
- const uint64_t rndseed_size = rndseed_end - rndseed_start;
- const paddr_t startpa = trunc_page(rndseed_start);
- const paddr_t endpa = round_page(rndseed_end);
- paddr_t pa;
- vaddr_t va;
+ uint64_t rndseed_size;
void *rndseed;
- if (rndseed_size == 0)
- return;
-
- va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
- UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
- if (va == 0) {
- printf("Failed to allocate VA for rndseed\n");
+ rndseed = fdt_map_range(rndseed_start, rndseed_end, &rndseed_size,
+ "rndseed");
+ if (rndseed == NULL)
return;
- }
- rndseed = (void *)va;
-
- for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
- pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
- pmap_update(pmap_kernel());
-
rnd_seed(rndseed, rndseed_size);
}
static void
fdt_probe_efirng(uint64_t *pstart, uint64_t *pend)
{
- int chosen, len;
- const void *start_data, *end_data;
-
- *pstart = *pend = 0;
- chosen = OF_finddevice("/chosen");
- if (chosen < 0)
- return;
-
- start_data = fdtbus_get_prop(chosen, "netbsd,efirng-start", &len);
- end_data = fdtbus_get_prop(chosen, "netbsd,efirng-end", NULL);
- if (start_data == NULL || end_data == NULL)
- return;
- switch (len) {
- case 4:
- *pstart = be32dec(start_data);
- *pend = be32dec(end_data);
- break;
- case 8:
- *pstart = be64dec(start_data);
- *pend = be64dec(end_data);
- break;
- default:
- printf("Unsupported len %d for /chosen/efirng-start\n", len);
- return;
- }
+ fdt_probe_range("netbsd,efirng-start", "netbsd,efirng-end",
+ pstart, pend);
}
static struct krndsource efirng_source;
@@ -493,27 +454,13 @@ static struct krndsource efirng_source;
static void
fdt_setup_efirng(void)
{
- const uint64_t efirng_size = efirng_end - efirng_start;
- const paddr_t startpa = trunc_page(efirng_start);
- const paddr_t endpa = round_page(efirng_end);
- paddr_t pa;
- vaddr_t va;
+ uint64_t efirng_size;
void *efirng;
- if (efirng_size == 0)
- return;
-
- va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
- UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
- if (va == 0) {
- printf("Failed to allocate VA for efirng\n");
+ efirng = fdt_map_range(efirng_start, efirng_end, &efirng_size,
+ "efirng");
+ if (efirng == NULL)
return;
- }
- efirng = (void *)va;
-
- for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
- pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
- pmap_update(pmap_kernel());
rnd_attach_source(&efirng_source, "efirng", RND_TYPE_RNG,
RND_FLAG_DEFAULT);