1 /* SPDX-License-Identifier: GPL-2.0-only */ 1 2 /* 3 * Copyright (c) 2021 Keith Packard <keithp@ke 4 * Copyright (c) 2021 Google, LLC <ardb@kernel 5 */ 6 7 #ifndef _ASM_ARM_CURRENT_H 8 #define _ASM_ARM_CURRENT_H 9 10 #ifndef __ASSEMBLY__ 11 #include <asm/insn.h> 12 13 struct task_struct; 14 15 extern struct task_struct *__current; 16 17 static __always_inline __attribute_const__ str 18 { 19 struct task_struct *cur; 20 21 #if __has_builtin(__builtin_thread_pointer) && 22 /* 23 * Use the __builtin helper when avail 24 * code, especially when using GCC in 25 * stack protector, as the compiler wi 26 * load the TLS register only once in 27 */ 28 cur = __builtin_thread_pointer(); 29 #elif defined(CONFIG_CURRENT_POINTER_IN_TPIDRU 30 asm("0: mrc p15, 0, %0, c13, c0, 3 31 #ifdef CONFIG_CPU_V6 32 "1: 33 " .subsection 1 34 #if defined(CONFIG_ARM_HAS_GROUP_RELOCS) && \ 35 !(defined(MODULE) && defined(CONFIG_ARM_MO 36 "2: " LOAD_SYM_ARMV6(%0, __current 37 " b 1b 38 #else 39 "2: ldr %0, 3f 40 " ldr %0, [%0] 41 " b 1b 42 "3: .long __current 43 #endif 44 " .previous 45 " .pushsection \".alt.smp.init\" 46 " .long 0b - . 47 " b . + (2b - 0b) 48 " .popsection 49 #endif 50 : "=r"(cur)); 51 #elif __LINUX_ARM_ARCH__>= 7 || \ 52 !defined(CONFIG_ARM_HAS_GROUP_RELOCS) || 53 (defined(MODULE) && defined(CONFIG_ARM_M 54 cur = __current; 55 #else 56 asm(LOAD_SYM_ARMV6(%0, __current) : "= 57 #endif 58 return cur; 59 } 60 61 #define current get_current() 62 63 #endif /* __ASSEMBLY__ */ 64 65 #endif /* _ASM_ARM_CURRENT_H */ 66
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.