On Sat, Feb 16, 2019 at 6:03 AM Baoquan He <b...@redhat.com> wrote: > > In memory region KASLR, __PHYSICAL_MASK_SHIFT is taken to calculate > the initial size of the direct mapping region. This is correct in > the old code where __PHYSICAL_MASK_SHIFT was equal to MAX_PHYSMEM_BITS, > 46 bits, and only 4-level mode was supported. > > Later, in commit b83ce5ee91471d ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT > always 52"), __PHYSICAL_MASK_SHIFT was changed to be always 52 bits, no > matter it's 5-level or 4-level. This is wrong for 4-level paging. Then > when we adapt physical memory region size based on available memory, it > will overflow if the amount of system RAM and the padding is bigger > than 64 TB. > > In fact, here MAX_PHYSMEM_BITS should be used instead. Fix it by > replacing __PHYSICAL_MASK_SHIFT with MAX_PHYSMEM_BITS. > > Fixes: b83ce5ee9147 ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT always 52") > Acked-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com> > Reviewed-by: Thomas Garnier <thgar...@google.com> > Signed-off-by: Baoquan He <b...@redhat.com>
Nice catch! I wish I had a system with >64TB RAM. ;) Acked-by: Kees Cook <keesc...@chromium.org> > --- > arch/x86/mm/kaslr.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c > index bf680929fe26..97768df923e3 100644 > --- a/arch/x86/mm/kaslr.c > +++ b/arch/x86/mm/kaslr.c > @@ -137,7 +137,7 @@ void __init kernel_randomize_memory(void) > if (!kaslr_memory_enabled()) > return; > > - kaslr_regions[0].size_tb = 1 << (__PHYSICAL_MASK_SHIFT - TB_SHIFT); > + kaslr_regions[0].size_tb = 1 << (MAX_PHYSMEM_BITS - TB_SHIFT); > kaslr_regions[1].size_tb = VMALLOC_SIZE_TB; > > /* > -- > 2.17.2 > -- Kees Cook