1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * (C) Copyright 2011 4 * Graeme Russ, <graeme.russ@gmail.com> 5 */ 6 7 #ifndef _RELOCATE_H_ 8 #define _RELOCATE_H_ 9 10 #ifndef USE_HOSTCC 11 #include <asm/global_data.h> 12 13 DECLARE_GLOBAL_DATA_PTR; 14 #endif 15 16 /** 17 * copy_uboot_to_ram() - Copy U-Boot to its new relocated position 18 * 19 * @return 0 if OK, -ve on error 20 */ 21 int copy_uboot_to_ram(void); 22 23 /** 24 * clear_bss() - Clear the BSS (Blocked Start by Symbol) segment 25 * 26 * This clears the memory used by global variables 27 * 28 * @return 0 if OK, -ve on error 29 */ 30 int clear_bss(void); 31 32 /** 33 * do_elf_reloc_fixups() - Fix up ELF relocations in the relocated code 34 * 35 * This processes the relocation tables to ensure that the code can run in its 36 * new location. 37 * 38 * @return 0 if OK, -ve on error 39 */ 40 int do_elf_reloc_fixups(void); 41 42 /** 43 * manual_reloc() - Manually relocate a pointer if needed 44 * 45 * This is a nop in almost all cases, except for the systems with a broken gcc 46 * which need to manually relocate some things. 47 * 48 * @ptr: Pointer to relocate 49 * @return new pointer value 50 */ manual_reloc(void * ptr)51static inline void *manual_reloc(void *ptr) 52 { 53 #ifndef USE_HOSTCC 54 if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) 55 return ptr + gd->reloc_off; 56 #endif 57 return ptr; 58 } 59 60 #if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) 61 #define MANUAL_RELOC(ptr) (ptr) = manual_reloc(ptr) 62 #else 63 #define MANUAL_RELOC(ptr) (void)(ptr) 64 #endif 65 66 #endif /* _RELOCATE_H_ */ 67