processor.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Process/processor support for the Hexagon architecture
  3. *
  4. * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 and
  8. * only version 2 as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18. * 02110-1301, USA.
  19. */
  20. #ifndef _ASM_PROCESSOR_H
  21. #define _ASM_PROCESSOR_H
  22. #ifndef __ASSEMBLY__
  23. #include <asm/mem-layout.h>
  24. #include <asm/registers.h>
  25. #include <asm/hexagon_vm.h>
  26. /* must be a macro */
  27. #define current_text_addr() ({ __label__ _l; _l: &&_l; })
  28. /* task_struct, defined elsewhere, is the "process descriptor" */
  29. struct task_struct;
  30. /* this is defined in arch/process.c */
  31. extern unsigned long thread_saved_pc(struct task_struct *tsk);
  32. extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
  33. /*
  34. * thread_struct is supposed to be for context switch data.
  35. * Specifically, to hold the state necessary to perform switch_to...
  36. */
  37. struct thread_struct {
  38. void *switch_sp;
  39. };
  40. /*
  41. * initializes thread_struct
  42. * The only thing we have in there is switch_sp
  43. * which doesn't really need to be initialized.
  44. */
  45. #define INIT_THREAD { \
  46. }
  47. #define cpu_relax() __vmyield()
  48. #define cpu_relax_lowlatency() cpu_relax()
  49. /*
  50. * Decides where the kernel will search for a free chunk of vm space during
  51. * mmaps.
  52. * See also arch_get_unmapped_area.
  53. * Doesn't affect if you have MAX_FIXED in the page flags set though...
  54. *
  55. * Apparently the convention is that ld.so will ask for "unmapped" private
  56. * memory to be allocated SOMEWHERE, but it also asks for memory explicitly
  57. * via MAP_FIXED at the lower * addresses starting at VA=0x0.
  58. *
  59. * If the two requests collide, you get authentic segfaulting action, so
  60. * you have to kick the "unmapped" base requests higher up.
  61. */
  62. #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE/3))
  63. #define task_pt_regs(task) \
  64. ((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE) - 1)
  65. #define KSTK_EIP(tsk) (pt_elr(task_pt_regs(tsk)))
  66. #define KSTK_ESP(tsk) (pt_psp(task_pt_regs(tsk)))
  67. /* Free all resources held by a thread; defined in process.c */
  68. extern void release_thread(struct task_struct *dead_task);
  69. /* Get wait channel for task P. */
  70. extern unsigned long get_wchan(struct task_struct *p);
  71. /* The following stuff is pretty HEXAGON specific. */
  72. /* This is really just here for __switch_to.
  73. Offsets are pulled via asm-offsets.c */
  74. /*
  75. * No real reason why VM and native switch stacks should be different.
  76. * Ultimately this should merge. Note that Rev C. ABI called out only
  77. * R24-27 as callee saved GPRs needing explicit attention (R29-31 being
  78. * dealt with automagically by allocframe), but the current ABI has
  79. * more, R16-R27. By saving more, the worst case is that we waste some
  80. * cycles if building with the old compilers.
  81. */
  82. struct hexagon_switch_stack {
  83. union {
  84. struct {
  85. unsigned long r16;
  86. unsigned long r17;
  87. };
  88. unsigned long long r1716;
  89. };
  90. union {
  91. struct {
  92. unsigned long r18;
  93. unsigned long r19;
  94. };
  95. unsigned long long r1918;
  96. };
  97. union {
  98. struct {
  99. unsigned long r20;
  100. unsigned long r21;
  101. };
  102. unsigned long long r2120;
  103. };
  104. union {
  105. struct {
  106. unsigned long r22;
  107. unsigned long r23;
  108. };
  109. unsigned long long r2322;
  110. };
  111. union {
  112. struct {
  113. unsigned long r24;
  114. unsigned long r25;
  115. };
  116. unsigned long long r2524;
  117. };
  118. union {
  119. struct {
  120. unsigned long r26;
  121. unsigned long r27;
  122. };
  123. unsigned long long r2726;
  124. };
  125. unsigned long fp;
  126. unsigned long lr;
  127. };
  128. #endif /* !__ASSEMBLY__ */
  129. #endif