Messages in this thread | | | Date | Fri, 19 Jan 2018 10:39:03 +0800 | From | Baoquan He <> | Subject | Re: [PATCH v7 2/5] x86/KASLR: Handle the memory regions specified in kaslr_mem |
| |
On 01/17/18 at 06:53pm, Chao Fan wrote: > If no 'kaslr_mem=' specified, just handle the e820/efi entries directly > as before. Otherwise, limit kernel to memory regions specified in > 'kaslr_mem=' commandline. > > Rename process_mem_region to slots_count to match > slots_fetch_random, and name new function as process_mem_region. > > Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com> > --- > arch/x86/boot/compressed/kaslr.c | 64 +++++++++++++++++++++++++++++++++------- > 1 file changed, 53 insertions(+), 11 deletions(-) > > diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c > index b21741135673..b200a7ceafc1 100644 > --- a/arch/x86/boot/compressed/kaslr.c > +++ b/arch/x86/boot/compressed/kaslr.c > @@ -548,9 +548,9 @@ static unsigned long slots_fetch_random(void) > return 0; > }
Looks good, ack.
Acked-by: Baoquan He <bhe@redhat.com>
> > -static void process_mem_region(struct mem_vector *entry, > - unsigned long minimum, > - unsigned long image_size) > +static void slots_count(struct mem_vector *entry, > + unsigned long minimum, > + unsigned long image_size) > { > struct mem_vector region, overlap; > struct slot_area slot_area; > @@ -627,6 +627,52 @@ static void process_mem_region(struct mem_vector *entry, > } > } > > +static bool process_mem_region(struct mem_vector region, > + unsigned long long minimum, > + unsigned long long image_size) > +{ > + /* > + * If kaslr_mem= specified, walk all the regions, and > + * filter the intersection to slots_count. > + */ > + if (num_usable_region > 0) { > + int i; > + > + for (i = 0; i < num_usable_region; i++) { > + struct mem_vector entry; > + unsigned long long start, end, entry_end, region_end; > + > + start = mem_usable[i].start; > + end = start + mem_usable[i].size; > + region_end = region.start + region.size; > + > + entry.start = clamp(region.start, start, end); > + entry_end = clamp(region_end, start, end); > + > + if (entry.start < entry_end) { > + entry.size = entry_end - entry.start; > + slots_count(&entry, minimum, image_size); > + } > + > + if (slot_area_index == MAX_SLOT_AREA) { > + debug_putstr("Aborted e820/efi memmap scan (slot_areas full)!\n"); > + return 1; > + } > + } > + return 0; > + } > + > + /* > + * If no kaslr_mem stored, use region directly > + */ > + slots_count(®ion, minimum, image_size); > + if (slot_area_index == MAX_SLOT_AREA) { > + debug_putstr("Aborted e820/efi memmap scan (slot_areas full)!\n"); > + return 1; > + } > + return 0; > +} > + > #ifdef CONFIG_EFI > /* > * Returns true if mirror region found (and must have been processed > @@ -692,11 +738,9 @@ process_efi_entries(unsigned long minimum, unsigned long image_size) > > region.start = md->phys_addr; > region.size = md->num_pages << EFI_PAGE_SHIFT; > - process_mem_region(®ion, minimum, image_size); > - if (slot_area_index == MAX_SLOT_AREA) { > - debug_putstr("Aborted EFI scan (slot_areas full)!\n"); > + > + if (process_mem_region(region, minimum, image_size)) > break; > - } > } > return true; > } > @@ -723,11 +767,9 @@ static void process_e820_entries(unsigned long minimum, > continue; > region.start = entry->addr; > region.size = entry->size; > - process_mem_region(®ion, minimum, image_size); > - if (slot_area_index == MAX_SLOT_AREA) { > - debug_putstr("Aborted e820 scan (slot_areas full)!\n"); > + > + if (process_mem_region(region, minimum, image_size)) > break; > - } > } > } > > -- > 2.14.3 > > >
| |