x86/kexec: fix incorrect end address passed to kernel_ident_mapping_init()
authorYuntao Wang <ytcoode@gmail.com>
Thu, 21 Dec 2023 10:17:02 +0000 (18:17 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 Dec 2023 20:22:29 +0000 (12:22 -0800)
kernel_ident_mapping_init() takes an exclusive memory range [pstart, pend)
where pend is not included in the range, while res represents an inclusive
memory range [start, end] where end is considered part of the range.

Passing [start, end] rather than [start, end+1) to
kernel_ident_mapping_init() may result in the identity mapping for the
end address not being set up.

For example, when res->start is equal to res->end,
kernel_ident_mapping_init() will not establish any identity mapping.
Similarly, when the value of res->end is a multiple of 2M and the page
table maps 2M pages, kernel_ident_mapping_init() will also not set up
identity mapping for res->end.

Therefore, passing res->end directly to kernel_ident_mapping_init() is
incorrect, the correct end address should be `res->end + 1`.

Link: https://lkml.kernel.org/r/20231221101702.20956-1-ytcoode@gmail.com
Signed-off-by: Yuntao Wang <ytcoode@gmail.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Borislav Petkov (AMD) <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Simon Horman <horms@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/x86/kernel/machine_kexec_64.c

index 6f8df998890efbca6fbe7f2cc98623b123ede44e..bc0a5348b4a6275c4fe1d35464330eb6c69993ba 100644 (file)
@@ -44,7 +44,7 @@ static int mem_region_callback(struct resource *res, void *arg)
        struct init_pgtable_data *data = arg;
 
        return kernel_ident_mapping_init(data->info, data->level4p,
-                                        res->start, res->end);
+                                        res->start, res->end + 1);
 }
 
 static int