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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-m68k/processor.h
  3.  *
  4.  * Copyright (C) 1995 Hamish Macdonald
  5.  */
  6. #ifndef __ASM_M68K_PROCESSOR_H
  7. #define __ASM_M68K_PROCESSOR_H
  8. /*
  9.  * Default implementation of macro that returns current
  10.  * instruction pointer ("program counter").
  11.  */
  12. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  13. #include <linux/config.h>
  14. #include <asm/segment.h>
  15. #include <asm/fpu.h>
  16. #include <asm/ptrace.h>
  17. extern inline unsigned long rdusp(void) {
  18.    unsigned long usp;
  19. __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
  20. return usp;
  21. }
  22. extern inline void wrusp(unsigned long usp) {
  23. __asm__ __volatile__("move %0,%/usp" : : "a" (usp));
  24. }
  25. /*
  26.  * User space process size: 3.75GB. This is hardcoded into a few places,
  27.  * so don't change it unless you know what you are doing.
  28.  */
  29. #ifndef CONFIG_SUN3
  30. #define TASK_SIZE (0xF0000000UL)
  31. #else
  32. #ifdef __ASSEMBLY__
  33. #define TASK_SIZE (0x0E000000)
  34. #else
  35. #define TASK_SIZE (0x0E000000UL)
  36. #endif
  37. #endif
  38. /* This decides where the kernel will search for a free chunk of vm
  39.  * space during mmap's.
  40.  */
  41. #ifndef CONFIG_SUN3
  42. #define TASK_UNMAPPED_BASE 0xC0000000UL
  43. #else
  44. #define TASK_UNMAPPED_BASE 0x0A000000UL
  45. #endif
  46. #define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr)
  47. /*
  48.  * Bus types
  49.  */
  50. #define EISA_bus 0
  51. #define MCA_bus 0
  52. /* 
  53.  * if you change this structure, you must change the code and offsets
  54.  * in m68k/machasm.S
  55.  */
  56.    
  57. struct thread_struct {
  58. unsigned long  ksp; /* kernel stack pointer */
  59. unsigned long  usp; /* user stack pointer */
  60. unsigned short sr; /* saved status register */
  61. unsigned short fs; /* saved fs (sfc, dfc) */
  62. unsigned long  crp[2]; /* cpu root pointer */
  63. unsigned long  esp0; /* points to SR of stack frame */
  64. unsigned long  faddr; /* info about last fault */
  65. int            signo, code;
  66. unsigned long  fp[8*3];
  67. unsigned long  fpcntl[3]; /* fp control regs */
  68. unsigned char  fpstate[FPSTATESIZE];  /* floating point state */
  69. };
  70. #define INIT_THREAD  { 
  71. sizeof(init_stack) + (unsigned long) init_stack, 0, 
  72. PS_S, __KERNEL_DS, 
  73. }
  74. /*
  75.  * Do necessary setup to start up a newly executed thread.
  76.  */
  77. static inline void start_thread(struct pt_regs * regs, unsigned long pc,
  78. unsigned long usp)
  79. {
  80. /* reads from user space */
  81. set_fs(USER_DS);
  82. regs->pc = pc;
  83. regs->sr &= ~0x2000;
  84. wrusp(usp);
  85. }
  86. /* Forward declaration, a strange C thing */
  87. struct task_struct;
  88. /* Free all resources held by a thread. */
  89. static inline void release_thread(struct task_struct *dead_task)
  90. {
  91. }
  92. extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  93. #define copy_segments(tsk, mm) do { } while (0)
  94. #define release_segments(mm) do { } while (0)
  95. /*
  96.  * Free current thread data structures etc..
  97.  */
  98. static inline void exit_thread(void)
  99. {
  100. }
  101. /*
  102.  * Return saved PC of a blocked thread.
  103.  */
  104. extern inline unsigned long thread_saved_pc(struct thread_struct *t)
  105. {
  106. extern void scheduling_functions_start_here(void);
  107. extern void scheduling_functions_end_here(void);
  108. struct switch_stack *sw = (struct switch_stack *)t->ksp;
  109. /* Check whether the thread is blocked in resume() */
  110. if (sw->retpc > (unsigned long)scheduling_functions_start_here &&
  111.     sw->retpc < (unsigned long)scheduling_functions_end_here)
  112. return ((unsigned long *)sw->a6)[1];
  113. else
  114. return sw->retpc;
  115. }
  116. unsigned long get_wchan(struct task_struct *p);
  117. #define KSTK_EIP(tsk)
  118.     ({
  119. unsigned long eip = 0;  
  120. if ((tsk)->thread.esp0 > PAGE_SIZE && 
  121.     (VALID_PAGE(virt_to_page((tsk)->thread.esp0)))) 
  122.       eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; 
  123. eip; })
  124. #define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
  125. #define THREAD_SIZE (2*PAGE_SIZE)
  126. /* Allocation and freeing of basic task resources. */
  127. #define alloc_task_struct() 
  128. ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
  129. #define free_task_struct(p) free_pages((unsigned long)(p),1)
  130. #define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
  131. #define init_task (init_task_union.task)
  132. #define init_stack (init_task_union.stack)
  133. #define cpu_relax() do { } while (0)
  134. #endif