home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-powerpc / processor.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.6 KB  |  267 lines

  1. #ifndef _ASM_POWERPC_PROCESSOR_H
  2. #define _ASM_POWERPC_PROCESSOR_H
  3.  
  4. /*
  5.  * Copyright (C) 2001 PPC 64 Team, IBM Corp
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  */
  12.  
  13. #include <asm/reg.h>
  14.  
  15. #ifndef __ASSEMBLY__
  16. #include <linux/compiler.h>
  17. #include <asm/ptrace.h>
  18. #include <asm/types.h>
  19.  
  20. /* We do _not_ want to define new machine types at all, those must die
  21.  * in favor of using the device-tree
  22.  * -- BenH.
  23.  */
  24.  
  25. /* PREP sub-platform types see residual.h for these */
  26. #define _PREP_Motorola    0x01    /* motorola prep */
  27. #define _PREP_Firm    0x02    /* firmworks prep */
  28. #define _PREP_IBM    0x00    /* ibm prep */
  29. #define _PREP_Bull    0x03    /* bull prep */
  30.  
  31. /* CHRP sub-platform types. These are arbitrary */
  32. #define _CHRP_Motorola    0x04    /* motorola chrp, the cobra */
  33. #define _CHRP_IBM    0x05    /* IBM chrp, the longtrail and longtrail 2 */
  34. #define _CHRP_Pegasos    0x06    /* Genesi/bplan's Pegasos and Pegasos2 */
  35.  
  36. #if defined(__KERNEL__) && defined(CONFIG_PPC32)
  37.  
  38. extern int _chrp_type;
  39.  
  40. #ifdef CONFIG_PPC_PREP
  41.  
  42. /* what kind of prep workstation we are */
  43. extern int _prep_type;
  44.  
  45. /*
  46.  * This is used to identify the board type from a given PReP board
  47.  * vendor. Board revision is also made available. This will be moved
  48.  * elsewhere soon
  49.  */
  50. extern unsigned char ucBoardRev;
  51. extern unsigned char ucBoardRevMaj, ucBoardRevMin;
  52.  
  53. #endif /* CONFIG_PPC_PREP */
  54.  
  55. #ifndef CONFIG_PPC_MULTIPLATFORM
  56. #define _machine 0
  57. #endif /* CONFIG_PPC_MULTIPLATFORM */
  58.  
  59. #endif /* defined(__KERNEL__) && defined(CONFIG_PPC32) */
  60.  
  61. /*
  62.  * Default implementation of macro that returns current
  63.  * instruction pointer ("program counter").
  64.  */
  65. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  66.  
  67. /* Macros for adjusting thread priority (hardware multi-threading) */
  68. #define HMT_very_low()   asm volatile("or 31,31,31   # very low priority")
  69. #define HMT_low()     asm volatile("or 1,1,1         # low priority")
  70. #define HMT_medium_low() asm volatile("or 6,6,6      # medium low priority")
  71. #define HMT_medium()     asm volatile("or 2,2,2         # medium priority")
  72. #define HMT_medium_high() asm volatile("or 5,5,5      # medium high priority")
  73. #define HMT_high()     asm volatile("or 3,3,3         # high priority")
  74.  
  75. #ifdef __KERNEL__
  76.  
  77. extern int have_of;
  78.  
  79. struct task_struct;
  80. void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);
  81. void release_thread(struct task_struct *);
  82.  
  83. /* Prepare to copy thread state - unlazy all lazy status */
  84. extern void prepare_to_copy(struct task_struct *tsk);
  85.  
  86. /* Create a new kernel thread. */
  87. extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
  88.  
  89. /* Lazy FPU handling on uni-processor */
  90. extern struct task_struct *last_task_used_math;
  91. extern struct task_struct *last_task_used_altivec;
  92. extern struct task_struct *last_task_used_spe;
  93.  
  94. #ifdef CONFIG_PPC32
  95. #define TASK_SIZE    (CONFIG_TASK_SIZE)
  96.  
  97. /* This decides where the kernel will search for a free chunk of vm
  98.  * space during mmap's.
  99.  */
  100. #define TASK_UNMAPPED_BASE    (TASK_SIZE / 8 * 3)
  101. #endif
  102.  
  103. #ifdef CONFIG_PPC64
  104. /* 64-bit user address space is 44-bits (16TB user VM) */
  105. #define TASK_SIZE_USER64 (0x0000100000000000UL)
  106.  
  107. /* 
  108.  * 32-bit user address space is 4GB - 1 page 
  109.  * (this 1 page is needed so referencing of 0xFFFFFFFF generates EFAULT
  110.  */
  111. #define TASK_SIZE_USER32 (0x0000000100000000UL - (1*PAGE_SIZE))
  112.  
  113. #define TASK_SIZE (test_thread_flag(TIF_32BIT) ? \
  114.         TASK_SIZE_USER32 : TASK_SIZE_USER64)
  115.  
  116. /* This decides where the kernel will search for a free chunk of vm
  117.  * space during mmap's.
  118.  */
  119. #define TASK_UNMAPPED_BASE_USER32 (PAGE_ALIGN(TASK_SIZE_USER32 / 4))
  120. #define TASK_UNMAPPED_BASE_USER64 (PAGE_ALIGN(TASK_SIZE_USER64 / 4))
  121.  
  122. #define TASK_UNMAPPED_BASE ((test_thread_flag(TIF_32BIT)) ? \
  123.         TASK_UNMAPPED_BASE_USER32 : TASK_UNMAPPED_BASE_USER64 )
  124. #endif
  125.  
  126. typedef struct {
  127.     unsigned long seg;
  128. } mm_segment_t;
  129.  
  130. struct thread_struct {
  131.     unsigned long    ksp;        /* Kernel stack pointer */
  132. #ifdef CONFIG_PPC64
  133.     unsigned long    ksp_vsid;
  134. #endif
  135.     struct pt_regs    *regs;        /* Pointer to saved register state */
  136.     mm_segment_t    fs;        /* for get_fs() validation */
  137. #ifdef CONFIG_PPC32
  138.     void        *pgdir;        /* root of page-table tree */
  139.     signed long    last_syscall;
  140. #endif
  141. #if defined(CONFIG_4xx) || defined (CONFIG_BOOKE)
  142.     unsigned long    dbcr0;        /* debug control register values */
  143.     unsigned long    dbcr1;
  144. #endif
  145.     double        fpr[32];    /* Complete floating point set */
  146.     struct {            /* fpr ... fpscr must be contiguous */
  147.  
  148.         unsigned int pad;
  149.         unsigned int val;    /* Floating point status */
  150.     } fpscr;
  151.     int        fpexc_mode;    /* floating-point exception mode */
  152. #ifdef CONFIG_PPC64
  153.     unsigned long    start_tb;    /* Start purr when proc switched in */
  154.     unsigned long    accum_tb;    /* Total accumilated purr for process */
  155. #endif
  156.     unsigned long    vdso_base;    /* base of the vDSO library */
  157.     unsigned long    dabr;        /* Data address breakpoint register */
  158. #ifdef CONFIG_ALTIVEC
  159.     /* Complete AltiVec register set */
  160.     vector128    vr[32] __attribute((aligned(16)));
  161.     /* AltiVec status */
  162.     vector128    vscr __attribute((aligned(16)));
  163.     unsigned long    vrsave;
  164.     int        used_vr;    /* set if process has used altivec */
  165. #endif /* CONFIG_ALTIVEC */
  166. #ifdef CONFIG_SPE
  167.     unsigned long    evr[32];    /* upper 32-bits of SPE regs */
  168.     u64        acc;        /* Accumulator */
  169.     unsigned long    spefscr;    /* SPE & eFP status */
  170.     int        used_spe;    /* set if process has used spe */
  171. #endif /* CONFIG_SPE */
  172. };
  173.  
  174. #define ARCH_MIN_TASKALIGN 16
  175.  
  176. #define INIT_SP        (sizeof(init_stack) + (unsigned long) &init_stack)
  177.  
  178.  
  179. #ifdef CONFIG_PPC32
  180. #define INIT_THREAD { \
  181.     .ksp = INIT_SP, \
  182.     .fs = KERNEL_DS, \
  183.     .pgdir = swapper_pg_dir, \
  184.     .fpexc_mode = MSR_FE0 | MSR_FE1, \
  185. }
  186. #else
  187. #define INIT_THREAD  { \
  188.     .ksp = INIT_SP, \
  189.     .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
  190.     .fs = KERNEL_DS, \
  191.     .fpr = {0}, \
  192.     .fpscr = { .val = 0, }, \
  193.     .fpexc_mode = MSR_FE0|MSR_FE1, \
  194. }
  195. #endif
  196.  
  197. /*
  198.  * Return saved PC of a blocked thread. For now, this is the "user" PC
  199.  */
  200. #define thread_saved_pc(tsk)    \
  201.         ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0)
  202.  
  203. unsigned long get_wchan(struct task_struct *p);
  204.  
  205. #define KSTK_EIP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0)
  206. #define KSTK_ESP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->gpr[1]: 0)
  207.  
  208. /* Get/set floating-point exception mode */
  209. #define GET_FPEXC_CTL(tsk, adr) get_fpexc_mode((tsk), (adr))
  210. #define SET_FPEXC_CTL(tsk, val) set_fpexc_mode((tsk), (val))
  211.  
  212. extern int get_fpexc_mode(struct task_struct *tsk, unsigned long adr);
  213. extern int set_fpexc_mode(struct task_struct *tsk, unsigned int val);
  214.  
  215. static inline unsigned int __unpack_fe01(unsigned long msr_bits)
  216. {
  217.     return ((msr_bits & MSR_FE0) >> 10) | ((msr_bits & MSR_FE1) >> 8);
  218. }
  219.  
  220. static inline unsigned long __pack_fe01(unsigned int fpmode)
  221. {
  222.     return ((fpmode << 10) & MSR_FE0) | ((fpmode << 8) & MSR_FE1);
  223. }
  224.  
  225. #ifdef CONFIG_PPC64
  226. #define cpu_relax()    do { HMT_low(); HMT_medium(); barrier(); } while (0)
  227. #else
  228. #define cpu_relax()    barrier()
  229. #endif
  230.  
  231. /* Check that a certain kernel stack pointer is valid in task_struct p */
  232. int validate_sp(unsigned long sp, struct task_struct *p,
  233.                        unsigned long nbytes);
  234.  
  235. /*
  236.  * Prefetch macros.
  237.  */
  238. #define ARCH_HAS_PREFETCH
  239. #define ARCH_HAS_PREFETCHW
  240. #define ARCH_HAS_SPINLOCK_PREFETCH
  241.  
  242. static inline void prefetch(const void *x)
  243. {
  244.     if (unlikely(!x))
  245.         return;
  246.  
  247.     __asm__ __volatile__ ("dcbt 0,%0" : : "r" (x));
  248. }
  249.  
  250. static inline void prefetchw(const void *x)
  251. {
  252.     if (unlikely(!x))
  253.         return;
  254.  
  255.     __asm__ __volatile__ ("dcbtst 0,%0" : : "r" (x));
  256. }
  257.  
  258. #define spin_lock_prefetch(x)    prefetchw(x)
  259.  
  260. #ifdef CONFIG_PPC64
  261. #define HAVE_ARCH_PICK_MMAP_LAYOUT
  262. #endif
  263.  
  264. #endif /* __KERNEL__ */
  265. #endif /* __ASSEMBLY__ */
  266. #endif /* _ASM_POWERPC_PROCESSOR_H */
  267.