cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

thread_info.h (3645B)


      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 __ASSEMBLY__
      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 __ASSEMBLY__
     15struct thread_info {
     16	struct pcb_struct	pcb;		/* palcode state */
     17
     18	struct task_struct	*task;		/* main task structure */
     19	unsigned int		flags;		/* low level flags */
     20	unsigned int		ieee_state;	/* see fpu.h */
     21
     22	unsigned		cpu;		/* current CPU */
     23	int			preempt_count; /* 0 => preemptable, <0 => BUG */
     24	unsigned int		status;		/* thread-synchronous flags */
     25
     26	int bpt_nsaved;
     27	unsigned long bpt_addr[2];		/* breakpoint handling  */
     28	unsigned int bpt_insn[2];
     29};
     30
     31/*
     32 * Macros/functions for gaining access to the thread information structure.
     33 */
     34#define INIT_THREAD_INFO(tsk)			\
     35{						\
     36	.task		= &tsk,			\
     37	.preempt_count	= INIT_PREEMPT_COUNT,	\
     38}
     39
     40/* How to get the thread information struct from C.  */
     41register struct thread_info *__current_thread_info __asm__("$8");
     42#define current_thread_info()  __current_thread_info
     43
     44#endif /* __ASSEMBLY__ */
     45
     46/* Thread information allocation.  */
     47#define THREAD_SIZE_ORDER 1
     48#define THREAD_SIZE (2*PAGE_SIZE)
     49
     50/*
     51 * Thread information flags:
     52 * - these are process state flags and used from assembly
     53 * - pending work-to-be-done flags come first and must be assigned to be
     54 *   within bits 0 to 7 to fit in and immediate operand.
     55 *
     56 * TIF_SYSCALL_TRACE is known to be 0 via blbs.
     57 */
     58#define TIF_SYSCALL_TRACE	0	/* syscall trace active */
     59#define TIF_NOTIFY_RESUME	1	/* callback before returning to user */
     60#define TIF_SIGPENDING		2	/* signal pending */
     61#define TIF_NEED_RESCHED	3	/* rescheduling necessary */
     62#define TIF_SYSCALL_AUDIT	4	/* syscall audit active */
     63#define TIF_NOTIFY_SIGNAL	5	/* signal notifications exist */
     64#define TIF_DIE_IF_KERNEL	9	/* dik recursion lock */
     65#define TIF_MEMDIE		13	/* is terminating due to OOM killer */
     66#define TIF_POLLING_NRFLAG	14	/* idle is polling for TIF_NEED_RESCHED */
     67
     68#define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
     69#define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
     70#define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
     71#define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
     72#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
     73#define _TIF_NOTIFY_SIGNAL	(1<<TIF_NOTIFY_SIGNAL)
     74#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
     75
     76/* Work to do on interrupt/exception return.  */
     77#define _TIF_WORK_MASK		(_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
     78				 _TIF_NOTIFY_RESUME)
     79
     80/* Work to do on any return to userspace.  */
     81#define _TIF_ALLWORK_MASK	(_TIF_WORK_MASK		\
     82				 | _TIF_SYSCALL_TRACE)
     83
     84#define TS_UAC_NOPRINT		0x0001	/* ! Preserve the following three */
     85#define TS_UAC_NOFIX		0x0002	/* ! flags as they match          */
     86#define TS_UAC_SIGBUS		0x0004	/* ! userspace part of 'osf_sysinfo' */
     87
     88#define SET_UNALIGN_CTL(task,value)	({				\
     89	__u32 status = task_thread_info(task)->status & ~UAC_BITMASK;	\
     90	if (value & PR_UNALIGN_NOPRINT)					\
     91		status |= TS_UAC_NOPRINT;				\
     92	if (value & PR_UNALIGN_SIGBUS)					\
     93		status |= TS_UAC_SIGBUS;				\
     94	if (value & 4)	/* alpha-specific */				\
     95		status |= TS_UAC_NOFIX;					\
     96	task_thread_info(task)->status = status;			\
     97	0; })
     98
     99#define GET_UNALIGN_CTL(task,value)	({				\
    100	__u32 status = task_thread_info(task)->status & ~UAC_BITMASK;	\
    101	__u32 res = 0;							\
    102	if (status & TS_UAC_NOPRINT)					\
    103		res |= PR_UNALIGN_NOPRINT;				\
    104	if (status & TS_UAC_SIGBUS)					\
    105		res |= PR_UNALIGN_SIGBUS;				\
    106	if (status & TS_UAC_NOFIX)					\
    107		res |= 4;						\
    108	put_user(res, (int __user *)(value));				\
    109	})
    110
    111#endif /* __KERNEL__ */
    112#endif /* _ALPHA_THREAD_INFO_H */