elf.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. /* The module loader only handles a few relocation types. */
  53. #ifndef __tilegx__
  54. #define R_TILE_32 1
  55. #define R_TILE_JOFFLONG_X1 15
  56. #define R_TILE_IMM16_X0_LO 25
  57. #define R_TILE_IMM16_X1_LO 26
  58. #define R_TILE_IMM16_X0_HA 29
  59. #define R_TILE_IMM16_X1_HA 30
  60. #else
  61. #define R_TILEGX_64 1
  62. #define R_TILEGX_JUMPOFF_X1 21
  63. #define R_TILEGX_IMM16_X0_HW0 36
  64. #define R_TILEGX_IMM16_X1_HW0 37
  65. #define R_TILEGX_IMM16_X0_HW1 38
  66. #define R_TILEGX_IMM16_X1_HW1 39
  67. #define R_TILEGX_IMM16_X0_HW2_LAST 48
  68. #define R_TILEGX_IMM16_X1_HW2_LAST 49
  69. #endif
  70. /* Use standard page size for core dumps. */
  71. #define ELF_EXEC_PAGESIZE PAGE_SIZE
  72. /*
  73. * This is the location that an ET_DYN program is loaded if exec'ed. Typical
  74. * use of this is to invoke "./ld.so someprog" to test out a new version of
  75. * the loader. We need to make sure that it is out of the way of the program
  76. * that it will "exec", and that there is sufficient room for the brk.
  77. */
  78. #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
  79. #define ELF_CORE_COPY_REGS(_dest, _regs) \
  80. memcpy((char *) &_dest, (char *) _regs, \
  81. sizeof(struct pt_regs));
  82. /* No additional FP registers to copy. */
  83. #define ELF_CORE_COPY_FPREGS(t, fpu) 0
  84. /*
  85. * This yields a mask that user programs can use to figure out what
  86. * instruction set this CPU supports. This could be done in user space,
  87. * but it's not easy, and we've already done it here.
  88. */
  89. #define ELF_HWCAP (0)
  90. /*
  91. * This yields a string that ld.so will use to load implementation
  92. * specific libraries for optimization. This is more specific in
  93. * intent than poking at uname or /proc/cpuinfo.
  94. */
  95. #define ELF_PLATFORM (NULL)
  96. extern void elf_plat_init(struct pt_regs *regs, unsigned long load_addr);
  97. #define ELF_PLAT_INIT(_r, load_addr) elf_plat_init(_r, load_addr)
  98. extern int dump_task_regs(struct task_struct *, elf_gregset_t *);
  99. #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
  100. /* Tilera Linux has no personalities currently, so no need to do anything. */
  101. #define SET_PERSONALITY(ex) do { } while (0)
  102. #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
  103. /* Support auto-mapping of the user interrupt vectors. */
  104. struct linux_binprm;
  105. extern int arch_setup_additional_pages(struct linux_binprm *bprm,
  106. int executable_stack);
  107. #ifdef CONFIG_COMPAT
  108. #define COMPAT_ELF_PLATFORM "tilegx-m32"
  109. /*
  110. * "Compat" binaries have the same machine type, but 32-bit class,
  111. * since they're not a separate machine type, but just a 32-bit
  112. * variant of the standard 64-bit architecture.
  113. */
  114. #define compat_elf_check_arch(x) \
  115. ((x)->e_ident[EI_CLASS] == ELFCLASS32 && \
  116. (x)->e_machine == CHIP_ELF_TYPE())
  117. #define compat_start_thread(regs, ip, usp) do { \
  118. regs->pc = ptr_to_compat_reg((void *)(ip)); \
  119. regs->sp = ptr_to_compat_reg((void *)(usp)); \
  120. } while (0)
  121. /*
  122. * Use SET_PERSONALITY to indicate compatibility via TS_COMPAT.
  123. */
  124. #undef SET_PERSONALITY
  125. #define SET_PERSONALITY(ex) \
  126. do { \
  127. current->personality = PER_LINUX; \
  128. current_thread_info()->status &= ~TS_COMPAT; \
  129. } while (0)
  130. #define COMPAT_SET_PERSONALITY(ex) \
  131. do { \
  132. current->personality = PER_LINUX_32BIT; \
  133. current_thread_info()->status |= TS_COMPAT; \
  134. } while (0)
  135. #define COMPAT_ELF_ET_DYN_BASE (0xffffffff / 3 * 2)
  136. #endif /* CONFIG_COMPAT */
  137. #endif /* _ASM_TILE_ELF_H */