projects/linux·blob master · refs

137 lines · 4.3 KiB

1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ALPHA_THREAD_INFO_H
3#define _ALPHA_THREAD_INFO_H
4
5#ifdef __KERNEL__
6
7#ifndef __ASSEMBLER__
8#include <asm/processor.h>
9#include <asm/types.h>
10#include <asm/hwrpb.h>
11#include <asm/sysinfo.h>
12#endif
13
14#ifndef __ASSEMBLER__
15
16struct thread_info {
17 struct pcb_struct pcb; /* palcode state */
18
19 struct task_struct *task; /* main task structure */
20 unsigned long flags; /* low level flags */
21 unsigned long syscall_work; /* SYSCALL_WORK_* flags */
22 unsigned int ieee_state; /* see fpu.h */
23
24 unsigned cpu; /* current CPU */
25 int preempt_count; /* 0 => preemptable, <0 => BUG */
26 unsigned int status; /* thread-synchronous flags */
27 unsigned long syscall_saved_r19;
28 unsigned long syscall_meta;
29 unsigned long syscall_saved_nr;
30
31 int bpt_nsaved;
32 unsigned long bpt_addr[2]; /* breakpoint handling */
33 unsigned int bpt_insn[2];
34 unsigned long fp[32];
35};
36
37/*
38 * Macros/functions for gaining access to the thread information structure.
39 */
40#define INIT_THREAD_INFO(tsk) \
41{ \
42 .task = &tsk, \
43 .preempt_count = INIT_PREEMPT_COUNT, \
44}
45
46/* How to get the thread information struct from C. */
47register struct thread_info *__current_thread_info __asm__("$8");
48#define current_thread_info() __current_thread_info
49
50register unsigned long *current_stack_pointer __asm__ ("$30");
51
52#endif /* __ASSEMBLER__ */
53
54/* Thread information allocation. */
55#define THREAD_SIZE_ORDER 1
56#define THREAD_SIZE (2*PAGE_SIZE)
57
58#define ALPHA_SYSCALL_META_SKIP 0x2
59#define ALPHA_SYSCALL_META_FORCE_SUCCESS 0x4
60
61/*
62 * Thread information flags:
63 * - these are process state flags and used from assembly
64 * - pending work-to-be-done flags come first and must be assigned to be
65 * within bits 0 to 7 to fit in and immediate operand.
66 *
67 * (Historically TIF_SYSCALL_TRACE was known to be 0 via blbs, but we may
68 * also test multiple bits via masks now.)
69 */
70#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
71#define TIF_NOTIFY_RESUME 1 /* callback before returning to user */
72#define TIF_SIGPENDING 2 /* signal pending */
73#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
74#define TIF_SYSCALL_AUDIT 4 /* syscall audit active */
75#define TIF_NOTIFY_SIGNAL 5 /* signal notifications exist */
76#define TIF_SECCOMP 6 /* seccomp syscall filtering active */
77#define TIF_SYSCALL_TRACEPOINT 7 /* syscall tracepoint instrumentation */
78#define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */
79#define TIF_UPROBE 10 /* uprobe breakpoint or singlestep */
80#define TIF_MEMDIE 13 /* is terminating due to OOM killer */
81#define TIF_POLLING_NRFLAG 14 /* idle is polling for TIF_NEED_RESCHED */
82
83#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
84#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
85#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
86#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
87#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
88#define _TIF_NOTIFY_SIGNAL (1<<TIF_NOTIFY_SIGNAL)
89#define _TIF_SECCOMP (1<<TIF_SECCOMP)
90#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
91#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
92#define _TIF_UPROBE (1 << TIF_UPROBE)
93
94#define TS_UAC_NOPRINT 0x0001 /* ! Preserve the following three */
95#define TS_UAC_NOFIX 0x0002 /* ! flags as they match */
96#define TS_UAC_SIGBUS 0x0004 /* ! userspace part of 'osf_sysinfo' */
97
98#define TS_SAVED_FP 0x0008
99#define TS_RESTORE_FP 0x0010
100
101#define SET_UNALIGN_CTL(task,value) ({ \
102 __u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \
103 if (value & PR_UNALIGN_NOPRINT) \
104 status |= TS_UAC_NOPRINT; \
105 if (value & PR_UNALIGN_SIGBUS) \
106 status |= TS_UAC_SIGBUS; \
107 if (value & 4) /* alpha-specific */ \
108 status |= TS_UAC_NOFIX; \
109 task_thread_info(task)->status = status; \
110 0; })
111
112#define GET_UNALIGN_CTL(task,value) ({ \
113 __u32 status = task_thread_info(task)->status & ~UAC_BITMASK; \
114 __u32 res = 0; \
115 if (status & TS_UAC_NOPRINT) \
116 res |= PR_UNALIGN_NOPRINT; \
117 if (status & TS_UAC_SIGBUS) \
118 res |= PR_UNALIGN_SIGBUS; \
119 if (status & TS_UAC_NOFIX) \
120 res |= 4; \
121 put_user(res, (int __user *)(value)); \
122 })
123
124#ifndef __ASSEMBLER__
125extern void __save_fpu(void);
126
127static inline void save_fpu(void)
128{
129 if (!(current_thread_info()->status & TS_SAVED_FP)) {
130 current_thread_info()->status |= TS_SAVED_FP;
131 __save_fpu();
132 }
133}
134#endif
135
136#endif /* __KERNEL__ */
137#endif /* _ALPHA_THREAD_INFO_H */