Linux Audio

Check our new training course

Loading...
v6.13.7
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2/*
 3 * Copyright (c) 2021 Keith Packard <keithp@keithp.com>
 4 * Copyright (c) 2021 Google, LLC <ardb@kernel.org>
 5 */
 6
 7#ifndef _ASM_ARM_CURRENT_H
 8#define _ASM_ARM_CURRENT_H
 9
10#ifndef __ASSEMBLY__
11#include <asm/insn.h>
12
13struct task_struct;
14
15extern struct task_struct *__current;
16
17static __always_inline __attribute_const__ struct task_struct *get_current(void)
18{
19	struct task_struct *cur;
20
21#if __has_builtin(__builtin_thread_pointer) && defined(CONFIG_CURRENT_POINTER_IN_TPIDRURO)
22	/*
23	 * Use the __builtin helper when available - this results in better
24	 * code, especially when using GCC in combination with the per-task
25	 * stack protector, as the compiler will recognize that it needs to
26	 * load the TLS register only once in every function.
27	 */
28	cur = __builtin_thread_pointer();
29#elif defined(CONFIG_CURRENT_POINTER_IN_TPIDRURO) || defined(CONFIG_SMP)
30	asm("0:	mrc p15, 0, %0, c13, c0, 3			\n\t"
31#ifdef CONFIG_CPU_V6
32	    "1:							\n\t"
33	    "	.subsection 1					\n\t"
34#if defined(CONFIG_ARM_HAS_GROUP_RELOCS) && \
35    !(defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
36	    "2: " LOAD_SYM_ARMV6(%0, __current) "		\n\t"
37	    "	b	1b					\n\t"
38#else
39	    "2:	ldr	%0, 3f					\n\t"
40	    "	ldr	%0, [%0]				\n\t"
41	    "	b	1b					\n\t"
42	    "3:	.long	__current				\n\t"
43#endif
44	    "	.previous					\n\t"
45	    "	.pushsection \".alt.smp.init\", \"a\"		\n\t"
46	    "	.long	0b - .					\n\t"
47	    "	b	. + (2b - 0b)				\n\t"
48	    "	.popsection					\n\t"
49#endif
50	    : "=r"(cur));
51#elif __LINUX_ARM_ARCH__>= 7 || \
52      !defined(CONFIG_ARM_HAS_GROUP_RELOCS) || \
53      (defined(MODULE) && defined(CONFIG_ARM_MODULE_PLTS))
54	cur = __current;
55#else
56	asm(LOAD_SYM_ARMV6(%0, __current) : "=r"(cur));
57#endif
58	return cur;
59}
60
61#define current get_current()
62
63#endif /* __ASSEMBLY__ */
64
65#endif /* _ASM_ARM_CURRENT_H */
v3.5.6
 1#ifndef _ASMARM_CURRENT_H
 2#define _ASMARM_CURRENT_H
 
 
 
 3
 4#include <linux/thread_info.h>
 
 5
 6static inline struct task_struct *get_current(void) __attribute_const__;
 
 7
 8static inline struct task_struct *get_current(void)
 
 
 
 
 9{
10	return current_thread_info()->task;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11}
12
13#define current (get_current())
 
 
14
15#endif /* _ASMARM_CURRENT_H */