Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/aarch64/aarch64 changes of r1.14 was incomplete. us...
details: https://anonhg.NetBSD.org/src/rev/00975565eb4b
branches: trunk
changeset: 445267:00975565eb4b
user: ryo <ryo%NetBSD.org@localhost>
date: Sat Oct 20 06:18:18 2018 +0000
description:
changes of r1.14 was incomplete. use bootconfig.dram[] to resolve valid memory range.
pmap(1) failed to access kvm on some environment.
diffstat:
sys/arch/aarch64/aarch64/aarch64_machdep.c | 63 +++++++++++++++++++++--------
1 files changed, 46 insertions(+), 17 deletions(-)
diffs (134 lines):
diff -r 89a25b3c81c0 -r 00975565eb4b sys/arch/aarch64/aarch64/aarch64_machdep.c
--- a/sys/arch/aarch64/aarch64/aarch64_machdep.c Sat Oct 20 05:58:34 2018 +0000
+++ b/sys/arch/aarch64/aarch64/aarch64_machdep.c Sat Oct 20 06:18:18 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: aarch64_machdep.c,v 1.15 2018/10/14 14:31:05 skrll Exp $ */
+/* $NetBSD: aarch64_machdep.c,v 1.16 2018/10/20 06:18:18 ryo 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.15 2018/10/14 14:31:05 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.16 2018/10/20 06:18:18 ryo Exp $");
#include "opt_arm_debug.h"
#include "opt_ddb.h"
@@ -228,16 +228,36 @@
paddr_t kernstart_phys __unused = KERN_VTOPHYS(kernstart);
paddr_t kernend_phys __unused = KERN_VTOPHYS(kernend);
- /* XXX */
+ /* XXX: arm/arm32/bus_dma.c refers physical_{start,end} */
physical_start = bootconfig.dram[0].address;
physical_end = physical_start + ptoa(bootconfig.dram[0].pages);
+ /*
+ * msgbuf is allocated from the bottom of any one of memory blocks
+ * to avoid corruption due to bootloader or changing kernel layout.
+ */
+ paddr_t msgbufaddr = 0;
+ for (i = 0; i < bootconfig.dramblocks; i++) {
+ /* this block has enough space for msgbuf? */
+ if (bootconfig.dram[i].pages < atop(round_page(MSGBUFSIZE)))
+ continue;
+
+ /* allocate msgbuf from the bottom of this block */
+ bootconfig.dram[i].pages -= atop(round_page(MSGBUFSIZE));
+ msgbufaddr = bootconfig.dram[i].address +
+ ptoa(bootconfig.dram[i].pages);
+ break;
+ }
+ KASSERT(msgbufaddr != 0); /* no space for msgbuf */
+ initmsgbuf((void *)AARCH64_PA_TO_KVA(msgbufaddr), MSGBUFSIZE);
+
VPRINTF(
"------------------------------------------\n"
"kern_vtopdiff = 0x%016lx\n"
"physical_start = 0x%016lx\n"
"kernel_start_phys = 0x%016lx\n"
"kernel_end_phys = 0x%016lx\n"
+ "msgbuf = 0x%016lx\n"
"physical_end = 0x%016lx\n"
"VM_MIN_KERNEL_ADDRESS = 0x%016lx\n"
"kernel_start_l2 = 0x%016lx\n"
@@ -258,6 +278,7 @@
physical_start,
kernstart_phys,
kernend_phys,
+ msgbufaddr,
physical_end,
VM_MIN_KERNEL_ADDRESS,
kernstart_l2,
@@ -273,14 +294,6 @@
VM_KERNEL_IO_ADDRESS,
VM_MAX_KERNEL_ADDRESS);
- /*
- * msgbuf is always allocated from bottom of 1st memory block.
- * against corruption by bootloader, or changing kernel layout.
- */
- physical_end -= round_page(MSGBUFSIZE);
- bootconfig.dram[0].pages -= atop(round_page(MSGBUFSIZE));
- initmsgbuf((void *)AARCH64_PA_TO_KVA(physical_end), MSGBUFSIZE);
-
#ifdef DDB
db_machdep_init();
#endif
@@ -505,23 +518,35 @@
}
#endif /* MODULAR */
+static bool
+in_dram_p(paddr_t pa, psize_t size)
+{
+ int i;
+
+ for (i = 0; i < bootconfig.dramblocks; i++) {
+ paddr_t s, e;
+ s = bootconfig.dram[i].address;
+ e = bootconfig.dram[i].address + ptoa(bootconfig.dram[i].pages);
+ if ((s <= pa) && ((pa + size) <= e))
+ return true;
+ }
+ return false;
+}
+
bool
mm_md_direct_mapped_phys(paddr_t pa, vaddr_t *vap)
{
- /* XXX */
- if (physical_start <= pa && pa < physical_end) {
+ if (in_dram_p(pa, 0)) {
*vap = AARCH64_PA_TO_KVA(pa);
return true;
}
-
return false;
}
int
mm_md_physacc(paddr_t pa, vm_prot_t prot)
{
- /* XXX */
- if (physical_start <= pa && pa < physical_end)
+ if (in_dram_p(pa, 0))
return 0;
return kauth_authorize_machdep(kauth_cred_get(),
@@ -554,8 +579,12 @@
if ((v < data_start) && (prot & VM_PROT_WRITE))
return EFAULT;
} else if (IN_RANGE(v, AARCH64_KSEG_START, AARCH64_KSEG_END)) {
+ /*
+ * if defined PMAP_MAP_POOLPAGE, direct mapped address (KSEG)
+ * will be appeared as kvm(3) address.
+ */
paddr_t pa = AARCH64_KVA_TO_PA(v);
- if (IN_RANGE(pa, physical_start, physical_end)) {
+ if (in_dram_p(pa, 0)) {
*handled = true;
if (IN_RANGE(pa, kernstart_phys,
kernstart_phys + rosize) &&
Home |
Main Index |
Thread Index |
Old Index