arch/x86/kernel/machine_kexec_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
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.
Therefore, passing res->end directly to kernel_ident_mapping_init() is
incorrect, the correct end address should be `res->end + 1`.
Signed-off-by: Yuntao Wang <ytcoode@gmail.com>
---
arch/x86/kernel/machine_kexec_64.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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
--
2.43.0
On Thu, 21 Dec 2023 18:17:02 +0800 Yuntao Wang <ytcoode@gmail.com> wrote: > 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. > > Therefore, passing res->end directly to kernel_ident_mapping_init() is > incorrect, the correct end address should be `res->end + 1`. > > ... > > --- 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); > } Thanks. When fixing a bug, please always full describe the userspace-visible effects of that bug. In this case I'm assuming "none", due to kernel_ident_mapping_init()'s upward rounding of the address?
On Thu, 21 Dec 2023 14:03:00 -0800, Andrew Morton <akpm@linux-foundation.org> wrote: > On Thu, 21 Dec 2023 18:17:02 +0800 Yuntao Wang <ytcoode@gmail.com> wrote: > > > 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. > > > > Therefore, passing res->end directly to kernel_ident_mapping_init() is > > incorrect, the correct end address should be `res->end + 1`. > > > > ... > > > > --- 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); > > } > > Thanks. When fixing a bug, please always full describe the > userspace-visible effects of that bug. > > In this case I'm assuming "none", due to kernel_ident_mapping_init()'s > upward rounding of the address? 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.
© 2016 - 2025 Red Hat, Inc.