1024b246eSLinus Torvalds #ifndef _ALPHA_THREAD_INFO_H 2024b246eSLinus Torvalds #define _ALPHA_THREAD_INFO_H 3024b246eSLinus Torvalds 4024b246eSLinus Torvalds #ifdef __KERNEL__ 5024b246eSLinus Torvalds 6024b246eSLinus Torvalds #ifndef __ASSEMBLY__ 7024b246eSLinus Torvalds #include <asm/processor.h> 8024b246eSLinus Torvalds #include <asm/types.h> 9024b246eSLinus Torvalds #include <asm/hwrpb.h> 10024b246eSLinus Torvalds #endif 11024b246eSLinus Torvalds 12024b246eSLinus Torvalds #ifndef __ASSEMBLY__ 13024b246eSLinus Torvalds struct thread_info { 14024b246eSLinus Torvalds struct pcb_struct pcb; /* palcode state */ 15024b246eSLinus Torvalds 16024b246eSLinus Torvalds struct task_struct *task; /* main task structure */ 17024b246eSLinus Torvalds unsigned int flags; /* low level flags */ 18024b246eSLinus Torvalds unsigned int ieee_state; /* see fpu.h */ 19024b246eSLinus Torvalds 20024b246eSLinus Torvalds struct exec_domain *exec_domain; /* execution domain */ 21024b246eSLinus Torvalds mm_segment_t addr_limit; /* thread address space */ 22024b246eSLinus Torvalds unsigned cpu; /* current CPU */ 23024b246eSLinus Torvalds int preempt_count; /* 0 => preemptable, <0 => BUG */ 24024b246eSLinus Torvalds 25024b246eSLinus Torvalds int bpt_nsaved; 26024b246eSLinus Torvalds unsigned long bpt_addr[2]; /* breakpoint handling */ 27024b246eSLinus Torvalds unsigned int bpt_insn[2]; 28024b246eSLinus Torvalds 29024b246eSLinus Torvalds struct restart_block restart_block; 30024b246eSLinus Torvalds }; 31024b246eSLinus Torvalds 32024b246eSLinus Torvalds /* 33024b246eSLinus Torvalds * Macros/functions for gaining access to the thread information structure. 34024b246eSLinus Torvalds */ 35024b246eSLinus Torvalds #define INIT_THREAD_INFO(tsk) \ 36024b246eSLinus Torvalds { \ 37024b246eSLinus Torvalds .task = &tsk, \ 38024b246eSLinus Torvalds .exec_domain = &default_exec_domain, \ 39024b246eSLinus Torvalds .addr_limit = KERNEL_DS, \ 40c99e6efeSPeter Zijlstra .preempt_count = INIT_PREEMPT_COUNT, \ 41024b246eSLinus Torvalds .restart_block = { \ 42024b246eSLinus Torvalds .fn = do_no_restart_syscall, \ 43024b246eSLinus Torvalds }, \ 44024b246eSLinus Torvalds } 45024b246eSLinus Torvalds 46024b246eSLinus Torvalds #define init_thread_info (init_thread_union.thread_info) 47024b246eSLinus Torvalds #define init_stack (init_thread_union.stack) 48024b246eSLinus Torvalds 49024b246eSLinus Torvalds /* How to get the thread information struct from C. */ 50024b246eSLinus Torvalds register struct thread_info *__current_thread_info __asm__("$8"); 51024b246eSLinus Torvalds #define current_thread_info() __current_thread_info 52024b246eSLinus Torvalds 5315f3c476SAndrew Morton #endif /* __ASSEMBLY__ */ 5415f3c476SAndrew Morton 55024b246eSLinus Torvalds /* Thread information allocation. */ 56024b246eSLinus Torvalds #define THREAD_SIZE_ORDER 1 57024b246eSLinus Torvalds #define THREAD_SIZE (2*PAGE_SIZE) 58024b246eSLinus Torvalds 59024b246eSLinus Torvalds #define PREEMPT_ACTIVE 0x40000000 60024b246eSLinus Torvalds 61024b246eSLinus Torvalds /* 62024b246eSLinus Torvalds * Thread information flags: 63024b246eSLinus Torvalds * - these are process state flags and used from assembly 64*745dd240SMichael Cree * - pending work-to-be-done flags come first and must be assigned to be 65*745dd240SMichael Cree * within bits 0 to 7 to fit in and immediate operand. 66*745dd240SMichael Cree * - ALPHA_UAC_SHIFT below must be kept consistent with the unaligned 67*745dd240SMichael Cree * control flags. 68024b246eSLinus Torvalds * 69024b246eSLinus Torvalds * TIF_SYSCALL_TRACE is known to be 0 via blbs. 70024b246eSLinus Torvalds */ 71024b246eSLinus Torvalds #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 72*745dd240SMichael Cree #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ 73*745dd240SMichael Cree #define TIF_SIGPENDING 2 /* signal pending */ 74*745dd240SMichael Cree #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 75*745dd240SMichael Cree #define TIF_POLLING_NRFLAG 8 /* poll_idle is polling NEED_RESCHED */ 76*745dd240SMichael Cree #define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */ 77*745dd240SMichael Cree #define TIF_UAC_NOPRINT 10 /* see sysinfo.h */ 78*745dd240SMichael Cree #define TIF_UAC_NOFIX 11 79*745dd240SMichael Cree #define TIF_UAC_SIGBUS 12 80*745dd240SMichael Cree #define TIF_MEMDIE 13 81*745dd240SMichael Cree #define TIF_RESTORE_SIGMASK 14 /* restore signal mask in do_signal */ 8283224b08SMatt Helsley #define TIF_FREEZE 16 /* is freezing for suspend */ 83024b246eSLinus Torvalds 84024b246eSLinus Torvalds #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 85024b246eSLinus Torvalds #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 86024b246eSLinus Torvalds #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 87024b246eSLinus Torvalds #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 88024b246eSLinus Torvalds #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) 89d0420c83SDavid Howells #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 9083224b08SMatt Helsley #define _TIF_FREEZE (1<<TIF_FREEZE) 91024b246eSLinus Torvalds 92024b246eSLinus Torvalds /* Work to do on interrupt/exception return. */ 93d0420c83SDavid Howells #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ 94d0420c83SDavid Howells _TIF_NOTIFY_RESUME) 95024b246eSLinus Torvalds 96024b246eSLinus Torvalds /* Work to do on any return to userspace. */ 97024b246eSLinus Torvalds #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ 98024b246eSLinus Torvalds | _TIF_SYSCALL_TRACE) 99024b246eSLinus Torvalds 100*745dd240SMichael Cree #define ALPHA_UAC_SHIFT 10 101024b246eSLinus Torvalds #define ALPHA_UAC_MASK (1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \ 102024b246eSLinus Torvalds 1 << TIF_UAC_SIGBUS) 103024b246eSLinus Torvalds 104024b246eSLinus Torvalds #define SET_UNALIGN_CTL(task,value) ({ \ 105024b246eSLinus Torvalds task_thread_info(task)->flags = ((task_thread_info(task)->flags & \ 106024b246eSLinus Torvalds ~ALPHA_UAC_MASK) \ 107024b246eSLinus Torvalds | (((value) << ALPHA_UAC_SHIFT) & (1<<TIF_UAC_NOPRINT))\ 108024b246eSLinus Torvalds | (((value) << (ALPHA_UAC_SHIFT + 1)) & (1<<TIF_UAC_SIGBUS)) \ 109024b246eSLinus Torvalds | (((value) << (ALPHA_UAC_SHIFT - 1)) & (1<<TIF_UAC_NOFIX)));\ 110024b246eSLinus Torvalds 0; }) 111024b246eSLinus Torvalds 112024b246eSLinus Torvalds #define GET_UNALIGN_CTL(task,value) ({ \ 113024b246eSLinus Torvalds put_user((task_thread_info(task)->flags & (1 << TIF_UAC_NOPRINT))\ 114024b246eSLinus Torvalds >> ALPHA_UAC_SHIFT \ 115024b246eSLinus Torvalds | (task_thread_info(task)->flags & (1 << TIF_UAC_SIGBUS))\ 116024b246eSLinus Torvalds >> (ALPHA_UAC_SHIFT + 1) \ 117024b246eSLinus Torvalds | (task_thread_info(task)->flags & (1 << TIF_UAC_NOFIX))\ 118024b246eSLinus Torvalds >> (ALPHA_UAC_SHIFT - 1), \ 119024b246eSLinus Torvalds (int __user *)(value)); \ 120024b246eSLinus Torvalds }) 121024b246eSLinus Torvalds 122024b246eSLinus Torvalds #endif /* __KERNEL__ */ 123024b246eSLinus Torvalds #endif /* _ALPHA_THREAD_INFO_H */ 124