1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com> 4*4882a593Smuzhiyun * Copyright (C) 2012 Regents of the University of California 5*4882a593Smuzhiyun * Copyright (C) 2017 SiFive 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _ASM_RISCV_THREAD_INFO_H 9*4882a593Smuzhiyun #define _ASM_RISCV_THREAD_INFO_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <asm/page.h> 12*4882a593Smuzhiyun #include <linux/const.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifdef CONFIG_KASAN 15*4882a593Smuzhiyun #define KASAN_STACK_ORDER 1 16*4882a593Smuzhiyun #else 17*4882a593Smuzhiyun #define KASAN_STACK_ORDER 0 18*4882a593Smuzhiyun #endif 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* thread information allocation */ 21*4882a593Smuzhiyun #ifdef CONFIG_64BIT 22*4882a593Smuzhiyun #define THREAD_SIZE_ORDER (2 + KASAN_STACK_ORDER) 23*4882a593Smuzhiyun #else 24*4882a593Smuzhiyun #define THREAD_SIZE_ORDER (1 + KASAN_STACK_ORDER) 25*4882a593Smuzhiyun #endif 26*4882a593Smuzhiyun #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <asm/processor.h> 31*4882a593Smuzhiyun #include <asm/csr.h> 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* 34*4882a593Smuzhiyun * low level task data that entry.S needs immediate access to 35*4882a593Smuzhiyun * - this struct should fit entirely inside of one cache line 36*4882a593Smuzhiyun * - if the members of this struct changes, the assembly constants 37*4882a593Smuzhiyun * in asm-offsets.c must be updated accordingly 38*4882a593Smuzhiyun * - thread_info is included in task_struct at an offset of 0. This means that 39*4882a593Smuzhiyun * tp points to both thread_info and task_struct. 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun struct thread_info { 42*4882a593Smuzhiyun unsigned long flags; /* low level flags */ 43*4882a593Smuzhiyun int preempt_count; /* 0=>preemptible, <0=>BUG */ 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * These stack pointers are overwritten on every system call or 46*4882a593Smuzhiyun * exception. SP is also saved to the stack it can be recovered when 47*4882a593Smuzhiyun * overwritten. 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun long kernel_sp; /* Kernel stack pointer */ 50*4882a593Smuzhiyun long user_sp; /* User stack pointer */ 51*4882a593Smuzhiyun int cpu; 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* 55*4882a593Smuzhiyun * macros/functions for gaining access to the thread information structure 56*4882a593Smuzhiyun * 57*4882a593Smuzhiyun * preempt_count needs to be 1 initially, until the scheduler is functional. 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun #define INIT_THREAD_INFO(tsk) \ 60*4882a593Smuzhiyun { \ 61*4882a593Smuzhiyun .flags = 0, \ 62*4882a593Smuzhiyun .preempt_count = INIT_PREEMPT_COUNT, \ 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #endif /* !__ASSEMBLY__ */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* 68*4882a593Smuzhiyun * thread information flags 69*4882a593Smuzhiyun * - these are process state flags that various assembly files may need to 70*4882a593Smuzhiyun * access 71*4882a593Smuzhiyun * - pending work-to-be-done flags are in lowest half-word 72*4882a593Smuzhiyun * - other flags in upper half-word(s) 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 75*4882a593Smuzhiyun #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ 76*4882a593Smuzhiyun #define TIF_SIGPENDING 2 /* signal pending */ 77*4882a593Smuzhiyun #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 78*4882a593Smuzhiyun #define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */ 79*4882a593Smuzhiyun #define TIF_MEMDIE 5 /* is terminating due to OOM killer */ 80*4882a593Smuzhiyun #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ 81*4882a593Smuzhiyun #define TIF_SYSCALL_AUDIT 7 /* syscall auditing */ 82*4882a593Smuzhiyun #define TIF_SECCOMP 8 /* syscall secure computing */ 83*4882a593Smuzhiyun #define TIF_NOTIFY_SIGNAL 9 /* signal notifications exist */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 86*4882a593Smuzhiyun #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 87*4882a593Smuzhiyun #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 88*4882a593Smuzhiyun #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 89*4882a593Smuzhiyun #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) 90*4882a593Smuzhiyun #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 91*4882a593Smuzhiyun #define _TIF_SECCOMP (1 << TIF_SECCOMP) 92*4882a593Smuzhiyun #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define _TIF_WORK_MASK \ 95*4882a593Smuzhiyun (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NEED_RESCHED | \ 96*4882a593Smuzhiyun _TIF_NOTIFY_SIGNAL) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define _TIF_SYSCALL_WORK \ 99*4882a593Smuzhiyun (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT | \ 100*4882a593Smuzhiyun _TIF_SECCOMP) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #endif /* _ASM_RISCV_THREAD_INFO_H */ 103