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