From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752289AbdFTIXK (ORCPT ); Tue, 20 Jun 2017 04:23:10 -0400 Received: from cn.fujitsu.com ([59.151.112.132]:55688 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751590AbdFTIXF (ORCPT ); Tue, 20 Jun 2017 04:23:05 -0400 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="20257716" Date: Tue, 20 Jun 2017 16:22:09 +0800 From: Chao Fan To: Baoquan He CC: , , , , Subject: Re: [PATCH 1/2] x86/boot/KASLR: Adapt process_e820_entry for all kinds of memory map Message-ID: <20170620082209.GA14565@localhost.localdomain> References: <1497513169-25283-1-git-send-email-bhe@redhat.com> <1497513169-25283-2-git-send-email-bhe@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1497513169-25283-2-git-send-email-bhe@redhat.com> User-Agent: Mutt/1.8.0 (2017-02-23) X-Originating-IP: [10.167.226.75] X-yoursite-MailScanner-ID: 8583547C6D37.AB9CF X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: fanc.fnst@cn.fujitsu.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jun 15, 2017 at 03:52:48PM +0800, Baoquan He wrote: >Now function process_e820_entry is only used to process e820 memory >entry. Adapt it for memory region only, not just for e820. Later >we will use it to process efi mirror regions. > >So rename the original process_e820_entry to process_mem_region, and >extract and wrap the e820 specific processing code into process_e820_entry. > >Signed-off-by: Baoquan He Hi Bao, Maybe some code annotations should be changed, for example: /* Walk e820 and find a random address. */ random_addr = find_random_phys_addr(min_addr, output_size); Cause you will walk efi map firstly, and then e820 map(or not). Thanks, Chao Fan >--- > arch/x86/boot/compressed/kaslr.c | 60 ++++++++++++++++++++++------------------ > 1 file changed, 33 insertions(+), 27 deletions(-) > >diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c >index fe318b4..c2ed051 100644 >--- a/arch/x86/boot/compressed/kaslr.c >+++ b/arch/x86/boot/compressed/kaslr.c >@@ -479,35 +479,31 @@ static unsigned long slots_fetch_random(void) > return 0; > } > >-static void process_e820_entry(struct boot_e820_entry *entry, >+static void process_mem_region(struct mem_vector *entry, > unsigned long minimum, > unsigned long image_size) > { > struct mem_vector region, overlap; > struct slot_area slot_area; > unsigned long start_orig, end; >- struct boot_e820_entry cur_entry; >- >- /* Skip non-RAM entries. */ >- if (entry->type != E820_TYPE_RAM) >- return; >+ struct mem_vector cur_entry; > > /* On 32-bit, ignore entries entirely above our maximum. */ >- if (IS_ENABLED(CONFIG_X86_32) && entry->addr >= KERNEL_IMAGE_SIZE) >+ if (IS_ENABLED(CONFIG_X86_32) && entry->start >= KERNEL_IMAGE_SIZE) > return; > > /* Ignore entries entirely below our minimum. */ >- if (entry->addr + entry->size < minimum) >+ if (entry->start + entry->size < minimum) > return; > > /* Ignore entries above memory limit */ >- end = min(entry->size + entry->addr, mem_limit); >- if (entry->addr >= end) >+ end = min(entry->size + entry->start, mem_limit); >+ if (entry->start >= end) > return; >- cur_entry.addr = entry->addr; >- cur_entry.size = end - entry->addr; >+ cur_entry.start = entry->start; >+ cur_entry.size = end - entry->start; > >- region.start = cur_entry.addr; >+ region.start = cur_entry.start; > region.size = cur_entry.size; > > /* Give up if slot area array is full. */ >@@ -522,7 +518,7 @@ static void process_e820_entry(struct boot_e820_entry *entry, > region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN); > > /* Did we raise the address above this e820 region? */ >- if (region.start > cur_entry.addr + cur_entry.size) >+ if (region.start > cur_entry.start + cur_entry.size) > return; > > /* Reduce size by any delta from the original address. */ >@@ -562,12 +558,31 @@ static void process_e820_entry(struct boot_e820_entry *entry, > } > } > >-static unsigned long find_random_phys_addr(unsigned long minimum, >- unsigned long image_size) >+static void process_e820_entry(unsigned long minimum,unsigned long image_size) > { > int i; >- unsigned long addr; >+ struct mem_vector region; >+ struct boot_e820_entry *entry; >+ >+ /* Verify potential e820 positions, appending to slots list. */ >+ for (i = 0; i < boot_params->e820_entries; i++) { >+ entry = &boot_params->e820_table[i]; >+ /* Skip non-RAM entries. */ >+ if (entry->type != E820_TYPE_RAM) >+ 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"); >+ break; >+ } >+ } >+} > >+static unsigned long find_random_phys_addr(unsigned long minimum, >+ unsigned long image_size) >+{ > /* Check if we had too many memmaps. */ > if (memmap_too_large) { > debug_putstr("Aborted e820 scan (more than 4 memmap= args)!\n"); >@@ -577,16 +592,7 @@ static unsigned long find_random_phys_addr(unsigned long minimum, > /* Make sure minimum is aligned. */ > minimum = ALIGN(minimum, CONFIG_PHYSICAL_ALIGN); > >- /* Verify potential e820 positions, appending to slots list. */ >- for (i = 0; i < boot_params->e820_entries; i++) { >- process_e820_entry(&boot_params->e820_table[i], minimum, >- image_size); >- if (slot_area_index == MAX_SLOT_AREA) { >- debug_putstr("Aborted e820 scan (slot_areas full)!\n"); >- break; >- } >- } >- >+ process_e820_entry(minimum, image_size); > return slots_fetch_random(); > } > >-- >2.5.5 > > >