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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1994 Waldorf GMBH
  7.  * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Ralf Baechle
  8.  * Modified further for R[236]000 compatibility by Paul M. Antoine
  9.  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  10.  */
  11. #ifndef _ASM_PROCESSOR_H
  12. #define _ASM_PROCESSOR_H
  13. #include <linux/config.h>
  14. /*
  15.  * Return current * instruction pointer ("program counter").
  16.  *
  17.  * Two implementations.  The ``la'' version results in shorter code for
  18.  * the kernel which we assume to reside in the 32-bit compat address space.
  19.  * The  ``jal'' version is for use by modules which live in outer space.
  20.  * This is just a single instruction unlike the long dla macro expansion.
  21.  */
  22. #ifdef MODULE
  23. #define current_text_addr()
  24. ({
  25. void *_a;
  26. __asm__ ("jalt1f, %0nt"
  27. "1:"
  28. : "=r" (_a));
  29. _a;
  30. })
  31. #else
  32. #define current_text_addr()
  33. ({
  34. void *_a;
  35. __asm__ ("dlat%0, 1fnt"
  36. "1:"
  37. : "=r" (_a));
  38. _a;
  39. })
  40. #endif
  41. #if !defined (_LANGUAGE_ASSEMBLY)
  42. #include <asm/cachectl.h>
  43. #include <asm/mipsregs.h>
  44. #include <asm/reg.h>
  45. #include <asm/system.h>
  46. #if (defined(CONFIG_SGI_IP27))
  47. #include <asm/sn/types.h>
  48. #include <asm/sn/intr_public.h>
  49. #endif
  50. struct cpuinfo_mips {
  51. unsigned long udelay_val;
  52. unsigned long *pgd_quick;
  53. unsigned long *pmd_quick;
  54. unsigned long *pte_quick;
  55. unsigned long pgtable_cache_sz;
  56. unsigned long last_asn;
  57. unsigned long asid_cache;
  58. #if defined(CONFIG_SGI_IP27)
  59. cpuid_t p_cpuid; /* PROM assigned cpuid */
  60. cnodeid_t p_nodeid; /* my node ID in compact-id-space */
  61. nasid_t p_nasid; /* my node ID in numa-as-id-space */
  62. unsigned char p_slice; /* Physical position on node board */
  63. hub_intmasks_t p_intmasks; /* SN0 per-CPU interrupt masks */
  64. #endif
  65. } __attribute__((aligned(128)));
  66. /*
  67.  * System setup and hardware flags..
  68.  * XXX: Should go into mips_cpuinfo.
  69.  */
  70. extern char wait_available; /* only available on R4[26]00 */
  71. extern char cyclecounter_available; /* only available from R4000 upwards. */
  72. extern char dedicated_iv_available; /* some embedded MIPS like Nevada */
  73. extern char vce_available; /* Supports VCED / VCEI exceptions */
  74. extern char mips4_available; /* CPU has MIPS IV ISA or better */
  75. extern unsigned int vced_count, vcei_count;
  76. extern struct cpuinfo_mips cpu_data[];
  77. #ifdef CONFIG_SMP
  78. #define current_cpu_data cpu_data[smp_processor_id()]
  79. #else
  80. #define current_cpu_data cpu_data[0]
  81. #endif
  82. /*
  83.  * Bus types (default is ISA, but people can check others with these..)
  84.  * MCA_bus hardcoded to 0 for now.
  85.  *
  86.  * This needs to be extended since MIPS systems are being delivered with
  87.  * numerous different types of bus systems.
  88.  */
  89. extern int EISA_bus;
  90. #define MCA_bus 0
  91. #define MCA_bus__is_a_macro /* for versions in ksyms.c */
  92. /*
  93.  * MIPS has no problems with write protection
  94.  */
  95. #define wp_works_ok 1
  96. #define wp_works_ok__is_a_macro /* for versions in ksyms.c */
  97. /* Lazy FPU handling on uni-processor */
  98. extern struct task_struct *last_task_used_math;
  99. #ifndef CONFIG_SMP
  100. #define IS_FPU_OWNER() (last_task_used_math == current)
  101. #define CLEAR_FPU_OWNER() last_task_used_math = NULL;
  102. #else
  103. #define IS_FPU_OWNER() (current->flags & PF_USEDFPU)
  104. #define CLEAR_FPU_OWNER() current->flags &= ~PF_USEDFPU;
  105. #endif
  106. /*
  107.  * User space process size: 1TB. This is hardcoded into a few places,
  108.  * so don't change it unless you know what you are doing.  TASK_SIZE
  109.  * is limited to 1TB by the R4000 architecture; R10000 and better can
  110.  * support 16TB.
  111.  */
  112. #define TASK_SIZE32    0x80000000UL
  113. #define TASK_SIZE 0x10000000000UL
  114. /* This decides where the kernel will search for a free chunk of vm
  115.  * space during mmap's.
  116.  */
  117. #define TASK_UNMAPPED_BASE ((current->thread.mflags & MF_32BIT) ? 
  118. (TASK_SIZE32 / 3) : (TASK_SIZE / 3))
  119. /*
  120.  * Size of io_bitmap in longwords: 32 is ports 0-0x3ff.
  121.  */
  122. #define IO_BITMAP_SIZE 32
  123. #define NUM_FPU_REGS 32
  124. struct mips_fpu_hard_struct {
  125. unsigned long fp_regs[NUM_FPU_REGS];
  126. unsigned int control;
  127. };
  128. /*
  129.  * FIXME: no fpu emulator yet (but who cares anyway?)
  130.  */
  131. struct mips_fpu_soft_struct {
  132. long dummy;
  133. };
  134. union mips_fpu_union {
  135.         struct mips_fpu_hard_struct hard;
  136.         struct mips_fpu_soft_struct soft;
  137. };
  138. #define INIT_FPU { 
  139. {{0,},} 
  140. }
  141. typedef struct {
  142. unsigned long seg;
  143. } mm_segment_t;
  144. /*
  145.  * If you change thread_struct remember to change the #defines below too!
  146.  */
  147. struct thread_struct {
  148.         /* Saved main processor registers. */
  149.         unsigned long reg16;
  150. unsigned long reg17, reg18, reg19, reg20, reg21, reg22, reg23;
  151.         unsigned long reg29, reg30, reg31;
  152. /* Saved cp0 stuff. */
  153. unsigned long cp0_status;
  154. /* Saved fpu/fpu emulator stuff. */
  155. union mips_fpu_union fpu;
  156. /* Other stuff associated with the thread. */
  157. unsigned long cp0_badvaddr; /* Last user fault */
  158. unsigned long cp0_baduaddr; /* Last kernel fault accessing USEG */
  159. unsigned long error_code;
  160. unsigned long trap_no;
  161. #define MF_FIXADE 1 /* Fix address errors in software */
  162. #define MF_LOGADE 2 /* Log address errors to syslog */
  163. #define MF_32BIT  4 /* Process is in 32-bit compat mode */
  164. unsigned long mflags;
  165. mm_segment_t current_ds;
  166. unsigned long irix_trampoline;  /* Wheee... */
  167. unsigned long irix_oldctx;
  168. };
  169. #endif /* !defined (_LANGUAGE_ASSEMBLY) */
  170. #define INIT_THREAD  { 
  171.         /* 
  172.          * saved main processor registers 
  173.          */ 
  174. 0, 0, 0, 0, 0, 0, 0, 0, 
  175.                0, 0, 0, 
  176. /* 
  177.  * saved cp0 stuff 
  178.  */ 
  179. 0, 
  180. /* 
  181.  * saved fpu/fpu emulator stuff 
  182.  */ 
  183. INIT_FPU, 
  184. /* 
  185.  * Other stuff associated with the process 
  186.  */ 
  187. 0, 0, 0, 0, 
  188. /* 
  189.  * For now the default is to fix address errors 
  190.  */ 
  191. MF_FIXADE, { 0 }, 0, 0 
  192. }
  193. #ifdef __KERNEL__
  194. #define KERNEL_STACK_SIZE 0x4000
  195. #if !defined (_LANGUAGE_ASSEMBLY)
  196. /* Free all resources held by a thread. */
  197. #define release_thread(thread) do { } while(0)
  198. extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
  199. /* Copy and release all segment info associated with a VM */
  200. #define copy_segments(p, mm) do { } while(0)
  201. #define release_segments(mm) do { } while(0)
  202. /*
  203.  * Return saved PC of a blocked thread.
  204.  */
  205. extern inline unsigned long thread_saved_pc(struct thread_struct *t)
  206. {
  207. extern void ret_from_sys_call(void);
  208. /* New born processes are a special case */
  209. if (t->reg31 == (unsigned long) ret_from_sys_call)
  210. return t->reg31;
  211. return ((unsigned long*)t->reg29)[11];
  212. }
  213. #define user_mode(regs) (((regs)->cp0_status & ST0_KSU) == KSU_USER)
  214. /*
  215.  * Do necessary setup to start up a newly executed thread.
  216.  */
  217. #define start_thread(regs, pc, sp) 
  218. do {
  219. unsigned long __status;
  220. /* New thread looses kernel privileges. */
  221. __status = regs->cp0_status & ~(ST0_CU0|ST0_FR|ST0_KSU);
  222. __status |= KSU_USER;
  223. __status |= (current->thread.mflags & MF_32BIT) ? 0 : ST0_FR;
  224. regs->cp0_status = __status;
  225. regs->cp0_epc = pc;
  226. regs->regs[29] = sp;
  227. current->thread.current_ds = USER_DS;
  228. } while(0)
  229. unsigned long get_wchan(struct task_struct *p);
  230. #define __PT_REG(reg) ((long)&((struct pt_regs *)0)->reg - sizeof(struct pt_regs))
  231. #define __KSTK_TOS(tsk) ((unsigned long)(tsk) + KERNEL_STACK_SIZE - 32)
  232. #define KSTK_EIP(tsk) (*(unsigned long *)(__KSTK_TOS(tsk) + __PT_REG(cp0_epc)))
  233. #define KSTK_ESP(tsk) (*(unsigned long *)(__KSTK_TOS(tsk) + __PT_REG(regs[29])))
  234. /* Allocation and freeing of basic task resources. */
  235. /*
  236.  * NOTE! The task struct and the stack go together
  237.  */
  238. #define THREAD_SIZE (2*PAGE_SIZE)
  239. #define alloc_task_struct() 
  240. ((struct task_struct *) __get_free_pages(GFP_KERNEL, 2))
  241. #define free_task_struct(p) free_pages((unsigned long)(p), 2)
  242. #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count)
  243. #define init_task (init_task_union.task)
  244. #define init_stack (init_task_union.stack)
  245. #define cpu_relax() do { } while (0)
  246. #endif /* !defined (_LANGUAGE_ASSEMBLY) */
  247. #endif /* __KERNEL__ */
  248. /*
  249.  * Return_address is a replacement for __builtin_return_address(count)
  250.  * which on certain architectures cannot reasonably be implemented in GCC
  251.  * (MIPS, Alpha) or is unuseable with -fomit-frame-pointer (i386).
  252.  * Note that __builtin_return_address(x>=1) is forbidden because GCC
  253.  * aborts compilation on some CPUs.  It's simply not possible to unwind
  254.  * some CPU's stackframes.
  255.  *
  256.  * In gcc 2.8 and newer  __builtin_return_address works only for non-leaf
  257.  * functions.  We avoid the overhead of a function call by forcing the
  258.  * compiler to save the return address register on the stack.
  259.  */
  260. #define return_address() ({__asm__ __volatile__("":::"$31");__builtin_return_address(0);})
  261. #endif /* _ASM_PROCESSOR_H */