Date: Wed, 13 Jan 2021 21:28:08 GMT From: Mitchell Horne <mhorne@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 818390ce0ca5 - main - arm64: fix early devmap assertion Message-ID: <202101132128.10DLS8ZH018542@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=818390ce0ca539300dd15d7a817784f1e3f7a9b8 commit 818390ce0ca539300dd15d7a817784f1e3f7a9b8 Author: Mitchell Horne <mhorne@FreeBSD.org> AuthorDate: 2021-01-13 18:30:50 +0000 Commit: Mitchell Horne <mhorne@FreeBSD.org> CommitDate: 2021-01-13 21:27:44 +0000 arm64: fix early devmap assertion The purpose of this KASSERT is to ensure that we do not run out of space in the early devmap. However, the devmap grew beyond its initial size of 2MB in r336519, and this assertion did not grow with it. A devmap mapping of a 1080p framebuffer requires 1920x1080 bytes, or 1.977 MB, so it is just barely able to fit without triggering the assertion, provided no other devices are mapped before it. With the addition of `options GDB` in GENERIC by bbfa199cbc16, the uart is now mapped for the purposes of a debug port, before mapping the framebuffer. The presence of both these conditions pushes the selected virtual address just below the threshold, triggering the assertion. To fix this, use the correct size of the devmap, defined by PMAP_MAPDEV_EARLY_SIZE. Since this code is shared with RISC-V, define it for that platform as well (although it is a different size). PR: 25241 Reported by: gbe MFC after: 3 days Sponsored by: The FreeBSD Foundation --- sys/kern/subr_devmap.c | 2 +- sys/riscv/include/vmparam.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/kern/subr_devmap.c b/sys/kern/subr_devmap.c index 581e85086f0f..8e07199b7f73 100644 --- a/sys/kern/subr_devmap.c +++ b/sys/kern/subr_devmap.c @@ -275,7 +275,7 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size) if (early_boot) { akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size); va = akva_devmap_vaddr; - KASSERT(va >= VM_MAX_KERNEL_ADDRESS - L2_SIZE, + KASSERT(va >= VM_MAX_KERNEL_ADDRESS - PMAP_MAPDEV_EARLY_SIZE, ("Too many early devmap mappings")); } else #endif diff --git a/sys/riscv/include/vmparam.h b/sys/riscv/include/vmparam.h index f3cab1074454..9580ab3e1218 100644 --- a/sys/riscv/include/vmparam.h +++ b/sys/riscv/include/vmparam.h @@ -235,6 +235,7 @@ extern vm_offset_t init_pt_va; #define ZERO_REGION_SIZE (64 * 1024) /* 64KB */ #define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS +#define PMAP_MAPDEV_EARLY_SIZE (L2_SIZE * 2) /* * No non-transparent large page support in the pmap.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101132128.10DLS8ZH018542>