1/* 2 * include/asm-v850/thread_info.h -- v850 low-level thread information 3 * 4 * Copyright (C) 2002 NEC Corporation 5 * Copyright (C) 2002 Miles Bader <miles@gnu.org> 6 * Copyright (C) 2002 David Howells (dhowells@redhat.com) 7 * - Incorporating suggestions made by Linus Torvalds and Dave Miller 8 * 9 * This file is subject to the terms and conditions of the GNU General 10 * Public License. See the file COPYING in the main directory of this 11 * archive for more details. 12 * 13 * This file was derived from the PPC version, include/asm-ppc/thread_info.h 14 * which was adapted from the i386 version by Paul Mackerras 15 */ 16 17#ifndef __V850_THREAD_INFO_H__ 18#define __V850_THREAD_INFO_H__ 19 20#ifdef __KERNEL__ 21 22#ifndef __ASSEMBLY__ 23 24/* 25 * low level task data. 26 * If you change this, change the TI_* offsets below to match. 27 */ 28struct thread_info { 29 struct task_struct *task; /* main task structure */ 30 struct exec_domain *exec_domain; /* execution domain */ 31 unsigned long flags; /* low level flags */ 32 int cpu; /* cpu we're on */ 33 int preempt_count; /* 0 => preemptable, 34 <0 => BUG */ 35 struct restart_block restart_block; 36}; 37 38#define INIT_THREAD_INFO(tsk) \ 39{ \ 40 .task = &tsk, \ 41 .exec_domain = &default_exec_domain, \ 42 .flags = 0, \ 43 .cpu = 0, \ 44 .preempt_count = 1, \ 45 .restart_block = { \ 46 .fn = do_no_restart_syscall, \ 47 }, \ 48} 49 50#define init_thread_info (init_thread_union.thread_info) 51#define init_stack (init_thread_union.stack) 52 53/* 54 * macros/functions for gaining access to the thread information structure 55 */ 56 57/* thread information allocation */ 58#define alloc_thread_info(tsk) ((struct thread_info *) \ 59 __get_free_pages(GFP_KERNEL, 1)) 60#define free_thread_info(ti) free_pages((unsigned long) (ti), 1) 61 62#endif /* __ASSEMBLY__ */ 63 64 65/* 66 * Offsets in thread_info structure, used in assembly code 67 */ 68#define TI_TASK 0 69#define TI_EXECDOMAIN 4 70#define TI_FLAGS 8 71#define TI_CPU 12 72#define TI_PREEMPT 16 73 74#define PREEMPT_ACTIVE 0x4000000 75 76/* 77 * thread information flag bit numbers 78 */ 79#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 80#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ 81#define TIF_SIGPENDING 2 /* signal pending */ 82#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 83#define TIF_POLLING_NRFLAG 4 /* true if poll_idle() is polling 84 TIF_NEED_RESCHED */ 85#define TIF_MEMDIE 5 86 87/* as above, but as bit values */ 88#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 89#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 90#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 91#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 92#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 93 94 95/* Size of kernel stack for each process. */ 96#define THREAD_SIZE 0x2000 97 98/* The alignment of kernel threads, with thread_info structures at their 99 base. Thus, a pointer for a task's task structure can be derived from 100 its kernel stack pointer. */ 101#define THREAD_ALIGNMENT THREAD_SIZE 102#define THREAD_MASK (-THREAD_ALIGNMENT) 103 104 105#ifdef __ASSEMBLY__ 106 107/* Put a pointer to the current thread_info structure into REG. Note that 108 this definition requires THREAD_MASK to be representable as a signed 109 16-bit value. */ 110#define GET_CURRENT_THREAD(reg) \ 111 /* Use `addi' and then `and' instead of just `andi', because \ 112 `addi' sign-extends the immediate value, whereas `andi' \ 113 zero-extends it. */ \ 114 addi THREAD_MASK, r0, reg; \ 115 and sp, reg 116 117#else 118 119/* Return a pointer to the current thread_info structure. */ 120static inline struct thread_info *current_thread_info (void) 121{ 122 register unsigned long sp __asm__ ("sp"); 123 return (struct thread_info *)(sp & THREAD_MASK); 124} 125 126#endif /* __ASSEMBLY__ */ 127 128 129#endif /* __KERNEL__ */ 130 131#endif /* __V850_THREAD_INFO_H__ */ 132