Fix bug in the ubldr introduced in the rev.283035. The new code

fails to properly consider memory regions when the loader is
located below of those regions or engulfs their lower limit. This
results in "not enough RAM to load kernel" panic, which is totally
bogus. On top of that, there are some variables that can be left
unitialized in those cases, which might cause it fail with memory
access violation instead of panic while trying to load kernel to
a wrong or non-existing address of memory.

Augment the code to properly deal with the loader being below or
at the lower bound of the memory region in question. Also, don't
leave ununitialized variables behind.

Reviewed by:	ian
This commit is contained in:
Maxim Sobolev 2015-06-19 17:00:36 +00:00
parent daf514d0bb
commit 8f207db125
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284599

View file

@ -118,6 +118,13 @@ uboot_loadaddr(u_int type, void *data, uint64_t addr)
this_block = eubldr;
this_size = eblock - eubldr;
}
} else if (subldr < sblock && eubldr < eblock) {
/* Loader is below or engulfs the sblock */
this_block = (eubldr < sblock) ? sblock : eubldr;
this_size = eblock - this_block;
} else {
this_block = 0;
this_size = 0;
}
if (biggest_size < this_size) {
biggest_block = this_block;