elf.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * Copyright 2010 Tilera Corporation. All Rights Reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation, version 2.
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  11. * NON INFRINGEMENT. See the GNU General Public License for
  12. * more details.
  13. */
  14. #ifndef _ASM_TILE_ELF_H
  15. #define _ASM_TILE_ELF_H
  16. /*
  17. * ELF register definitions.
  18. */
  19. #include <arch/chip.h>
  20. #include <linux/ptrace.h>
  21. #include <asm/byteorder.h>
  22. #include <asm/page.h>
  23. typedef unsigned long elf_greg_t;
  24. #define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))
  25. typedef elf_greg_t elf_gregset_t[ELF_NGREG];
  26. #define EM_TILE64 187
  27. #define EM_TILEPRO 188
  28. #define EM_TILEGX 191
  29. /* Provide a nominal data structure. */
  30. #define ELF_NFPREG 0
  31. typedef double elf_fpreg_t;
  32. typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
  33. #ifdef __tilegx__
  34. #define ELF_CLASS ELFCLASS64
  35. #else
  36. #define ELF_CLASS ELFCLASS32
  37. #endif
  38. #define ELF_DATA ELFDATA2LSB
  39. /*
  40. * There seems to be a bug in how compat_binfmt_elf.c works: it
  41. * #undefs ELF_ARCH, but it is then used in binfmt_elf.c for fill_note_info().
  42. * Hack around this by providing an enum value of ELF_ARCH.
  43. */
  44. enum { ELF_ARCH = CHIP_ELF_TYPE() };
  45. #define ELF_ARCH ELF_ARCH
  46. /*
  47. * This is used to ensure we don't load something for the wrong architecture.
  48. */
  49. #define elf_check_arch(x) \
  50. ((x)->e_ident[EI_CLASS] == ELF_CLASS && \
  51. ((x)->e_machine == CHIP_ELF_TYPE() || \
  52. (x)->e_machine == CHIP_COMPAT_ELF_TYPE()))
  53. /* The module loader only handles a few relocation types. */
  54. #ifndef __tilegx__
  55. #define R_TILE_32 1
  56. #define R_TILE_JOFFLONG_X1 15
  57. #define R_TILE_IMM16_X0_LO 25
  58. #define R_TILE_IMM16_X1_LO 26
  59. #define R_TILE_IMM16_X0_HA 29
  60. #define R_TILE_IMM16_X1_HA 30
  61. #else
  62. #define R_TILEGX_64 1
  63. #define R_TILEGX_JUMPOFF_X1 21
  64. #define R_TILEGX_IMM16_X0_HW0 36
  65. #define R_TILEGX_IMM16_X1_HW0 37
  66. #define R_TILEGX_IMM16_X0_HW1 38
  67. #define R_TILEGX_IMM16_X1_HW1 39
  68. #define R_TILEGX_IMM16_X0_HW2_LAST 48
  69. #define R_TILEGX_IMM16_X1_HW2_LAST 49
  70. #endif
  71. /* Use standard page size for core dumps. */
  72. #define ELF_EXEC_PAGESIZE PAGE_SIZE
  73. /*
  74. * This is the location that an ET_DYN program is loaded if exec'ed. Typical
  75. * use of this is to invoke "./ld.so someprog" to test out a new version of
  76. * the loader. We need to make sure that it is out of the way of the program
  77. * that it will "exec", and that there is sufficient room for the brk.
  78. */
  79. #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
  80. #define ELF_CORE_COPY_REGS(_dest, _regs) \
  81. memcpy((char *) &_dest, (char *) _regs, \
  82. sizeof(struct pt_regs));
  83. /* No additional FP registers to copy. */
  84. #define ELF_CORE_COPY_FPREGS(t, fpu) 0
  85. /*
  86. * This yields a mask that user programs can use to figure out what
  87. * instruction set this CPU supports. This could be done in user space,
  88. * but it's not easy, and we've already done it here.
  89. */
  90. #define ELF_HWCAP (0)
  91. /*
  92. * This yields a string that ld.so will use to load implementation
  93. * specific libraries for optimization. This is more specific in
  94. * intent than poking at uname or /proc/cpuinfo.
  95. */
  96. #define ELF_PLATFORM (NULL)
  97. extern void elf_plat_init(struct pt_regs *regs, unsigned long load_addr);
  98. #define ELF_PLAT_INIT(_r, load_addr) elf_plat_init(_r, load_addr)
  99. extern int dump_task_regs(struct task_struct *, elf_gregset_t *);
  100. #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
  101. /* Tilera Linux has no personalities currently, so no need to do anything. */
  102. #define SET_PERSONALITY(ex) do { } while (0)
  103. #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
  104. /* Support auto-mapping of the user interrupt vectors. */
  105. struct linux_binprm;
  106. extern int arch_setup_additional_pages(struct linux_binprm *bprm,
  107. int executable_stack);
  108. #ifdef CONFIG_COMPAT
  109. #define COMPAT_ELF_PLATFORM "tilegx-m32"
  110. /*
  111. * "Compat" binaries have the same machine type, but 32-bit class,
  112. * since they're not a separate machine type, but just a 32-bit
  113. * variant of the standard 64-bit architecture.
  114. */
  115. #define compat_elf_check_arch(x) \
  116. ((x)->e_ident[EI_CLASS] == ELFCLASS32 && \
  117. ((x)->e_machine == CHIP_ELF_TYPE() || \
  118. (x)->e_machine == CHIP_COMPAT_ELF_TYPE()))
  119. #define compat_start_thread(regs, ip, usp) do { \
  120. regs->pc = ptr_to_compat_reg((void *)(ip)); \
  121. regs->sp = ptr_to_compat_reg((void *)(usp)); \
  122. } while (0)
  123. /*
  124. * Use SET_PERSONALITY to indicate compatibility via TS_COMPAT.
  125. */
  126. #undef SET_PERSONALITY
  127. #define SET_PERSONALITY(ex) \
  128. do { \
  129. current->personality = PER_LINUX; \
  130. current_thread_info()->status &= ~TS_COMPAT; \
  131. } while (0)
  132. #define COMPAT_SET_PERSONALITY(ex) \
  133. do { \
  134. current->personality = PER_LINUX_32BIT; \
  135. current_thread_info()->status |= TS_COMPAT; \
  136. } while (0)
  137. #define COMPAT_ELF_ET_DYN_BASE (0xffffffff / 3 * 2)
  138. #endif /* CONFIG_COMPAT */
  139. #endif /* _ASM_TILE_ELF_H */