1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* thread_info.h: h8300 low-level thread information
3*4882a593Smuzhiyun * adapted from the i386 and PPC versions by Yoshinori Sato <ysato@users.sourceforge.jp>
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2002 David Howells (dhowells@redhat.com)
6*4882a593Smuzhiyun * - Incorporating suggestions made by Linus Torvalds and Dave Miller
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef _ASM_THREAD_INFO_H
10*4882a593Smuzhiyun #define _ASM_THREAD_INFO_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <asm/page.h>
13*4882a593Smuzhiyun #include <asm/segment.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #ifdef __KERNEL__
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun /*
18*4882a593Smuzhiyun * Size of kernel stack for each process. This must be a power of 2...
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun #define THREAD_SIZE_ORDER 1
21*4882a593Smuzhiyun #define THREAD_SIZE 8192 /* 2 pages */
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #ifndef __ASSEMBLY__
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun /*
26*4882a593Smuzhiyun * low level task data.
27*4882a593Smuzhiyun * If you change this, change the TI_* offsets below to match.
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun struct thread_info {
30*4882a593Smuzhiyun struct task_struct *task; /* main task structure */
31*4882a593Smuzhiyun unsigned long flags; /* low level flags */
32*4882a593Smuzhiyun int cpu; /* cpu we're on */
33*4882a593Smuzhiyun int preempt_count; /* 0 => preemptable, <0 => BUG */
34*4882a593Smuzhiyun mm_segment_t addr_limit;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * macros/functions for gaining access to the thread information structure
39*4882a593Smuzhiyun */
40*4882a593Smuzhiyun #define INIT_THREAD_INFO(tsk) \
41*4882a593Smuzhiyun { \
42*4882a593Smuzhiyun .task = &tsk, \
43*4882a593Smuzhiyun .flags = 0, \
44*4882a593Smuzhiyun .cpu = 0, \
45*4882a593Smuzhiyun .preempt_count = INIT_PREEMPT_COUNT, \
46*4882a593Smuzhiyun .addr_limit = KERNEL_DS, \
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun /* how to get the thread information struct from C */
current_thread_info(void)50*4882a593Smuzhiyun static inline struct thread_info *current_thread_info(void)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun struct thread_info *ti;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun __asm__("mov.l sp, %0\n\t"
55*4882a593Smuzhiyun "and.w %1, %T0"
56*4882a593Smuzhiyun : "=&r"(ti)
57*4882a593Smuzhiyun : "i" (~(THREAD_SIZE-1) & 0xffff));
58*4882a593Smuzhiyun return ti;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun /*
64*4882a593Smuzhiyun * thread information flag bit numbers
65*4882a593Smuzhiyun */
66*4882a593Smuzhiyun #define TIF_SYSCALL_TRACE 0 /* syscall trace active */
67*4882a593Smuzhiyun #define TIF_SIGPENDING 1 /* signal pending */
68*4882a593Smuzhiyun #define TIF_NEED_RESCHED 2 /* rescheduling necessary */
69*4882a593Smuzhiyun #define TIF_SINGLESTEP 3 /* singlestepping active */
70*4882a593Smuzhiyun #define TIF_MEMDIE 4 /* is terminating due to OOM killer */
71*4882a593Smuzhiyun #define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
72*4882a593Smuzhiyun #define TIF_NOTIFY_RESUME 6 /* callback before returning to user */
73*4882a593Smuzhiyun #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
74*4882a593Smuzhiyun #define TIF_SYSCALL_TRACEPOINT 8 /* for ftrace syscall instrumentation */
75*4882a593Smuzhiyun #define TIF_POLLING_NRFLAG 9 /* true if poll_idle() is polling TIF_NEED_RESCHED */
76*4882a593Smuzhiyun #define TIF_NOTIFY_SIGNAL 10 /* signal notifications exist */
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* as above, but as bit values */
79*4882a593Smuzhiyun #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
80*4882a593Smuzhiyun #define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
81*4882a593Smuzhiyun #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
82*4882a593Smuzhiyun #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
83*4882a593Smuzhiyun #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
84*4882a593Smuzhiyun #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
85*4882a593Smuzhiyun #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
86*4882a593Smuzhiyun #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
87*4882a593Smuzhiyun #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun /* work to do in syscall trace */
90*4882a593Smuzhiyun #define _TIF_WORK_SYSCALL_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
91*4882a593Smuzhiyun _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT)
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun /* work to do on any return to u-space */
94*4882a593Smuzhiyun #define _TIF_ALLWORK_MASK (_TIF_SYSCALL_TRACE | _TIF_SIGPENDING | \
95*4882a593Smuzhiyun _TIF_NEED_RESCHED | _TIF_SYSCALL_AUDIT | \
96*4882a593Smuzhiyun _TIF_SINGLESTEP | _TIF_NOTIFY_RESUME | \
97*4882a593Smuzhiyun _TIF_SYSCALL_TRACEPOINT | _TIF_NOTIFY_SIGNAL)
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun /* work to do on interrupt/exception return */
100*4882a593Smuzhiyun #define _TIF_WORK_MASK (_TIF_ALLWORK_MASK & ~(_TIF_SYSCALL_TRACE | \
101*4882a593Smuzhiyun _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP))
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #endif /* __KERNEL__ */
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun #endif /* _ASM_THREAD_INFO_H */
106