git: 818390ce0ca5 - main - arm64: fix early devmap assertion
Mitchell Horne
mhorne063 at gmail.com
Wed Jan 13 21:35:35 UTC 2021
On Wed, Jan 13, 2021 at 5:28 PM Mitchell Horne <mhorne at freebsd.org> wrote:
>
> The branch main has been updated by mhorne:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=818390ce0ca539300dd15d7a817784f1e3f7a9b8
>
> commit 818390ce0ca539300dd15d7a817784f1e3f7a9b8
> Author: Mitchell Horne <mhorne at FreeBSD.org>
> AuthorDate: 2021-01-13 18:30:50 +0000
> Commit: Mitchell Horne <mhorne at 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
Sigh. This should be PR 252541.
Mitchell
> 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.
More information about the dev-commits-src-main
mailing list