linux/arch/powerpc/include/asm/thread_info.h
<<
>>
Prefs
   1/* thread_info.h: PowerPC low-level thread information
   2 * adapted from the i386 version by Paul Mackerras
   3 *
   4 * Copyright (C) 2002  David Howells (dhowells@redhat.com)
   5 * - Incorporating suggestions made by Linus Torvalds and Dave Miller
   6 */
   7
   8#ifndef _ASM_POWERPC_THREAD_INFO_H
   9#define _ASM_POWERPC_THREAD_INFO_H
  10
  11#ifdef __KERNEL__
  12
  13/* We have 8k stacks on ppc32 and 16k on ppc64 */
  14
  15#if defined(CONFIG_PPC64)
  16#define THREAD_SHIFT            14
  17#elif defined(CONFIG_PPC_256K_PAGES)
  18#define THREAD_SHIFT            15
  19#else
  20#define THREAD_SHIFT            13
  21#endif
  22
  23#define THREAD_SIZE             (1 << THREAD_SHIFT)
  24
  25#ifdef CONFIG_PPC64
  26#define CURRENT_THREAD_INFO(dest, sp)   clrrdi dest, sp, THREAD_SHIFT
  27#else
  28#define CURRENT_THREAD_INFO(dest, sp)   rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT
  29#endif
  30
  31#ifndef __ASSEMBLY__
  32#include <linux/cache.h>
  33#include <asm/processor.h>
  34#include <asm/page.h>
  35#include <linux/stringify.h>
  36
  37/*
  38 * low level task data.
  39 */
  40struct thread_info {
  41        struct task_struct *task;               /* main task structure */
  42        struct exec_domain *exec_domain;        /* execution domain */
  43        int             cpu;                    /* cpu we're on */
  44        int             preempt_count;          /* 0 => preemptable,
  45                                                   <0 => BUG */
  46        struct restart_block restart_block;
  47        unsigned long   local_flags;            /* private flags for thread */
  48
  49        /* low level flags - has atomic operations done on it */
  50        unsigned long   flags ____cacheline_aligned_in_smp;
  51};
  52
  53/*
  54 * macros/functions for gaining access to the thread information structure
  55 */
  56#define INIT_THREAD_INFO(tsk)                   \
  57{                                               \
  58        .task =         &tsk,                   \
  59        .exec_domain =  &default_exec_domain,   \
  60        .cpu =          0,                      \
  61        .preempt_count = INIT_PREEMPT_COUNT,    \
  62        .restart_block = {                      \
  63                .fn = do_no_restart_syscall,    \
  64        },                                      \
  65        .flags =        0,                      \
  66}
  67
  68#define init_thread_info        (init_thread_union.thread_info)
  69#define init_stack              (init_thread_union.stack)
  70
  71#define THREAD_SIZE_ORDER       (THREAD_SHIFT - PAGE_SHIFT)
  72
  73/* how to get the thread information struct from C */
  74static inline struct thread_info *current_thread_info(void)
  75{
  76        register unsigned long sp asm("r1");
  77
  78        /* gcc4, at least, is smart enough to turn this into a single
  79         * rlwinm for ppc32 and clrrdi for ppc64 */
  80        return (struct thread_info *)(sp & ~(THREAD_SIZE-1));
  81}
  82
  83#endif /* __ASSEMBLY__ */
  84
  85#define PREEMPT_ACTIVE          0x10000000
  86
  87/*
  88 * thread information flag bit numbers
  89 */
  90#define TIF_SYSCALL_TRACE       0       /* syscall trace active */
  91#define TIF_SIGPENDING          1       /* signal pending */
  92#define TIF_NEED_RESCHED        2       /* rescheduling necessary */
  93#define TIF_POLLING_NRFLAG      3       /* true if poll_idle() is polling
  94                                           TIF_NEED_RESCHED */
  95#define TIF_32BIT               4       /* 32 bit binary */
  96#define TIF_PERFMON_WORK        5       /* work for pfm_handle_work() */
  97#define TIF_PERFMON_CTXSW       6       /* perfmon needs ctxsw calls */
  98#define TIF_SYSCALL_AUDIT       7       /* syscall auditing active */
  99#define TIF_SINGLESTEP          8       /* singlestepping active */
 100#define TIF_NOHZ                9       /* in adaptive nohz mode */
 101#define TIF_SECCOMP             10      /* secure computing */
 102#define TIF_RESTOREALL          11      /* Restore all regs (implies NOERROR) */
 103#define TIF_NOERROR             12      /* Force successful syscall return */
 104#define TIF_NOTIFY_RESUME       13      /* callback before returning to user */
 105#define TIF_UPROBE              14      /* breakpointed or single-stepping */
 106#define TIF_SYSCALL_TRACEPOINT  15      /* syscall tracepoint instrumentation */
 107#define TIF_EMULATE_STACK_STORE 16      /* Is an instruction emulation
 108                                                for stack store? */
 109#define TIF_MEMDIE              17      /* is terminating due to OOM killer */
 110
 111/* as above, but as bit values */
 112#define _TIF_SYSCALL_TRACE      (1<<TIF_SYSCALL_TRACE)
 113#define _TIF_SIGPENDING         (1<<TIF_SIGPENDING)
 114#define _TIF_NEED_RESCHED       (1<<TIF_NEED_RESCHED)
 115#define _TIF_POLLING_NRFLAG     (1<<TIF_POLLING_NRFLAG)
 116#define _TIF_32BIT              (1<<TIF_32BIT)
 117#define _TIF_PERFMON_WORK       (1<<TIF_PERFMON_WORK)
 118#define _TIF_PERFMON_CTXSW      (1<<TIF_PERFMON_CTXSW)
 119#define _TIF_SYSCALL_AUDIT      (1<<TIF_SYSCALL_AUDIT)
 120#define _TIF_SINGLESTEP         (1<<TIF_SINGLESTEP)
 121#define _TIF_SECCOMP            (1<<TIF_SECCOMP)
 122#define _TIF_RESTOREALL         (1<<TIF_RESTOREALL)
 123#define _TIF_NOERROR            (1<<TIF_NOERROR)
 124#define _TIF_NOTIFY_RESUME      (1<<TIF_NOTIFY_RESUME)
 125#define _TIF_UPROBE             (1<<TIF_UPROBE)
 126#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
 127#define _TIF_EMULATE_STACK_STORE        (1<<TIF_EMULATE_STACK_STORE)
 128#define _TIF_NOHZ               (1<<TIF_NOHZ)
 129#define _TIF_SYSCALL_T_OR_A     (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
 130                                 _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
 131                                 _TIF_NOHZ)
 132
 133#define _TIF_USER_WORK_MASK     (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
 134                                 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
 135#define _TIF_PERSYSCALL_MASK    (_TIF_RESTOREALL|_TIF_NOERROR)
 136
 137/* Bits in local_flags */
 138/* Don't move TLF_NAPPING without adjusting the code in entry_32.S */
 139#define TLF_NAPPING             0       /* idle thread enabled NAP mode */
 140#define TLF_SLEEPING            1       /* suspend code enabled SLEEP mode */
 141#define TLF_RESTORE_SIGMASK     2       /* Restore signal mask in do_signal */
 142#define TLF_LAZY_MMU            3       /* tlb_batch is active */
 143#define TLF_RUNLATCH            4       /* Is the runlatch enabled? */
 144
 145#define _TLF_NAPPING            (1 << TLF_NAPPING)
 146#define _TLF_SLEEPING           (1 << TLF_SLEEPING)
 147#define _TLF_RESTORE_SIGMASK    (1 << TLF_RESTORE_SIGMASK)
 148#define _TLF_LAZY_MMU           (1 << TLF_LAZY_MMU)
 149#define _TLF_RUNLATCH           (1 << TLF_RUNLATCH)
 150
 151#ifndef __ASSEMBLY__
 152#define HAVE_SET_RESTORE_SIGMASK        1
 153static inline void set_restore_sigmask(void)
 154{
 155        struct thread_info *ti = current_thread_info();
 156        ti->local_flags |= _TLF_RESTORE_SIGMASK;
 157        WARN_ON(!test_bit(TIF_SIGPENDING, &ti->flags));
 158}
 159static inline void clear_restore_sigmask(void)
 160{
 161        current_thread_info()->local_flags &= ~_TLF_RESTORE_SIGMASK;
 162}
 163static inline bool test_restore_sigmask(void)
 164{
 165        return current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK;
 166}
 167static inline bool test_and_clear_restore_sigmask(void)
 168{
 169        struct thread_info *ti = current_thread_info();
 170        if (!(ti->local_flags & _TLF_RESTORE_SIGMASK))
 171                return false;
 172        ti->local_flags &= ~_TLF_RESTORE_SIGMASK;
 173        return true;
 174}
 175
 176static inline bool test_thread_local_flags(unsigned int flags)
 177{
 178        struct thread_info *ti = current_thread_info();
 179        return (ti->local_flags & flags) != 0;
 180}
 181
 182#ifdef CONFIG_PPC64
 183#define is_32bit_task() (test_thread_flag(TIF_32BIT))
 184#else
 185#define is_32bit_task() (1)
 186#endif
 187
 188#endif  /* !__ASSEMBLY__ */
 189
 190#endif /* __KERNEL__ */
 191
 192#endif /* _ASM_POWERPC_THREAD_INFO_H */
 193