1/* 2 * uClinux flat-format executables 3 * 4 * Copyright 2003-2009 Analog Devices Inc. 5 * 6 * Licensed under the GPL-2 7 */ 8 9#ifndef __BLACKFIN_FLAT_H__ 10#define __BLACKFIN_FLAT_H__ 11 12#include <asm/unaligned.h> 13 14#define flat_argvp_envp_on_stack() 0 15#define flat_old_ram_flag(flags) (flags) 16 17extern unsigned long bfin_get_addr_from_rp (unsigned long *ptr, 18 unsigned long relval, 19 unsigned long flags, 20 unsigned long *persistent); 21 22extern void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr, 23 unsigned long relval); 24 25/* The amount by which a relocation can exceed the program image limits 26 without being regarded as an error. */ 27 28#define flat_reloc_valid(reloc, size) ((reloc) <= (size)) 29 30#define flat_get_addr_from_rp(rp, relval, flags, persistent) \ 31 bfin_get_addr_from_rp(rp, relval, flags, persistent) 32#define flat_put_addr_at_rp(rp, val, relval) \ 33 bfin_put_addr_at_rp(rp, val, relval) 34 35/* Convert a relocation entry into an address. */ 36static inline unsigned long 37flat_get_relocate_addr (unsigned long relval) 38{ 39 return relval & 0x03ffffff; /* Mask out top 6 bits */ 40} 41 42static inline int flat_set_persistent(unsigned long relval, 43 unsigned long *persistent) 44{ 45 int type = (relval >> 26) & 7; 46 if (type == 3) { 47 *persistent = relval << 16; 48 return 1; 49 } 50 return 0; 51} 52 53static inline int flat_addr_absolute(unsigned long relval) 54{ 55 return (relval & (1 << 29)) != 0; 56} 57 58#endif /* __BLACKFIN_FLAT_H__ */ 59