xref: /openbmc/linux/arch/riscv/include/asm/thread_info.h (revision 7b7fd0ac7dc1ffcaf24d9bca0f051b0168e43cd4)
150acfb2bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27db91e57SPalmer Dabbelt /*
37db91e57SPalmer Dabbelt  * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com>
47db91e57SPalmer Dabbelt  * Copyright (C) 2012 Regents of the University of California
57db91e57SPalmer Dabbelt  * Copyright (C) 2017 SiFive
67db91e57SPalmer Dabbelt  */
77db91e57SPalmer Dabbelt 
87db91e57SPalmer Dabbelt #ifndef _ASM_RISCV_THREAD_INFO_H
97db91e57SPalmer Dabbelt #define _ASM_RISCV_THREAD_INFO_H
107db91e57SPalmer Dabbelt 
117db91e57SPalmer Dabbelt #include <asm/page.h>
127db91e57SPalmer Dabbelt #include <linux/const.h>
137db91e57SPalmer Dabbelt 
147db91e57SPalmer Dabbelt /* thread information allocation */
15*1587db11SAlexandre Ghiti #ifdef CONFIG_KASAN
16*1587db11SAlexandre Ghiti #define KASAN_STACK_ORDER	1
17*1587db11SAlexandre Ghiti #else
18*1587db11SAlexandre Ghiti #define KASAN_STACK_ORDER	0
19*1587db11SAlexandre Ghiti #endif
20*1587db11SAlexandre Ghiti #define THREAD_SIZE_ORDER	(CONFIG_THREAD_SIZE_ORDER + KASAN_STACK_ORDER)
217db91e57SPalmer Dabbelt #define THREAD_SIZE		(PAGE_SIZE << THREAD_SIZE_ORDER)
227db91e57SPalmer Dabbelt 
2331da94c2STong Tiangen /*
2431da94c2STong Tiangen  * By aligning VMAP'd stacks to 2 * THREAD_SIZE, we can detect overflow by
2531da94c2STong Tiangen  * checking sp & (1 << THREAD_SHIFT), which we can do cheaply in the entry
2631da94c2STong Tiangen  * assembly.
2731da94c2STong Tiangen  */
2831da94c2STong Tiangen #ifdef CONFIG_VMAP_STACK
2931da94c2STong Tiangen #define THREAD_ALIGN            (2 * THREAD_SIZE)
3031da94c2STong Tiangen #else
3131da94c2STong Tiangen #define THREAD_ALIGN            THREAD_SIZE
3231da94c2STong Tiangen #endif
3331da94c2STong Tiangen 
3431da94c2STong Tiangen #define THREAD_SHIFT            (PAGE_SHIFT + THREAD_SIZE_ORDER)
3531da94c2STong Tiangen #define OVERFLOW_STACK_SIZE     SZ_4K
3631da94c2STong Tiangen 
37163e76ccSGuo Ren #define IRQ_STACK_SIZE		THREAD_SIZE
38163e76ccSGuo Ren 
397db91e57SPalmer Dabbelt #ifndef __ASSEMBLY__
407db91e57SPalmer Dabbelt 
417db91e57SPalmer Dabbelt #include <asm/processor.h>
427db91e57SPalmer Dabbelt #include <asm/csr.h>
437db91e57SPalmer Dabbelt 
447db91e57SPalmer Dabbelt /*
457db91e57SPalmer Dabbelt  * low level task data that entry.S needs immediate access to
467db91e57SPalmer Dabbelt  * - this struct should fit entirely inside of one cache line
477db91e57SPalmer Dabbelt  * - if the members of this struct changes, the assembly constants
487db91e57SPalmer Dabbelt  *   in asm-offsets.c must be updated accordingly
497db91e57SPalmer Dabbelt  * - thread_info is included in task_struct at an offset of 0.  This means that
507db91e57SPalmer Dabbelt  *   tp points to both thread_info and task_struct.
517db91e57SPalmer Dabbelt  */
527db91e57SPalmer Dabbelt struct thread_info {
537db91e57SPalmer Dabbelt 	unsigned long		flags;		/* low level flags */
547db91e57SPalmer Dabbelt 	int                     preempt_count;  /* 0=>preemptible, <0=>BUG */
557db91e57SPalmer Dabbelt 	/*
567db91e57SPalmer Dabbelt 	 * These stack pointers are overwritten on every system call or
577db91e57SPalmer Dabbelt 	 * exception.  SP is also saved to the stack it can be recovered when
587db91e57SPalmer Dabbelt 	 * overwritten.
597db91e57SPalmer Dabbelt 	 */
607db91e57SPalmer Dabbelt 	long			kernel_sp;	/* Kernel stack pointer */
617db91e57SPalmer Dabbelt 	long			user_sp;	/* User stack pointer */
627db91e57SPalmer Dabbelt 	int			cpu;
63f0bddf50SGuo Ren 	unsigned long		syscall_work;	/* SYSCALL_WORK_ flags */
647db91e57SPalmer Dabbelt };
657db91e57SPalmer Dabbelt 
667db91e57SPalmer Dabbelt /*
677db91e57SPalmer Dabbelt  * macros/functions for gaining access to the thread information structure
687db91e57SPalmer Dabbelt  *
697db91e57SPalmer Dabbelt  * preempt_count needs to be 1 initially, until the scheduler is functional.
707db91e57SPalmer Dabbelt  */
717db91e57SPalmer Dabbelt #define INIT_THREAD_INFO(tsk)			\
727db91e57SPalmer Dabbelt {						\
737db91e57SPalmer Dabbelt 	.flags		= 0,			\
747db91e57SPalmer Dabbelt 	.preempt_count	= INIT_PREEMPT_COUNT,	\
757db91e57SPalmer Dabbelt }
767db91e57SPalmer Dabbelt 
773a2df632SGreentime Hu void arch_release_task_struct(struct task_struct *tsk);
783a2df632SGreentime Hu int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
793a2df632SGreentime Hu 
807db91e57SPalmer Dabbelt #endif /* !__ASSEMBLY__ */
817db91e57SPalmer Dabbelt 
827db91e57SPalmer Dabbelt /*
837db91e57SPalmer Dabbelt  * thread information flags
847db91e57SPalmer Dabbelt  * - these are process state flags that various assembly files may need to
857db91e57SPalmer Dabbelt  *   access
867db91e57SPalmer Dabbelt  * - pending work-to-be-done flags are in lowest half-word
877db91e57SPalmer Dabbelt  * - other flags in upper half-word(s)
887db91e57SPalmer Dabbelt  */
897db91e57SPalmer Dabbelt #define TIF_NOTIFY_RESUME	1	/* callback before returning to user */
907db91e57SPalmer Dabbelt #define TIF_SIGPENDING		2	/* signal pending */
917db91e57SPalmer Dabbelt #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
927db91e57SPalmer Dabbelt #define TIF_RESTORE_SIGMASK	4	/* restore signal mask in do_signal() */
937db91e57SPalmer Dabbelt #define TIF_MEMDIE		5	/* is terminating due to OOM killer */
9424a31b81SJens Axboe #define TIF_NOTIFY_SIGNAL	9	/* signal notifications exist */
9574784081SGuo Ren #define TIF_UPROBE		10	/* uprobe breakpoint or singlestep */
9606d0e372SGuo Ren #define TIF_32BIT		11	/* compat-mode 32bit process */
977db91e57SPalmer Dabbelt 
987db91e57SPalmer Dabbelt #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
997db91e57SPalmer Dabbelt #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
1007db91e57SPalmer Dabbelt #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
10124a31b81SJens Axboe #define _TIF_NOTIFY_SIGNAL	(1 << TIF_NOTIFY_SIGNAL)
10274784081SGuo Ren #define _TIF_UPROBE		(1 << TIF_UPROBE)
1037db91e57SPalmer Dabbelt 
1047db91e57SPalmer Dabbelt #define _TIF_WORK_MASK \
10524a31b81SJens Axboe 	(_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NEED_RESCHED | \
10674784081SGuo Ren 	 _TIF_NOTIFY_SIGNAL | _TIF_UPROBE)
1077db91e57SPalmer Dabbelt 
1087db91e57SPalmer Dabbelt #endif /* _ASM_RISCV_THREAD_INFO_H */
109