diff mbox series

[v2] Arm: correct FIXADDR_TOP

Message ID 5b097aa2-7ced-4971-bd6e-96618bb6f2df@suse.com (mailing list archive)
State New
Headers show
Series [v2] Arm: correct FIXADDR_TOP | expand

Commit Message

Jan Beulich Aug. 13, 2024, 11:49 a.m. UTC
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 <jbeulich@suse.com>
---
v2: Adjust FIXADDR_TOP instead. Add BUILD_BUG_ON() as suggested by
    Michal.

Comments

Michal Orzel Aug. 13, 2024, 11:57 a.m. UTC | #1
On 13/08/2024 13:49, Jan Beulich wrote:
> 
> 
> 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 <jbeulich@suse.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>

~Michal
Julien Grall Aug. 13, 2024, 8:51 p.m. UTC | #2
Hi,

On 13/08/2024 12:57, Michal Orzel wrote:
> 
> 
> On 13/08/2024 13:49, Jan Beulich wrote:
>>
>>
>> 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 <jbeulich@suse.com>
> Reviewed-by: Michal Orzel <michal.orzel@amd.com>

Committed.

Cheers,
diff mbox series

Patch

--- a/xen/arch/arm/include/asm/fixmap.h
+++ b/xen/arch/arm/include/asm/fixmap.h
@@ -18,7 +18,7 @@ 
 #define FIX_LAST FIX_PMAP_END
 
 #define FIXADDR_START FIXMAP_ADDR(0)
-#define FIXADDR_TOP FIXMAP_ADDR(FIX_LAST)
+#define FIXADDR_TOP FIXMAP_ADDR(FIX_LAST + 1)
 
 #ifndef __ASSEMBLY__
 
--- a/xen/arch/arm/mmu/setup.c
+++ b/xen/arch/arm/mmu/setup.c
@@ -128,6 +128,12 @@  static void __init __maybe_unused build_
 
 #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);
 }
 
 lpae_t __init pte_of_xenaddr(vaddr_t va)