lkml.org 
[lkml]   [2018]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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(&region, 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(&region, 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(&region, 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
    >
    >
    >

    \
     
     \ /
      Last update: 2018-01-19 03:39    [W:2.469 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site