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 13DECLARE_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 */ 21int 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 */ 30int 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 */ 40int 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 */ 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