mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Baoquan He <bhe@redhat.com>
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 <bhe@redhat.com>
Subject: [PATCH v2 6/9] change process_e820_entry to store slot info into slot_area
Date: Mon,  2 Mar 2015 22:58:27 +0800	[thread overview]
Message-ID: <1425308310-2318-7-git-send-email-bhe@redhat.com> (raw)
In-Reply-To: <1425308310-2318-1-git-send-email-bhe@redhat.com>

For passed in e820 entry, check if it is overlapped with avoid area.
If no just calculate and store slot info into related slot_area.
Otherwise iterate all avoid areas to find the first one, namely with
lowest starting address among all overlapped avoid areas. Then split
it by exluding that avoid area and store slot info of the preceding
part, then process the left part just as a new e820 memory region.
Repeat this till the whole e820 memory region is processed.

Signed-off-by: Baoquan He <bhe@redhat.com>
---
 arch/x86/boot/compressed/aslr.c | 71 ++++++++++++++++++++++++++++++-----------
 1 file changed, 52 insertions(+), 19 deletions(-)

diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c
index ded3959..1c6fb31 100644
--- a/arch/x86/boot/compressed/aslr.c
+++ b/arch/x86/boot/compressed/aslr.c
@@ -280,20 +280,18 @@ static unsigned long slots_fetch_random(void)
 	return slots[get_random_long() % slot_max];
 }
 
-static void process_e820_entry(struct e820entry *entry,
+static int process_e820_entry(struct e820entry *entry,
 			       unsigned long minimum,
 			       unsigned long image_size)
 {
-	struct mem_vector region, img;
+	struct mem_vector region, img, out;
+	struct slot_area slot_area;
+	unsigned long min, start_orig;
 
 	/* Skip non-RAM entries. */
 	if (entry->type != E820_RAM)
 		return;
 
-	/* Ignore entries entirely above our maximum. */
-	if (entry->addr >= CONFIG_RANDOMIZE_BASE_MAX_OFFSET)
-		return;
-
 	/* Ignore entries entirely below our minimum. */
 	if (entry->addr + entry->size < minimum)
 		return;
@@ -305,6 +303,14 @@ static void process_e820_entry(struct e820entry *entry,
 	if (region.start < minimum)
 		region.start = minimum;
 
+repeat:
+
+	/* Return if slot area array is full */
+	if ( slot_area_index == MAX_SLOT_AREA )
+		return;
+
+	start_orig = region.start;
+
 	/* Potentially raise address to meet alignment requirements. */
 	region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN);
 
@@ -313,20 +319,47 @@ static void process_e820_entry(struct e820entry *entry,
 		return;
 
 	/* Reduce size by any delta from the original address. */
-	region.size -= region.start - entry->addr;
-
-	/* Reduce maximum size to fit end of image within maximum limit. */
-	if (region.start + region.size > CONFIG_RANDOMIZE_BASE_MAX_OFFSET)
-		region.size = CONFIG_RANDOMIZE_BASE_MAX_OFFSET - region.start;
-
-	/* Walk each aligned slot and check for avoided areas. */
-	for (img.start = region.start, img.size = image_size ;
-	     mem_contains(&region, &img) ;
-	     img.start += CONFIG_PHYSICAL_ALIGN) {
-		if (mem_avoid_overlap(&img))
-			continue;
-		slots_append(img.start);
+	region.size -= region.start - start_orig;
+
+	if ( region.size < image_size )
+		return;
+
+	if (!mem_avoid_overlap(&region)) {
+		slot_area.addr = region.start;
+		if ( image_size <= CONFIG_PHYSICAL_ALIGN)
+			slot_area.num = region.size / CONFIG_PHYSICAL_ALIGN;
+		else
+			slot_area.num = ( region.size - image_size ) /
+				CONFIG_PHYSICAL_ALIGN + 1;
+
+		if (slot_area.num > 0) {
+			slot_areas[slot_area_index++] = slot_area;
+			slot_max += slot_area.num;
+		}
+		return;
 	}
+
+	min = mem_min_overlap(&region, &out);
+
+	if ( min > region.start + image_size ) {
+		unsigned long size = min - region.start;
+
+		slot_area.addr = region.start;
+		if ( image_size <= CONFIG_PHYSICAL_ALIGN)
+                        slot_area.num = (min - region.start ) / CONFIG_PHYSICAL_ALIGN;
+                else
+                        slot_area.num = ( min - region.start - image_size ) /
+                                CONFIG_PHYSICAL_ALIGN + 1;
+
+		if (slot_area.num > 0) {
+			slot_areas[slot_area_index++] = slot_area;
+			slot_max += slot_area.num;
+		}
+	}
+
+	region.size -= out.start - region.start + out.size;
+	region.start = out.start + out.size;
+	goto repeat;
 }
 
 static unsigned long find_random_addr(unsigned long minimum,
-- 
1.9.3


  parent reply	other threads:[~2015-03-02 14:59 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-02 14:58 [PATCH v2 0/9] randomize kernel physical address and virtual address separately Baoquan He
2015-03-02 14:58 ` [PATCH v2 1/9] remove a unused function parameter Baoquan He
2015-03-03 18:32   ` Yinghai Lu
2015-03-04 15:48     ` Baoquan He
2015-03-02 14:58 ` [PATCH v2 2/9] a bug that relocation can not be handled when kernel is loaded above 2G Baoquan He
2015-03-02 14:58 ` [PATCH v2 3/9] make kernel be able to load above 4G in boot stage Baoquan He
2015-03-02 15:58   ` Baoquan He
2015-03-02 14:58 ` [PATCH v2 4/9] introduce struct slot_area to manage randomization slot info Baoquan He
2015-03-02 14:58 ` [PATCH v2 5/9] add mem_min_overlap to find the first avoid region within a memory region Baoquan He
2015-03-02 14:58 ` Baoquan He [this message]
2015-03-02 14:58 ` [PATCH v2 7/9] get the random phy addr according to slot_area info Baoquan He
2015-03-03  8:45   ` Yinghai Lu
2015-03-03 11:42     ` Baoquan He
2015-03-03 16:14       ` Yinghai Lu
2015-03-04 12:08         ` Baoquan He
2015-03-04 15:39     ` Baoquan He
2015-03-04 21:35       ` Yinghai Lu
2015-03-05  0:12         ` Yinghai Lu
2015-03-05  1:55           ` Baoquan He
2015-03-05  0:30       ` Yinghai Lu
2015-03-05  1:48         ` Baoquan He
2015-03-04 21:28   ` Kees Cook
2015-03-04 23:43     ` Baoquan He
2015-03-02 14:58 ` [PATCH v2 8/9] introduce fetch_random_virt_offset to randomize the kernel text mapping address Baoquan He
2015-03-02 14:58 ` [PATCH v2 9/9] change the relocations behavior for kaslr on x86_64 Baoquan He
2015-03-04 23:16   ` Yinghai Lu
2015-03-04 23:41     ` Baoquan He
2015-03-05 15:57 ` [PATCH v2 0/9] randomize kernel physical address and virtual address separately Baoquan He
2015-03-06  1:37   ` Yinghai Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1425308310-2318-7-git-send-email-bhe@redhat.com \
    --to=bhe@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=vgoyal@redhat.com \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®