From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755898AbbCBO7p (ORCPT ); Mon, 2 Mar 2015 09:59:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40603 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755863AbbCBO7n (ORCPT ); Mon, 2 Mar 2015 09:59:43 -0500 From: Baoquan He To: hpa@zytor.com, yinghai@kernel.org, keescook@chromium.org, vgoyal@redhat.com, luto@amacapital.net, akpm@linux-foundation.org, tglx@linutronix.de, mingo@redhat.com Cc: linux-kernel@vger.kernel.org, Baoquan He Subject: [PATCH v2 7/9] get the random phy addr according to slot_area info Date: Mon, 2 Mar 2015 22:58:28 +0800 Message-Id: <1425308310-2318-8-git-send-email-bhe@redhat.com> In-Reply-To: <1425308310-2318-1-git-send-email-bhe@redhat.com> References: <1425308310-2318-1-git-send-email-bhe@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; } return slots_fetch_random(); -- 1.9.3