]> www.infradead.org Git - nvme.git/commitdiff
of: fdt: Scan /memreserve/ last
authorLucas Tanure <tanure@linux.com>
Mon, 24 Apr 2023 11:38:46 +0000 (12:38 +0100)
committerRob Herring <robh@kernel.org>
Thu, 27 Apr 2023 20:52:16 +0000 (15:52 -0500)
Change the scanning /memreserve/ and /reserved-memory node order to fix
Kernel panic on Khadas Vim3 Board.

If /memreserve/ goes first, the memory is reserved, but nomap can't be
applied to the region. So the memory won't be used by Linux, but it is
still present in the linear map as normal memory, which allows
speculation. Legitimate access to adjacent pages will cause the CPU
to end up prefetching into them leading to Kernel panic.

So /reserved-memory node should go first, as it has a more updated
description of the memory regions and can apply flags, like nomap.

Link: https://lore.kernel.org/all/CAJX_Q+1Tjc+-TjZ6JW9X0NxEdFe=82a9626yL63j7uVD4LpxEA@mail.gmail.com/
Signed-off-by: Lucas Tanure <tanure@linux.com>
Link: https://lore.kernel.org/r/20230424113846.46382-1-tanure@linux.com
Signed-off-by: Rob Herring <robh@kernel.org>
drivers/of/fdt.c

index d1a68b6d03b3f1df3789511a432b92ca15911e2a..c28aedd7ae1f794b2b3c2ecf0b6f436f9eda8348 100644 (file)
@@ -635,6 +635,9 @@ void __init early_init_fdt_scan_reserved_mem(void)
        if (!initial_boot_params)
                return;
 
+       fdt_scan_reserved_mem();
+       fdt_reserve_elfcorehdr();
+
        /* Process header /memreserve/ fields */
        for (n = 0; ; n++) {
                fdt_get_mem_rsv(initial_boot_params, n, &base, &size);
@@ -643,8 +646,6 @@ void __init early_init_fdt_scan_reserved_mem(void)
                memblock_reserve(base, size);
        }
 
-       fdt_scan_reserved_mem();
-       fdt_reserve_elfcorehdr();
        fdt_init_reserved_mem();
 }