| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * (C) Copyright 2011 |
| * Graeme Russ, <graeme.russ@gmail.com> |
| */ |
| |
| #ifndef _RELOCATE_H_ |
| #define _RELOCATE_H_ |
| |
| #ifndef USE_HOSTCC |
| #include <asm/global_data.h> |
| |
| DECLARE_GLOBAL_DATA_PTR; |
| #endif |
| |
| /** |
| * copy_uboot_to_ram() - Copy U-Boot to its new relocated position |
| * |
| * Return: 0 if OK, -ve on error |
| */ |
| int copy_uboot_to_ram(void); |
| |
| /** |
| * clear_bss() - Clear the BSS (Blocked Start by Symbol) segment |
| * |
| * This clears the memory used by global variables |
| * |
| * Return: 0 if OK, -ve on error |
| */ |
| int clear_bss(void); |
| |
| /** |
| * do_elf_reloc_fixups() - Fix up ELF relocations in the relocated code |
| * |
| * This processes the relocation tables to ensure that the code can run in its |
| * new location. |
| * |
| * Return: 0 if OK, -ve on error |
| */ |
| int do_elf_reloc_fixups(void); |
| |
| /** |
| * manual_reloc() - Manually relocate a pointer if needed |
| * |
| * This is a nop in almost all cases, except for the systems with a broken gcc |
| * which need to manually relocate some things. |
| * |
| * @ptr: Pointer to relocate |
| * Return: new pointer value |
| */ |
| static inline void *manual_reloc(void *ptr) |
| { |
| #ifndef USE_HOSTCC |
| if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) |
| return ptr + gd->reloc_off; |
| #endif |
| return ptr; |
| } |
| |
| #if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) |
| #define MANUAL_RELOC(ptr) (ptr) = manual_reloc(ptr) |
| #else |
| #define MANUAL_RELOC(ptr) (void)(ptr) |
| #endif |
| |
| #endif /* _RELOCATE_H_ */ |