diff options
author | Michal Simek <michal.simek@xilinx.com> | 2019-09-25 10:45:51 +0200 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2019-10-08 09:55:11 +0200 |
commit | 6131a36be6f046c1db044fdf449436fbe3fa8d21 (patch) | |
tree | ba20260364aa359622b56a479c4e534f224c016e /arch/microblaze/lib/bootm.c | |
parent | a750ded4667496b367bc1275246752a3092b2ca2 (diff) |
microblaze: Define arch_lmb_reserve
arch_lmb_reserve() protects U-Boot relocated code with stack not to be used
for image relocation.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Diffstat (limited to 'arch/microblaze/lib/bootm.c')
-rw-r--r-- | arch/microblaze/lib/bootm.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/microblaze/lib/bootm.c b/arch/microblaze/lib/bootm.c index ec332944d8..a74f1d1e55 100644 --- a/arch/microblaze/lib/bootm.c +++ b/arch/microblaze/lib/bootm.c @@ -15,6 +15,47 @@ #include <u-boot/zlib.h> #include <asm/byteorder.h> +DECLARE_GLOBAL_DATA_PTR; + +static ulong get_sp(void) +{ + ulong ret; + + asm("addik %0, r1, 0" : "=r"(ret) : ); + return ret; +} + +void arch_lmb_reserve(struct lmb *lmb) +{ + ulong sp, bank_end; + int bank; + + /* + * Booting a (Linux) kernel image + * + * Allocate space for command line and board info - the + * address should be as high as possible within the reach of + * the kernel (see CONFIG_SYS_BOOTMAPSZ settings), but in unused + * memory, which means far enough below the current stack + * pointer. + */ + sp = get_sp(); + debug("## Current stack ends at 0x%08lx ", sp); + + /* adjust sp by 4K to be safe */ + sp -= 4096; + for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) { + if (sp < gd->bd->bi_dram[bank].start) + continue; + bank_end = gd->bd->bi_dram[bank].start + + gd->bd->bi_dram[bank].size; + if (sp >= bank_end) + continue; + lmb_reserve(lmb, sp, bank_end - sp); + break; + } +} + int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images) { |