@@ -710,10 +710,19 @@ static inline void set32(volatile unsigned int *addr, unsigned int val)
710710 );
711711}
712712
713+ /* longcall attribute for functions in .ramcode — callers in .text need
714+ * indirect calls since .ramcode VMA is ~143MB from .text VMA,
715+ * exceeding PPC bl +/-32MB range */
716+ #if defined(__WOLFBOOT ) && defined(RAM_CODE ) && defined(ARCH_PPC )
717+ #define LONGCALL_ATTR __attribute__((longcall))
718+ #else
719+ #define LONGCALL_ATTR
720+ #endif
721+
713722/* C version in boot_ppc.c */
714- extern void set_tlb (uint8_t tlb , uint8_t esel , uint32_t epn , uint32_t rpn ,
715- uint32_t urpn , uint8_t perms , uint8_t wimge , uint8_t ts , uint8_t tsize ,
716- uint8_t iprot );
723+ extern void LONGCALL_ATTR set_tlb (uint8_t tlb , uint8_t esel , uint32_t epn ,
724+ uint32_t rpn , uint32_t urpn , uint8_t perms , uint8_t wimge , uint8_t ts ,
725+ uint8_t tsize , uint8_t iprot );
717726extern void disable_tlb1 (uint8_t esel );
718727extern void flush_cache (uint32_t start_addr , uint32_t size );
719728extern void set_law (uint8_t idx , uint32_t addr_h , uint32_t addr_l ,
@@ -723,12 +732,12 @@ extern void set_law(uint8_t idx, uint32_t addr_h, uint32_t addr_l,
723732extern void uart_init (void );
724733
725734/* from boot_ppc_start.S */
726- extern unsigned long long get_ticks (void );
727- extern void wait_ticks (unsigned long long );
735+ extern unsigned long long LONGCALL_ATTR get_ticks (void );
736+ extern void LONGCALL_ATTR wait_ticks (unsigned long long );
728737extern unsigned long get_pc (void );
729738extern void relocate_code (uint32_t * dest , uint32_t * src , uint32_t length );
730- extern void invalidate_dcache (void );
731- extern void invalidate_icache (void );
739+ extern void LONGCALL_ATTR invalidate_dcache (void );
740+ extern void LONGCALL_ATTR invalidate_icache (void );
732741extern void icache_enable (void );
733742extern void dcache_enable (void );
734743extern void dcache_disable (void );
0 commit comments