LCOV - code coverage report
Current view: top level - include/linux - thread_info.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 17 27 63.0 %
Date: 2021-04-22 12:43:58 Functions: 1 3 33.3 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /* thread_info.h: common low-level thread information accessors
       3             :  *
       4             :  * Copyright (C) 2002  David Howells (dhowells@redhat.com)
       5             :  * - Incorporating suggestions made by Linus Torvalds
       6             :  */
       7             : 
       8             : #ifndef _LINUX_THREAD_INFO_H
       9             : #define _LINUX_THREAD_INFO_H
      10             : 
      11             : #include <linux/types.h>
      12             : #include <linux/bug.h>
      13             : #include <linux/restart_block.h>
      14             : 
      15             : #ifdef CONFIG_THREAD_INFO_IN_TASK
      16             : /*
      17             :  * For CONFIG_THREAD_INFO_IN_TASK kernels we need <asm/current.h> for the
      18             :  * definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels,
      19             :  * including <asm/current.h> can cause a circular dependency on some platforms.
      20             :  */
      21             : #include <asm/current.h>
      22             : #define current_thread_info() ((struct thread_info *)current)
      23             : #endif
      24             : 
      25             : #include <linux/bitops.h>
      26             : 
      27             : /*
      28             :  * For per-arch arch_within_stack_frames() implementations, defined in
      29             :  * asm/thread_info.h.
      30             :  */
      31             : enum {
      32             :         BAD_STACK = -1,
      33             :         NOT_STACK = 0,
      34             :         GOOD_FRAME,
      35             :         GOOD_STACK,
      36             : };
      37             : 
      38             : #ifdef CONFIG_GENERIC_ENTRY
      39             : enum syscall_work_bit {
      40             :         SYSCALL_WORK_BIT_SECCOMP,
      41             :         SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT,
      42             :         SYSCALL_WORK_BIT_SYSCALL_TRACE,
      43             :         SYSCALL_WORK_BIT_SYSCALL_EMU,
      44             :         SYSCALL_WORK_BIT_SYSCALL_AUDIT,
      45             :         SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH,
      46             :         SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP,
      47             : };
      48             : 
      49             : #define SYSCALL_WORK_SECCOMP            BIT(SYSCALL_WORK_BIT_SECCOMP)
      50             : #define SYSCALL_WORK_SYSCALL_TRACEPOINT BIT(SYSCALL_WORK_BIT_SYSCALL_TRACEPOINT)
      51             : #define SYSCALL_WORK_SYSCALL_TRACE      BIT(SYSCALL_WORK_BIT_SYSCALL_TRACE)
      52             : #define SYSCALL_WORK_SYSCALL_EMU        BIT(SYSCALL_WORK_BIT_SYSCALL_EMU)
      53             : #define SYSCALL_WORK_SYSCALL_AUDIT      BIT(SYSCALL_WORK_BIT_SYSCALL_AUDIT)
      54             : #define SYSCALL_WORK_SYSCALL_USER_DISPATCH BIT(SYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH)
      55             : #define SYSCALL_WORK_SYSCALL_EXIT_TRAP  BIT(SYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP)
      56             : #endif
      57             : 
      58             : #include <asm/thread_info.h>
      59             : 
      60             : #ifdef __KERNEL__
      61             : 
      62             : #ifndef THREAD_ALIGN
      63             : #define THREAD_ALIGN    THREAD_SIZE
      64             : #endif
      65             : 
      66             : #define THREADINFO_GFP          (GFP_KERNEL_ACCOUNT | __GFP_ZERO)
      67             : 
      68             : /*
      69             :  * flag set/clear/test wrappers
      70             :  * - pass TIF_xxxx constants to these functions
      71             :  */
      72             : 
      73       91950 : static inline void set_ti_thread_flag(struct thread_info *ti, int flag)
      74             : {
      75       91950 :         set_bit(flag, (unsigned long *)&ti->flags);
      76           0 : }
      77             : 
      78      131391 : static inline void clear_ti_thread_flag(struct thread_info *ti, int flag)
      79             : {
      80      131391 :         clear_bit(flag, (unsigned long *)&ti->flags);
      81       18790 : }
      82             : 
      83             : static inline void update_ti_thread_flag(struct thread_info *ti, int flag,
      84             :                                          bool value)
      85             : {
      86             :         if (value)
      87             :                 set_ti_thread_flag(ti, flag);
      88             :         else
      89             :                 clear_ti_thread_flag(ti, flag);
      90             : }
      91             : 
      92       56851 : static inline int test_and_set_ti_thread_flag(struct thread_info *ti, int flag)
      93             : {
      94       56851 :         return test_and_set_bit(flag, (unsigned long *)&ti->flags);
      95             : }
      96             : 
      97        2646 : static inline int test_and_clear_ti_thread_flag(struct thread_info *ti, int flag)
      98             : {
      99        2646 :         return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
     100             : }
     101             : 
     102     2160877 : static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
     103             : {
     104     2160877 :         return test_bit(flag, (unsigned long *)&ti->flags);
     105             : }
     106             : 
     107             : #define set_thread_flag(flag) \
     108             :         set_ti_thread_flag(current_thread_info(), flag)
     109             : #define clear_thread_flag(flag) \
     110             :         clear_ti_thread_flag(current_thread_info(), flag)
     111             : #define update_thread_flag(flag, value) \
     112             :         update_ti_thread_flag(current_thread_info(), flag, value)
     113             : #define test_and_set_thread_flag(flag) \
     114             :         test_and_set_ti_thread_flag(current_thread_info(), flag)
     115             : #define test_and_clear_thread_flag(flag) \
     116             :         test_and_clear_ti_thread_flag(current_thread_info(), flag)
     117             : #define test_thread_flag(flag) \
     118             :         test_ti_thread_flag(current_thread_info(), flag)
     119             : 
     120             : #ifdef CONFIG_GENERIC_ENTRY
     121             : #define set_syscall_work(fl) \
     122             :         set_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
     123             : #define test_syscall_work(fl) \
     124             :         test_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
     125             : #define clear_syscall_work(fl) \
     126             :         clear_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
     127             : 
     128             : #define set_task_syscall_work(t, fl) \
     129             :         set_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
     130             : #define test_task_syscall_work(t, fl) \
     131             :         test_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
     132             : #define clear_task_syscall_work(t, fl) \
     133             :         clear_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
     134             : 
     135             : #else /* CONFIG_GENERIC_ENTRY */
     136             : 
     137             : #define set_syscall_work(fl)                                            \
     138             :         set_ti_thread_flag(current_thread_info(), TIF_##fl)
     139             : #define test_syscall_work(fl) \
     140             :         test_ti_thread_flag(current_thread_info(), TIF_##fl)
     141             : #define clear_syscall_work(fl) \
     142             :         clear_ti_thread_flag(current_thread_info(), TIF_##fl)
     143             : 
     144             : #define set_task_syscall_work(t, fl) \
     145             :         set_ti_thread_flag(task_thread_info(t), TIF_##fl)
     146             : #define test_task_syscall_work(t, fl) \
     147             :         test_ti_thread_flag(task_thread_info(t), TIF_##fl)
     148             : #define clear_task_syscall_work(t, fl) \
     149             :         clear_ti_thread_flag(task_thread_info(t), TIF_##fl)
     150             : #endif /* !CONFIG_GENERIC_ENTRY */
     151             : 
     152             : #define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
     153             : 
     154             : #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
     155             : static inline int arch_within_stack_frames(const void * const stack,
     156             :                                            const void * const stackend,
     157             :                                            const void *obj, unsigned long len)
     158             : {
     159             :         return 0;
     160             : }
     161             : #endif
     162             : 
     163             : #ifdef CONFIG_HARDENED_USERCOPY
     164             : extern void __check_object_size(const void *ptr, unsigned long n,
     165             :                                         bool to_user);
     166             : 
     167             : static __always_inline void check_object_size(const void *ptr, unsigned long n,
     168             :                                               bool to_user)
     169             : {
     170             :         if (!__builtin_constant_p(n))
     171             :                 __check_object_size(ptr, n, to_user);
     172             : }
     173             : #else
     174      105666 : static inline void check_object_size(const void *ptr, unsigned long n,
     175             :                                      bool to_user)
     176      105666 : { }
     177             : #endif /* CONFIG_HARDENED_USERCOPY */
     178             : 
     179             : extern void __compiletime_error("copy source size is too small")
     180             : __bad_copy_from(void);
     181             : extern void __compiletime_error("copy destination size is too small")
     182             : __bad_copy_to(void);
     183             : 
     184           0 : static inline void copy_overflow(int size, unsigned long count)
     185             : {
     186           0 :         WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
     187           0 : }
     188             : 
     189             : static __always_inline __must_check bool
     190      181563 : check_copy_size(const void *addr, size_t bytes, bool is_source)
     191             : {
     192      181563 :         int sz = __compiletime_object_size(addr);
     193      147177 :         if (unlikely(sz >= 0 && sz < bytes)) {
     194           0 :                 if (!__builtin_constant_p(bytes))
     195           0 :                         copy_overflow(sz, bytes);
     196           0 :                 else if (is_source)
     197           0 :                         __bad_copy_from();
     198             :                 else
     199           0 :                         __bad_copy_to();
     200             :                 return false;
     201             :         }
     202      181563 :         if (WARN_ON_ONCE(bytes > INT_MAX))
     203           0 :                 return false;
     204             :         check_object_size(addr, bytes, is_source);
     205             :         return true;
     206             : }
     207             : 
     208             : #ifndef arch_setup_new_exec
     209             : static inline void arch_setup_new_exec(void) { }
     210             : #endif
     211             : 
     212             : #endif  /* __KERNEL__ */
     213             : 
     214             : #endif /* _LINUX_THREAD_INFO_H */

Generated by: LCOV version 1.14