[U-Boot] [PATCH] image: check "bootm_low" and "bootm_size" if "initrd_high" is missing

To boot Linux, we should prevent Initramdisk and FDT from going too high.
Currently, boot_relocate_fdt() checks "fdt_high" environment first, and then falls back to getenv_bootm_mapsize() + getenv_bootm_low() if "fdt_high" is missing.
On the other hand, boot_ramdisk_high() only checks "initrd_high" to get the address limit for the Initramdisk. We also want to let this case fall back to getenv_bootm_mapsize() + getenv_bootm_low().
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com ---
common/image.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/common/image.c b/common/image.c index c36927f..d63d9e0 100644 --- a/common/image.c +++ b/common/image.c @@ -1113,8 +1113,7 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, if (initrd_high == ~0) initrd_copy_to_ram = 0; } else { - /* not set, no restrictions to load high */ - initrd_high = ~0; + initrd_high = getenv_bootm_mapsize() + getenv_bootm_low(); }

On Thu, Dec 17, 2015 at 05:19:35PM +0900, Masahiro Yamada wrote:
To boot Linux, we should prevent Initramdisk and FDT from going too high.
OK, why? I could be entirely wrong here but I had thought for some reason that if the ramdisk was in "highmem" the kernel would relocate contents (or if compressed, uncompress to a non-highmem location). The FDT must be in lowmem as that tells the kernel where memory even is. Is this not the case? Thanks!

Hi Tom,
2016-01-05 4:59 GMT+09:00 Tom Rini trini@konsulko.com:
On Thu, Dec 17, 2015 at 05:19:35PM +0900, Masahiro Yamada wrote:
To boot Linux, we should prevent Initramdisk and FDT from going too high.
OK, why? I could be entirely wrong here but I had thought for some reason that if the ramdisk was in "highmem" the kernel would relocate contents (or if compressed, uncompress to a non-highmem location). The FDT must be in lowmem as that tells the kernel where memory even is. Is this not the case? Thanks!
Just in case, I asked this in the kernel ML.
See this thread: https://lkml.org/lkml/2016/1/8/169
Jon gave me the answer.
5. Load initramfs. ------------------
Existing boot loaders: OPTIONAL New boot loaders: OPTIONAL
If an initramfs is in use then, as with the dtb, it must be placed in a region of memory where the kernel decompressor will not overwrite it while also with the region which will be covered by the kernel's low-memory mapping.
A safe location is just above the device tree blob which itself will be loaded just above the 128MiB boundary from the start of RAM as recommended above.

On Sat, Jan 09, 2016 at 01:12:33AM +0900, Masahiro Yamada wrote:
Hi Tom,
2016-01-05 4:59 GMT+09:00 Tom Rini trini@konsulko.com:
On Thu, Dec 17, 2015 at 05:19:35PM +0900, Masahiro Yamada wrote:
To boot Linux, we should prevent Initramdisk and FDT from going too high.
OK, why? I could be entirely wrong here but I had thought for some reason that if the ramdisk was in "highmem" the kernel would relocate contents (or if compressed, uncompress to a non-highmem location). The FDT must be in lowmem as that tells the kernel where memory even is. Is this not the case? Thanks!
Just in case, I asked this in the kernel ML.
See this thread: https://lkml.org/lkml/2016/1/8/169
Jon gave me the answer.
- Load initramfs.
Existing boot loaders: OPTIONAL New boot loaders: OPTIONAL
If an initramfs is in use then, as with the dtb, it must be placed in a region of memory where the kernel decompressor will not overwrite it while also with the region which will be covered by the kernel's low-memory mapping.
A safe location is just above the device tree blob which itself will be loaded just above the 128MiB boundary from the start of RAM as recommended above.
Which explains why I picked the regions I picked for ti_armv7_common.h that I did. So, OK, thanks! I'll apply this patch shortly.

On Thu, Dec 17, 2015 at 05:19:35PM +0900, Masahiro Yamada wrote:
To boot Linux, we should prevent Initramdisk and FDT from going too high.
Currently, boot_relocate_fdt() checks "fdt_high" environment first, and then falls back to getenv_bootm_mapsize() + getenv_bootm_low() if "fdt_high" is missing.
On the other hand, boot_ramdisk_high() only checks "initrd_high" to get the address limit for the Initramdisk. We also want to let this case fall back to getenv_bootm_mapsize() + getenv_bootm_low().
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
Applied to u-boot/master, thanks!
participants (2)
-
Masahiro Yamada
-
Tom Rini