From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751732AbbCDV2e (ORCPT ); Wed, 4 Mar 2015 16:28:34 -0500 Received: from mail-vc0-f181.google.com ([209.85.220.181]:55499 "EHLO mail-vc0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751378AbbCDV2d (ORCPT ); Wed, 4 Mar 2015 16:28:33 -0500 MIME-Version: 1.0 In-Reply-To: <1425308310-2318-8-git-send-email-bhe@redhat.com> References: <1425308310-2318-1-git-send-email-bhe@redhat.com> <1425308310-2318-8-git-send-email-bhe@redhat.com> Date: Wed, 4 Mar 2015 13:28:32 -0800 X-Google-Sender-Auth: 7z8_HUU-pJfcWAzGMIJbJlXybDI Message-ID: Subject: Re: [PATCH v2 7/9] get the random phy addr according to slot_area info From: Kees Cook To: Baoquan He Cc: "H. Peter Anvin" , Yinghai Lu , Vivek Goyal , Andy Lutomirski , Andrew Morton , Thomas Gleixner , Ingo Molnar , LKML Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 2, 2015 at 6:58 AM, Baoquan He wrote: > Now random value can be used to get related slot info stored in > slot_area, mainly use slot_area.num to position which slot is target. > With this slot its starting address is returned as the physical > address where kernel will put. > > Signed-off-by: Baoquan He > --- > arch/x86/boot/compressed/aslr.c | 34 +++++++++++++++++++--------------- > 1 file changed, 19 insertions(+), 15 deletions(-) > > diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c > index 1c6fb31..55adee2 100644 > --- a/arch/x86/boot/compressed/aslr.c > +++ b/arch/x86/boot/compressed/aslr.c > @@ -245,9 +245,6 @@ static unsigned long mem_min_overlap(struct mem_vector *img, struct mem_vector * > return min; > } > > -static unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / > - CONFIG_PHYSICAL_ALIGN]; > - > struct slot_area { > unsigned long addr; > int num; > @@ -261,23 +258,28 @@ static unsigned long slot_max; > > static unsigned long slot_area_index; > > -static void slots_append(unsigned long addr) > -{ > - /* Overflowing the slots list should be impossible. */ > - if (slot_max >= CONFIG_RANDOMIZE_BASE_MAX_OFFSET / > - CONFIG_PHYSICAL_ALIGN) > - return; > - > - slots[slot_max++] = addr; > -} > - > static unsigned long slots_fetch_random(void) > { > + unsigned long random; > + int i; > + > /* Handle case of no slots stored. */ > if (slot_max == 0) > return 0; > > - return slots[get_random_long() % slot_max]; > + random = get_random_long() % slot_max; > + > + for (i=0; i< slot_area_index; i++) { > + if (random > slot_areas[i].num) { > + random -= slot_areas[i].num; > + continue; > + } > + return slot_areas[i].addr + random * CONFIG_PHYSICAL_ALIGN; > + } > + > + if (i == slot_area_index ) > + debug_putstr("something wrong happened in slots_fetch_random()...\n"); > + return 0; > } > > static int process_e820_entry(struct e820entry *entry, > @@ -362,7 +364,7 @@ repeat: > goto repeat; > } > > -static unsigned long find_random_addr(unsigned long minimum, > +static unsigned long find_random_phy_addr(unsigned long minimum, > unsigned long size) > { > int i; > @@ -374,6 +376,8 @@ static unsigned long find_random_addr(unsigned long minimum, > /* Verify potential e820 positions, appending to slots list. */ > for (i = 0; i < real_mode->e820_entries; i++) { > process_e820_entry(&real_mode->e820_map[i], minimum, size); > + if ( slot_area_index == MAX_SLOT_AREA ) > + break; I wonder if this should emit a printk warning? -Kees > } > > return slots_fetch_random(); > -- > 1.9.3 > -- Kees Cook Chrome OS Security