diff options
author | Yuntao Wang <[email protected]> | 2023-12-21 18:17:02 +0800 |
---|---|---|
committer | Andrew Morton <[email protected]> | 2023-12-29 12:22:29 -0800 |
commit | 3177e6315b12839ea7be2810ae6b461b123e026e (patch) | |
tree | a64e76c89dc30cc0185c690e02afc2cc41b04b7f | |
parent | 037d88f0dd87553871a8b143586399122adf49ba (diff) |
x86/kexec: fix incorrect end address passed to kernel_ident_mapping_init()
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/[email protected]
Signed-off-by: Yuntao Wang <[email protected]>
Cc: Baoquan He <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: Borislav Petkov (AMD) <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Simon Horman <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
-rw-r--r-- | arch/x86/kernel/machine_kexec_64.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index 6f8df998890e..bc0a5348b4a6 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c @@ -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 |