From 87d2cdd51327ab001d3cb68a714260f54bafba41 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 24 Sep 2024 14:52:15 +0200 Subject: [PATCH] Arm: correct FIXADDR_TOP While reviewing a RISC-V patch cloning the Arm code, I noticed an off-by-1 here: FIX_PMAP_{BEGIN,END} being an inclusive range and FIX_LAST being the same as FIX_PMAP_END, FIXADDR_TOP cannot derive from FIX_LAST alone, or else the BUG_ON() in virt_to_fix() would trigger if FIX_PMAP_END ended up being used. While touching this area also add a check for fixmap and boot FDT area to not only not overlap, but to have at least one (unmapped) page in between. Fixes: 4f17357b52f6 ("xen/arm: add Persistent Map (PMAP) infrastructure") Signed-off-by: Jan Beulich Reviewed-by: Michal Orzel master commit: fe3412ab83cc53c2bf2c497be3794bc09751efa5 master date: 2024-08-13 21:50:55 +0100 --- xen/arch/arm/include/asm/fixmap.h | 2 +- xen/arch/arm/mm.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/include/asm/fixmap.h b/xen/arch/arm/include/asm/fixmap.h index 734eb9b1d4..c92594c438 100644 --- a/xen/arch/arm/include/asm/fixmap.h +++ b/xen/arch/arm/include/asm/fixmap.h @@ -18,7 +18,7 @@ #define FIXMAP_LAST FIXMAP_PMAP_END #define FIXADDR_START FIXMAP_ADDR(0) -#define FIXADDR_TOP FIXMAP_ADDR(FIXMAP_LAST) +#define FIXADDR_TOP FIXMAP_ADDR(FIXMAP_LAST + 1) #ifndef __ASSEMBLY__ diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index c34cc94c90..1ff67ff2b5 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -198,6 +198,12 @@ static void __init __maybe_unused build_assertions(void) #undef CHECK_SAME_SLOT #undef CHECK_DIFFERENT_SLOT + + /* + * Fixmaps must not overlap with boot FDT mapping area. Make sure there's + * at least one guard page in between. + */ + BUILD_BUG_ON(FIXADDR_TOP >= BOOT_FDT_VIRT_START); } static lpae_t *xen_map_table(mfn_t mfn) -- 2.39.5