at v2.6.29 170 lines 4.8 kB view raw
1/* MN10300 Low-level thread information 2 * 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11 12#ifndef _ASM_THREAD_INFO_H 13#define _ASM_THREAD_INFO_H 14 15#ifdef __KERNEL__ 16 17#include <asm/page.h> 18 19#ifndef __ASSEMBLY__ 20#include <asm/processor.h> 21#endif 22 23#define PREEMPT_ACTIVE 0x10000000 24 25#ifdef CONFIG_4KSTACKS 26#define THREAD_SIZE (4096) 27#else 28#define THREAD_SIZE (8192) 29#endif 30 31#define STACK_WARN (THREAD_SIZE / 8) 32 33/* 34 * low level task data that entry.S needs immediate access to 35 * - this struct should fit entirely inside of one cache line 36 * - this struct shares the supervisor stack pages 37 * - if the contents of this structure are changed, the assembly constants 38 * must also be changed 39 */ 40#ifndef __ASSEMBLY__ 41 42struct thread_info { 43 struct task_struct *task; /* main task structure */ 44 struct exec_domain *exec_domain; /* execution domain */ 45 unsigned long flags; /* low level flags */ 46 __u32 cpu; /* current CPU */ 47 __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ 48 49 mm_segment_t addr_limit; /* thread address space: 50 0-0xBFFFFFFF for user-thead 51 0-0xFFFFFFFF for kernel-thread 52 */ 53 struct restart_block restart_block; 54 55 __u8 supervisor_stack[0]; 56}; 57 58#else /* !__ASSEMBLY__ */ 59 60#ifndef __ASM_OFFSETS_H__ 61#include <asm/asm-offsets.h> 62#endif 63 64#endif 65 66/* 67 * macros/functions for gaining access to the thread information structure 68 * 69 * preempt_count needs to be 1 initially, until the scheduler is functional. 70 */ 71#ifndef __ASSEMBLY__ 72 73#define INIT_THREAD_INFO(tsk) \ 74{ \ 75 .task = &tsk, \ 76 .exec_domain = &default_exec_domain, \ 77 .flags = 0, \ 78 .cpu = 0, \ 79 .preempt_count = 1, \ 80 .addr_limit = KERNEL_DS, \ 81 .restart_block = { \ 82 .fn = do_no_restart_syscall, \ 83 }, \ 84} 85 86#define init_thread_info (init_thread_union.thread_info) 87#define init_stack (init_thread_union.stack) 88#define init_uregs \ 89 ((struct pt_regs *) \ 90 ((unsigned long) init_stack + THREAD_SIZE - sizeof(struct pt_regs))) 91 92extern struct thread_info *__current_ti; 93 94/* how to get the thread information struct from C */ 95static inline __attribute__((const)) 96struct thread_info *current_thread_info(void) 97{ 98 struct thread_info *ti; 99 asm("mov sp,%0\n" 100 "and %1,%0\n" 101 : "=d" (ti) 102 : "i" (~(THREAD_SIZE - 1)) 103 : "cc"); 104 return ti; 105} 106 107/* how to get the current stack pointer from C */ 108static inline unsigned long current_stack_pointer(void) 109{ 110 unsigned long sp; 111 asm("mov sp,%0; ":"=r" (sp)); 112 return sp; 113} 114 115#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR 116 117/* thread information allocation */ 118#ifdef CONFIG_DEBUG_STACK_USAGE 119#define alloc_thread_info(tsk) kzalloc(THREAD_SIZE, GFP_KERNEL) 120#else 121#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) 122#endif 123 124#define free_thread_info(ti) kfree((ti)) 125#define get_thread_info(ti) get_task_struct((ti)->task) 126#define put_thread_info(ti) put_task_struct((ti)->task) 127 128#else /* !__ASSEMBLY__ */ 129 130#ifndef __VMLINUX_LDS__ 131/* how to get the thread information struct from ASM */ 132.macro GET_THREAD_INFO reg 133 mov sp,\reg 134 and -THREAD_SIZE,\reg 135.endm 136#endif 137#endif 138 139/* 140 * thread information flags 141 * - these are process state flags that various assembly files may need to 142 * access 143 * - pending work-to-be-done flags are in LSW 144 * - other flags in MSW 145 */ 146#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 147#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ 148#define TIF_SIGPENDING 2 /* signal pending */ 149#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 150#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ 151#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ 152#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ 153#define TIF_MEMDIE 17 /* OOM killer killed process */ 154#define TIF_FREEZE 18 /* freezing for suspend */ 155 156#define _TIF_SYSCALL_TRACE +(1 << TIF_SYSCALL_TRACE) 157#define _TIF_NOTIFY_RESUME +(1 << TIF_NOTIFY_RESUME) 158#define _TIF_SIGPENDING +(1 << TIF_SIGPENDING) 159#define _TIF_NEED_RESCHED +(1 << TIF_NEED_RESCHED) 160#define _TIF_SINGLESTEP +(1 << TIF_SINGLESTEP) 161#define _TIF_RESTORE_SIGMASK +(1 << TIF_RESTORE_SIGMASK) 162#define _TIF_POLLING_NRFLAG +(1 << TIF_POLLING_NRFLAG) 163#define _TIF_FREEZE +(1 << TIF_FREEZE) 164 165#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 166#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ 167 168#endif /* __KERNEL__ */ 169 170#endif /* _ASM_THREAD_INFO_H */