flat.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * arch/h8300/asm/include/flat.h -- uClinux flat-format executables
  4. */
  5. #ifndef __H8300_FLAT_H__
  6. #define __H8300_FLAT_H__
  7. #include <asm/unaligned.h>
  8. #define flat_argvp_envp_on_stack() 1
  9. #define flat_old_ram_flag(flags) 1
  10. #define flat_reloc_valid(reloc, size) ((reloc) <= (size))
  11. #define flat_set_persistent(relval, p) 0
  12. /*
  13. * on the H8 a couple of the relocations have an instruction in the
  14. * top byte. As there can only be 24bits of address space, we just
  15. * always preserve that 8bits at the top, when it isn't an instruction
  16. * is is 0 (davidm@snapgear.com)
  17. */
  18. #define flat_get_relocate_addr(rel) (rel & ~0x00000001)
  19. static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
  20. u32 *addr, u32 *persistent)
  21. {
  22. u32 val = get_unaligned((__force u32 *)rp);
  23. if (!(flags & FLAT_FLAG_GOTPIC))
  24. val &= 0x00ffffff;
  25. *addr = val;
  26. return 0;
  27. }
  28. static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
  29. {
  30. u32 *p = (__force u32 *)rp;
  31. put_unaligned((addr & 0x00ffffff) | (*(char *)p << 24), p);
  32. return 0;
  33. }
  34. #endif /* __H8300_FLAT_H__ */