[coreboot] [patch] mkelfimage intelligent placement of ramdisk

Warren Togami wtogami at redhat.com
Tue Jun 10 21:49:06 CEST 2008


Peter Stuge wrote:
> On Tue, Jun 10, 2008 at 12:47:38PM -0400, Warren Togami wrote:
>> The attached patch by Peter Jones <pjones at redhat.com> implements 
>> intelligent placement of the ramdisk in memory during boot of an
>> ELF image created by mkelfimage.
> 
> I appreciate this patch!
> 
> But can you (or Peter) please describe the algorithm in english?
> 
> I don't like a commit message that claims code to be intelligent.. :p

I personally don't understand the algorithm beyond your interpretation.

Peter explained only a few bits below.  Lots of this algorithm is simply 
how other bootloaders have worked for years.  This was just a simple way 
to implement something known to work.

In any case it is certainly better than the previous hard coded value.

I hope others test this patch so we can be certain it doesn't break 
anyone where it previously worked.  It shouldn't.

> 
>> diff -up mkelfImage-2.7/linux-i386/convert_params.c.ramdisk_base mkelfImage-2.7/linux-i386/convert_params.c
>> --- mkelfImage-2.7/linux-i386/convert_params.c.ramdisk_base	2006-03-27 18:44:59.000000000 -0500
>> +++ mkelfImage-2.7/linux-i386/convert_params.c	2008-05-21 12:55:44.000000000 -0400
>> @@ -1301,6 +1301,44 @@ static void query_firmware_values(struct
>>  	
>>  }
>>  
>> +static void relocate_ramdisk(struct param_info *info)
>> +{
>> +	struct e820entry *e820_map;
>> +	struct e820entry *highest = 0;
>> +	unsigned long load_addr;
>> +	int i;
>> +
>> +	e820_map = info->real_mode->e820_map;
>> +#if 0
>> +	printf("initrd_start = 0x%lx\n", info->real_mode->initrd_start);
>> +	printf("real_mode->e820_map_nr: %d\n", info->real_mode->e820_map_nr);
>> +#endif
> 
> I think these debugging messages should either be hooked to some
> verbose option or simply removed.

For merging with upstream I would just remove these blocks unless you 
already have an established way of building with runtime debug messages. 
  Just go ahead and change it as you see fit for merging.

>> +		if (e820_map[i].addr + info->real_mode->initrd_size >= 0x38000000)
>> +			continue;
> 
> ..what is this 3.5MB limit about? Also might this condition be
> sensitive to an overflow error?
> 

Peter isn't sure why 3.5MB specifically.  He said it is known to work 
for many years in other boot loaders.  There may have been a historic 
reason for this particular value but he doesn't know.

>> diff -up mkelfImage-2.7/linux-i386/mkelf-linux-i386.c.ramdisk_base mkelfImage-2.7/linux-i386/mkelf-linux-i386.c
>> --- mkelfImage-2.7/linux-i386/mkelf-linux-i386.c.ramdisk_base	2006-03-17 09:08:22.000000000 -0500
>> +++ mkelfImage-2.7/linux-i386/mkelf-linux-i386.c	2008-05-21 10:47:42.000000000 -0400
>> @@ -352,6 +352,9 @@ int linux_i386_mkelf(int argc, char **ar
>>  	 */
>>  	params->initrd_start = params->initrd_size = 0;
>>  	if (ramdisk_size) {
>> +		while (ramdisk_base <= kernel_size)
>> +			ramdisk_base <<= 1;
>> +
> 
> Does this start with 1MB, then try 2MB, 4MB and so on?

According to Peter there this is only a simple way that avoids alignment 
earlier.  While not expressly necessary (you could add), this requires 
less code, and more importantly, it is known to work.

> 
> 
>>  		phdr[index].p_paddr  = ramdisk_base;
>>  		phdr[index].p_vaddr  = ramdisk_base;
>>  		phdr[index].p_filesz = ramdisk_size;
> 
> 
> Please keep in mind to also include Signed-off-by: lines from all who
> have touched the patch. Please see
> http://www.coreboot.org/Development_Guidelines#Sign-off_Procedure
> 

OK, he agreed.  Attached is the same patch with his signing off (but not 
me since I didn't change it.)

Warren Togami
wtogami at redhat.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mkelfImage-2.7-ramdisk_base.patch
Type: text/x-patch
Size: 2646 bytes
Desc: not available
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20080610/8be6ac4e/attachment.patch>


More information about the coreboot mailing list