Re: [PATCH v2 7/9] get the random phy addr according to slot_area info
From: Baoquan He
Date: Wed Mar 04 2015 - 10:40:09 EST
Hi Yinghai,
I got the reason and made a debug patch to fix it. Could you please
apply it on top of this patchset and try again? Then it will behave well
and just return 0x13c000000 since no random is got.
Please check the attachment.
Thanks
Baoquan
On 03/03/15 at 12:45am, Yinghai Lu wrote:
> after fixing that, on the system with 4G ram: i got:
>
> early console in decompress_kernel
> KASLR using RDTSC...
> decompress_kernel:
> input: [0x13f5ed3b4-0x13ff6a64b], output: 0x153000000, heap:
> [0x13ff76000-0x13ff7dfff]
>
> Decompressing Linux... xz...
>
> XZ-compressed data is corrupt
>
>
> without the patch, I have:
>
> early console in decompress_kernel
> KASLR could not find suitable E820 region...
> decompress_kernel:
> input: [0x13f5ee3b4-0x13ff6b64b], output: 0x13cc00000, heap:
> [0x13ff76000-0x13ff7dfff]
>
> Decompressing Linux... xz... Parsing ELF... done.
> ...
> [ 0.016848] e820: BIOS-provided physical RAM map (sanitized by setup):
> [ 0.018854] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
> [ 0.020982] BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
> [ 0.023166] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
> [ 0.025783] BIOS-e820: [mem 0x0000000000100000-0x00000000bffdffff] usable
> [ 0.027901] BIOS-e820: [mem 0x00000000bffe0000-0x00000000bfffffff] reserved
> [ 0.030079] BIOS-e820: [mem 0x00000000feffc000-0x00000000feffffff] reserved
> [ 0.032252] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
> [ 0.034437] BIOS-e820: [mem 0x0000000100000000-0x000000013fffffff] usable
>
> so you code now select range that is out of boundary to non ram area.
>
> Thanks
>
> Yinghai
diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c
index 3114ae0..e351b99 100644
--- a/arch/x86/boot/compressed/aslr.c
+++ b/arch/x86/boot/compressed/aslr.c
@@ -301,18 +301,17 @@ static int process_e820_entry(struct e820entry *entry,
region.start = entry->addr;
region.size = entry->size;
+repeat:
+ start_orig = region.start;
+
/* Potentially raise address to minimum location. */
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);