Skip to content
Donald Buczek edited this page Jun 9, 2020 · 2 revisions

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/current.h#L11

DECLARE_PER_CPU(struct task_struct *, current_task);

static __always_inline struct task_struct *get_current(void)
{
	return this_cpu_read_stable(current_task);
}

#define current get_current()

https://elixir.bootlin.com/linux/v5.7/source/include/linux/percpu-defs.h#L111

#define DECLARE_PER_CPU(type, name)					\
	DECLARE_PER_CPU_SECTION(type, name, "")

https://elixir.bootlin.com/linux/v5.7/source/include/linux/percpu-defs.h#L100

#define DECLARE_PER_CPU_SECTION(type, name, sec)			\
	extern __PCPU_ATTRS(sec) __typeof__(type) name

https://elixir.bootlin.com/linux/v5.7/source/include/linux/percpu-defs.h#L49

#define __PCPU_ATTRS(sec)						\
	__percpu __attribute__((section(PER_CPU_BASE_SECTION sec)))	\
	PER_CPU_ATTRIBUTES

https://elixir.bootlin.com/linux/v5.7/source/include/linux/compiler_types.h#L46 (see https://en.wikipedia.org/wiki/Sparse )

# define __percpu

https://elixir.bootlin.com/linux/v5.7/source/include/asm-generic/percpu.h#L55

#define PER_CPU_BASE_SECTION ".data..percpu"

https://elixir.bootlin.com/linux/v5.7/source/include/asm-generic/percpu.h#L62

#define PER_CPU_ATTRIBUTES

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/percpu.h#L392

#define this_cpu_read_stable(var)	percpu_stable_op("mov", var)

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/percpu.h#L212

#define percpu_stable_op(op, var)			\
({							\
	typeof(var) pfo_ret__;				\
	switch (sizeof(var)) {				\
	case 1:						\
		asm(op "b "__percpu_arg(P1)",%0"	\
		    : "=q" (pfo_ret__)			\
		    : "p" (&(var)));			\
		break;					\
	case 2:						\
		asm(op "w "__percpu_arg(P1)",%0"	\
		    : "=r" (pfo_ret__)			\
		    : "p" (&(var)));			\
		break;					\
	case 4:						\
		asm(op "l "__percpu_arg(P1)",%0"	\
		    : "=r" (pfo_ret__)			\
		    : "p" (&(var)));			\
		break;					\
	case 8:						\
		asm(op "q "__percpu_arg(P1)",%0"	\
		    : "=r" (pfo_ret__)			\
		    : "p" (&(var)));			\
		break;					\
	default: __bad_percpu_size();			\
	}						\
	pfo_ret__;					\
})

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/percpu.h#L68

#define __percpu_arg(x)		__percpu_prefix "%" #x

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/percpu.h#L49

#define __percpu_prefix		"%%"__stringify(__percpu_seg)":"

https://elixir.bootlin.com/linux/v5.7/source/arch/x86/include/asm/percpu.h#L6

#define __percpu_seg		gs