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-sparc64 / thread_info.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  8.3 KB  |  260 lines

  1. /* $Id: thread_info.h,v 1.1 2002/02/10 00:00:58 davem Exp $
  2.  * thread_info.h: sparc64 low-level thread information
  3.  *
  4.  * Copyright (C) 2002  David S. Miller (davem@redhat.com)
  5.  */
  6.  
  7. #ifndef _ASM_THREAD_INFO_H
  8. #define _ASM_THREAD_INFO_H
  9.  
  10. #ifdef __KERNEL__
  11.  
  12. #define NSWINS        7
  13.  
  14. #define TI_FLAG_BYTE_FAULT_CODE        0
  15. #define TI_FLAG_FAULT_CODE_SHIFT    56
  16. #define TI_FLAG_BYTE_WSTATE        1
  17. #define TI_FLAG_WSTATE_SHIFT        48
  18. #define TI_FLAG_BYTE_CWP        2
  19. #define TI_FLAG_CWP_SHIFT        40
  20. #define TI_FLAG_BYTE_CURRENT_DS        3
  21. #define TI_FLAG_CURRENT_DS_SHIFT    32
  22. #define TI_FLAG_BYTE_FPDEPTH        4
  23. #define TI_FLAG_FPDEPTH_SHIFT        24
  24. #define TI_FLAG_BYTE_WSAVED        5
  25. #define TI_FLAG_WSAVED_SHIFT        16
  26.  
  27. #include <asm/page.h>
  28.  
  29. #ifndef __ASSEMBLY__
  30.  
  31. #include <asm/ptrace.h>
  32. #include <asm/types.h>
  33.  
  34. struct task_struct;
  35. struct exec_domain;
  36.  
  37. struct thread_info {
  38.     /* D$ line 1 */
  39.     struct task_struct    *task;
  40.     unsigned long        flags;
  41.     __u8            cpu;
  42.     __u8            fpsaved[7];
  43.     unsigned long        ksp;
  44.  
  45.     /* D$ line 2 */
  46.     unsigned long        fault_address;
  47.     struct pt_regs        *kregs;
  48.     struct exec_domain    *exec_domain;
  49.     int            preempt_count;    /* 0 => preemptable, <0 => BUG */
  50.     __u8            new_child;
  51.     __u8            syscall_noerror;
  52.     __u16            __pad;
  53.  
  54.     unsigned long        *utraps;
  55.  
  56.     struct reg_window     reg_window[NSWINS];
  57.     unsigned long         rwbuf_stkptrs[NSWINS];
  58.  
  59.     unsigned long        gsr[7];
  60.     unsigned long        xfsr[7];
  61.  
  62.     __u64            __user *user_cntd0;
  63.     __u64            __user *user_cntd1;
  64.     __u64            kernel_cntd0, kernel_cntd1;
  65.     __u64            pcr_reg;
  66.  
  67.     struct restart_block    restart_block;
  68.  
  69.     struct pt_regs        *kern_una_regs;
  70.     unsigned int        kern_una_insn;
  71.  
  72.     unsigned long        fpregs[0] __attribute__ ((aligned(64)));
  73. };
  74.  
  75. #endif /* !(__ASSEMBLY__) */
  76.  
  77. /* offsets into the thread_info struct for assembly code access */
  78. #define TI_TASK        0x00000000
  79. #define TI_FLAGS    0x00000008
  80. #define TI_FAULT_CODE    (TI_FLAGS + TI_FLAG_BYTE_FAULT_CODE)
  81. #define TI_WSTATE    (TI_FLAGS + TI_FLAG_BYTE_WSTATE)
  82. #define TI_CWP        (TI_FLAGS + TI_FLAG_BYTE_CWP)
  83. #define TI_CURRENT_DS    (TI_FLAGS + TI_FLAG_BYTE_CURRENT_DS)
  84. #define TI_FPDEPTH    (TI_FLAGS + TI_FLAG_BYTE_FPDEPTH)
  85. #define TI_WSAVED    (TI_FLAGS + TI_FLAG_BYTE_WSAVED)
  86. #define TI_CPU        0x00000010
  87. #define TI_FPSAVED    0x00000011
  88. #define TI_KSP        0x00000018
  89. #define TI_FAULT_ADDR    0x00000020
  90. #define TI_KREGS    0x00000028
  91. #define TI_EXEC_DOMAIN    0x00000030
  92. #define TI_PRE_COUNT    0x00000038
  93. #define TI_NEW_CHILD    0x0000003c
  94. #define TI_SYS_NOERROR    0x0000003d
  95. #define TI_UTRAPS    0x00000040
  96. #define TI_REG_WINDOW    0x00000048
  97. #define TI_RWIN_SPTRS    0x000003c8    
  98. #define TI_GSR        0x00000400
  99. #define TI_XFSR        0x00000438
  100. #define TI_USER_CNTD0    0x00000470
  101. #define TI_USER_CNTD1    0x00000478
  102. #define TI_KERN_CNTD0    0x00000480
  103. #define TI_KERN_CNTD1    0x00000488
  104. #define TI_PCR        0x00000490
  105. #define TI_RESTART_BLOCK 0x00000498
  106. #define TI_KUNA_REGS    0x000004c0
  107. #define TI_KUNA_INSN    0x000004c8
  108. #define TI_FPREGS    0x00000500
  109.  
  110. /* We embed this in the uppermost byte of thread_info->flags */
  111. #define FAULT_CODE_WRITE    0x01    /* Write access, implies D-TLB       */
  112. #define FAULT_CODE_DTLB        0x02    /* Miss happened in D-TLB       */
  113. #define FAULT_CODE_ITLB        0x04    /* Miss happened in I-TLB       */
  114. #define FAULT_CODE_WINFIXUP    0x08    /* Miss happened during spill/fill */
  115. #define FAULT_CODE_BLKCOMMIT    0x10    /* Use blk-commit ASI in copy_page */
  116.  
  117. #if PAGE_SHIFT == 13
  118. #define THREAD_SIZE (2*PAGE_SIZE)
  119. #define THREAD_SHIFT (PAGE_SHIFT + 1)
  120. #else /* PAGE_SHIFT == 13 */
  121. #define THREAD_SIZE PAGE_SIZE
  122. #define THREAD_SHIFT PAGE_SHIFT
  123. #endif /* PAGE_SHIFT == 13 */
  124.  
  125. #define PREEMPT_ACTIVE        0x4000000
  126.  
  127. /*
  128.  * macros/functions for gaining access to the thread information structure
  129.  *
  130.  * preempt_count needs to be 1 initially, until the scheduler is functional.
  131.  */
  132. #ifndef __ASSEMBLY__
  133.  
  134. #define INIT_THREAD_INFO(tsk)                \
  135. {                            \
  136.     .task        =    &tsk,            \
  137.     .flags        = ((unsigned long)ASI_P) << TI_FLAG_CURRENT_DS_SHIFT,    \
  138.     .exec_domain    =    &default_exec_domain,    \
  139.     .preempt_count    =    1,            \
  140.     .restart_block    = {                \
  141.         .fn    =    do_no_restart_syscall,    \
  142.     },                        \
  143. }
  144.  
  145. #define init_thread_info    (init_thread_union.thread_info)
  146. #define init_stack        (init_thread_union.stack)
  147.  
  148. /* how to get the thread information struct from C */
  149. register struct thread_info *current_thread_info_reg asm("g6");
  150. #define current_thread_info()    (current_thread_info_reg)
  151.  
  152. /* thread information allocation */
  153. #if PAGE_SHIFT == 13
  154. #define __THREAD_INFO_ORDER    1
  155. #else /* PAGE_SHIFT == 13 */
  156. #define __THREAD_INFO_ORDER    0
  157. #endif /* PAGE_SHIFT == 13 */
  158.  
  159. #ifdef CONFIG_DEBUG_STACK_USAGE
  160. #define alloc_thread_info(tsk)                    \
  161. ({                                \
  162.     struct thread_info *ret;                \
  163.                                 \
  164.     ret = (struct thread_info *)                \
  165.       __get_free_pages(GFP_KERNEL, __THREAD_INFO_ORDER);    \
  166.     if (ret)                        \
  167.         memset(ret, 0, PAGE_SIZE<<__THREAD_INFO_ORDER);    \
  168.     ret;                            \
  169. })
  170. #else
  171. #define alloc_thread_info(tsk) \
  172.     ((struct thread_info *)__get_free_pages(GFP_KERNEL, __THREAD_INFO_ORDER))
  173. #endif
  174.  
  175. #define free_thread_info(ti) \
  176.     free_pages((unsigned long)(ti),__THREAD_INFO_ORDER)
  177.  
  178. #define __thread_flag_byte_ptr(ti)    \
  179.     ((unsigned char *)(&((ti)->flags)))
  180. #define __cur_thread_flag_byte_ptr    __thread_flag_byte_ptr(current_thread_info())
  181.  
  182. #define get_thread_fault_code()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FAULT_CODE])
  183. #define set_thread_fault_code(val)    (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FAULT_CODE] = (val))
  184. #define get_thread_wstate()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE])
  185. #define set_thread_wstate(val)        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSTATE] = (val))
  186. #define get_thread_cwp()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP])
  187. #define set_thread_cwp(val)        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CWP] = (val))
  188. #define get_thread_current_ds()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS])
  189. #define set_thread_current_ds(val)    (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_CURRENT_DS] = (val))
  190. #define get_thread_fpdepth()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH])
  191. #define set_thread_fpdepth(val)        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_FPDEPTH] = (val))
  192. #define get_thread_wsaved()        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED])
  193. #define set_thread_wsaved(val)        (__cur_thread_flag_byte_ptr[TI_FLAG_BYTE_WSAVED] = (val))
  194.  
  195. #endif /* !(__ASSEMBLY__) */
  196.  
  197. /*
  198.  * Thread information flags, only 16 bits are available as we encode
  199.  * other values into the upper 6 bytes.
  200.  *
  201.  * On trap return we need to test several values:
  202.  *
  203.  * user:    need_resched, notify_resume, sigpending, wsaved, perfctr
  204.  * kernel:    fpdepth
  205.  *
  206.  * So to check for work in the kernel case we simply load the fpdepth
  207.  * byte out of the flags and test it.  For the user case we encode the
  208.  * lower 3 bytes of flags as follows:
  209.  *    ----------------------------------------
  210.  *    | wsaved | flags byte 1 | flags byte 2 |
  211.  *    ----------------------------------------
  212.  * This optimizes the user test into:
  213.  *    ldx        [%g6 + TI_FLAGS], REG1
  214.  *    sethi        %hi(_TIF_USER_WORK_MASK), REG2
  215.  *    or        REG2, %lo(_TIF_USER_WORK_MASK), REG2
  216.  *    andcc        REG1, REG2, %g0
  217.  *    be,pt        no_work_to_do
  218.  *     nop
  219.  */
  220. #define TIF_SYSCALL_TRACE    0    /* syscall trace active */
  221. #define TIF_RESTORE_SIGMASK    1    /* restore signal mask in do_signal() */
  222. #define TIF_SIGPENDING        2    /* signal pending */
  223. #define TIF_NEED_RESCHED    3    /* rescheduling necessary */
  224. #define TIF_PERFCTR        4    /* performance counters active */
  225. #define TIF_UNALIGNED        5    /* allowed to do unaligned accesses */
  226. #define TIF_NEWSIGNALS        6    /* wants new-style signals */
  227. #define TIF_32BIT        7    /* 32-bit binary */
  228. /* flag bit 8 is available */
  229. #define TIF_SECCOMP        9    /* secure computing */
  230. #define TIF_SYSCALL_AUDIT    10    /* syscall auditing active */
  231. /* flag bit 11 is available */
  232. /* NOTE: Thread flags >= 12 should be ones we have no interest
  233.  *       in using in assembly, else we can't use the mask as
  234.  *       an immediate value in instructions such as andcc.
  235.  */
  236. #define TIF_ABI_PENDING        12
  237. #define TIF_MEMDIE        13
  238. #define TIF_POLLING_NRFLAG    14
  239.  
  240. #define _TIF_SYSCALL_TRACE    (1<<TIF_SYSCALL_TRACE)
  241. #define _TIF_SIGPENDING        (1<<TIF_SIGPENDING)
  242. #define _TIF_NEED_RESCHED    (1<<TIF_NEED_RESCHED)
  243. #define _TIF_PERFCTR        (1<<TIF_PERFCTR)
  244. #define _TIF_UNALIGNED        (1<<TIF_UNALIGNED)
  245. #define _TIF_NEWSIGNALS        (1<<TIF_NEWSIGNALS)
  246. #define _TIF_32BIT        (1<<TIF_32BIT)
  247. #define _TIF_SECCOMP        (1<<TIF_SECCOMP)
  248. #define _TIF_SYSCALL_AUDIT    (1<<TIF_SYSCALL_AUDIT)
  249. #define _TIF_RESTORE_SIGMASK    (1<<TIF_RESTORE_SIGMASK)
  250. #define _TIF_ABI_PENDING    (1<<TIF_ABI_PENDING)
  251. #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
  252.  
  253. #define _TIF_USER_WORK_MASK    ((0xff << TI_FLAG_WSAVED_SHIFT) | \
  254.                  (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | \
  255.                   _TIF_NEED_RESCHED | _TIF_PERFCTR))
  256.  
  257. #endif /* __KERNEL__ */
  258.  
  259. #endif /* _ASM_THREAD_INFO_H */
  260.