processor.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: processor.h,v 1.83 2001/10/08 09:32:13 davem Exp $
  2.  * include/asm-sparc/processor.h
  3.  *
  4.  * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
  5.  */
  6. #ifndef __ASM_SPARC_PROCESSOR_H
  7. #define __ASM_SPARC_PROCESSOR_H
  8. /*
  9.  * Sparc32 implementation of macro that returns current
  10.  * instruction pointer ("program counter").
  11.  */
  12. #define current_text_addr() ({ void *pc; __asm__("sethi %%hi(1f), %0; or %0, %%lo(1f), %0;n1:" : "=r" (pc)); pc; })
  13. #include <linux/a.out.h>
  14. #include <asm/psr.h>
  15. #include <asm/ptrace.h>
  16. #include <asm/head.h>
  17. #include <asm/signal.h>
  18. #include <asm/segment.h>
  19. #include <asm/btfixup.h>
  20. #include <asm/page.h>
  21. #include <asm/atomic.h>
  22. /*
  23.  * Bus types
  24.  */
  25. #define EISA_bus 0
  26. #define EISA_bus__is_a_macro /* for versions in ksyms.c */
  27. #define MCA_bus 0
  28. #define MCA_bus__is_a_macro /* for versions in ksyms.c */
  29. /*
  30.  * The sparc has no problems with write protection
  31.  */
  32. #define wp_works_ok 1
  33. #define wp_works_ok__is_a_macro /* for versions in ksyms.c */
  34. /* Whee, this is STACK_TOP + PAGE_SIZE and the lowest kernel address too... 
  35.  * That one page is used to protect kernel from intruders, so that
  36.  * we can make our access_ok test faster
  37.  */
  38. #define TASK_SIZE PAGE_OFFSET
  39. struct fpq {
  40. unsigned long *insn_addr;
  41. unsigned long insn;
  42. };
  43. typedef struct {
  44. int seg;
  45. } mm_segment_t;
  46. /* The Sparc processor specific thread struct. */
  47. struct thread_struct {
  48. unsigned long uwinmask __attribute__ ((aligned (8)));
  49. struct pt_regs *kregs;
  50. /* Context switch saved kernel state. */
  51. unsigned long ksp __attribute__ ((aligned (8)));
  52. unsigned long kpc;
  53. unsigned long kpsr;
  54. unsigned long kwim;
  55. /* Special child fork kpsr/kwim values. */
  56. unsigned long fork_kpsr __attribute__ ((aligned (8)));
  57. unsigned long fork_kwim;
  58. /* A place to store user windows and stack pointers
  59.  * when the stack needs inspection.
  60.  */
  61. #define NSWINS 8
  62. struct reg_window reg_window[NSWINS] __attribute__ ((aligned (8)));
  63. unsigned long rwbuf_stkptrs[NSWINS] __attribute__ ((aligned (8)));
  64. unsigned long w_saved;
  65. /* Floating point regs */
  66. unsigned long   float_regs[32] __attribute__ ((aligned (8)));
  67. unsigned long   fsr;
  68. unsigned long   fpqdepth;
  69. struct fpq fpqueue[16];
  70. unsigned long flags;
  71. mm_segment_t current_ds;
  72. struct exec core_exec;     /* just what it says. */
  73. int new_signal;
  74. atomic_t refcount; /* used for sun4c only */
  75. };
  76. #define SPARC_FLAG_KTHREAD      0x1    /* task is a kernel thread */
  77. #define SPARC_FLAG_UNALIGNED    0x2    /* is allowed to do unaligned accesses */
  78. #define INIT_THREAD  { 
  79. /* uwinmask, kregs, ksp, kpc, kpsr, kwim */ 
  80.    0,        0,     0,   0,   0,    0, 
  81. /* fork_kpsr, fork_kwim */ 
  82.    0,         0, 
  83. /* reg_window */  
  84. { { { 0, }, { 0, } }, }, 
  85. /* rwbuf_stkptrs */  
  86. { 0, 0, 0, 0, 0, 0, 0, 0, }, 
  87. /* w_saved */ 
  88.    0, 
  89. /* FPU regs */   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  90.                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 
  91. /* FPU status, FPU qdepth, FPU queue */ 
  92.    0,          0,  { { 0, 0, }, }, 
  93. /* flags,              current_ds, */ 
  94.    SPARC_FLAG_KTHREAD, KERNEL_DS, 
  95. /* core_exec */ 
  96. { 0, }, 
  97. /* new_signal */ 
  98.   0, 
  99. }
  100. /* Return saved PC of a blocked thread. */
  101. extern __inline__ unsigned long thread_saved_pc(struct thread_struct *t)
  102. {
  103. return t->kpc;
  104. }
  105. /* Do necessary setup to start up a newly executed thread. */
  106. extern __inline__ void start_thread(struct pt_regs * regs, unsigned long pc,
  107.     unsigned long sp)
  108. {
  109. register unsigned long zero asm("g1");
  110. regs->psr = (regs->psr & (PSR_CWP)) | PSR_S;
  111. regs->pc = ((pc & (~3)) - 4);
  112. regs->npc = regs->pc + 4;
  113. regs->y = 0;
  114. zero = 0;
  115. __asm__ __volatile__("stdt%%g0, [%0 + %3 + 0x00]nt"
  116.      "stdt%%g0, [%0 + %3 + 0x08]nt"
  117.      "stdt%%g0, [%0 + %3 + 0x10]nt"
  118.      "stdt%%g0, [%0 + %3 + 0x18]nt"
  119.      "stdt%%g0, [%0 + %3 + 0x20]nt"
  120.      "stdt%%g0, [%0 + %3 + 0x28]nt"
  121.      "stdt%%g0, [%0 + %3 + 0x30]nt"
  122.      "stt%1, [%0 + %3 + 0x38]nt"
  123.      "stt%%g0, [%0 + %3 + 0x3c]"
  124.      : : "r" (regs), "r" (sp - REGWIN_SZ), "r" (zero),
  125.      "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0])));
  126. }
  127. /* Free all resources held by a thread. */
  128. #define release_thread(tsk) do { } while(0)
  129. extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  130. #define copy_segments(tsk, mm) do { } while (0)
  131. #define release_segments(mm) do { } while (0)
  132. #define get_wchan(__TSK) 
  133. ({ extern void scheduling_functions_start_here(void); 
  134. extern void scheduling_functions_end_here(void); 
  135. unsigned long pc, fp, bias = 0; 
  136. unsigned long task_base = (unsigned long) (__TSK); 
  137.         unsigned long __ret = 0; 
  138. struct reg_window *rw; 
  139. int count = 0; 
  140. if (!(__TSK) || (__TSK) == current || 
  141.             (__TSK)->state == TASK_RUNNING) 
  142. goto __out; 
  143. fp = (__TSK)->thread.ksp + bias; 
  144. do { 
  145. /* Bogus frame pointer? */ 
  146. if (fp < (task_base + sizeof(struct task_struct)) || 
  147.     fp >= (task_base + (2 * PAGE_SIZE))) 
  148. break; 
  149. rw = (struct reg_window *) fp; 
  150. pc = rw->ins[7]; 
  151. if (pc < ((unsigned long) scheduling_functions_start_here) || 
  152.                     pc >= ((unsigned long) scheduling_functions_end_here)) { 
  153. __ret = pc; 
  154. goto __out; 
  155. fp = rw->ins[6] + bias; 
  156. } while (++count < 16); 
  157. __out: __ret; 
  158. })
  159. #define KSTK_EIP(tsk)  ((tsk)->thread.kregs->pc)
  160. #define KSTK_ESP(tsk)  ((tsk)->thread.kregs->u_regs[UREG_FP])
  161. #ifdef __KERNEL__
  162. #define THREAD_SIZE (2*PAGE_SIZE)
  163. extern struct task_struct *last_task_used_math;
  164. /* Allocation and freeing of basic task resources. */
  165. BTFIXUPDEF_CALL(struct task_struct *, alloc_task_struct, void)
  166. BTFIXUPDEF_CALL(void, free_task_struct, struct task_struct *)
  167. BTFIXUPDEF_CALL(void, get_task_struct, struct task_struct *)
  168. #define alloc_task_struct() BTFIXUP_CALL(alloc_task_struct)()
  169. #define free_task_struct(tsk) BTFIXUP_CALL(free_task_struct)(tsk)
  170. #define get_task_struct(tsk) BTFIXUP_CALL(get_task_struct)(tsk)
  171. #define init_task (init_task_union.task)
  172. #define init_stack (init_task_union.stack)
  173. #define cpu_relax() do { } while (0)
  174. #endif
  175. #endif /* __ASM_SPARC_PROCESSOR_H */