xref: /openbmc/linux/arch/loongarch/include/asm/vdso/vdso.h (revision dce6098b22d58e5b646b1c67174c53f5a6a05605)
1c6b99bedSHuacai Chen /* SPDX-License-Identifier: GPL-2.0-or-later */
2c6b99bedSHuacai Chen /*
3c6b99bedSHuacai Chen  * Author: Huacai Chen <chenhuacai@loongson.cn>
4c6b99bedSHuacai Chen  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
5c6b99bedSHuacai Chen  */
6c6b99bedSHuacai Chen 
7c6b99bedSHuacai Chen #ifndef __ASSEMBLY__
8c6b99bedSHuacai Chen 
9c6b99bedSHuacai Chen #include <asm/asm.h>
10c6b99bedSHuacai Chen #include <asm/page.h>
11*dce6098bSHuacai Chen #include <asm/vdso.h>
12*dce6098bSHuacai Chen 
13*dce6098bSHuacai Chen struct vdso_pcpu_data {
14*dce6098bSHuacai Chen 	u32 node;
15*dce6098bSHuacai Chen } ____cacheline_aligned_in_smp;
16*dce6098bSHuacai Chen 
17*dce6098bSHuacai Chen struct loongarch_vdso_data {
18*dce6098bSHuacai Chen 	struct vdso_pcpu_data pdata[NR_CPUS];
19*dce6098bSHuacai Chen 	struct vdso_data data[CS_BASES]; /* Arch-independent data */
20*dce6098bSHuacai Chen };
21*dce6098bSHuacai Chen 
22*dce6098bSHuacai Chen #define VDSO_DATA_SIZE PAGE_ALIGN(sizeof(struct loongarch_vdso_data))
23c6b99bedSHuacai Chen 
24c6b99bedSHuacai Chen static inline unsigned long get_vdso_base(void)
25c6b99bedSHuacai Chen {
26c6b99bedSHuacai Chen 	unsigned long addr;
27c6b99bedSHuacai Chen 
28c6b99bedSHuacai Chen 	__asm__(
29c6b99bedSHuacai Chen 	" la.pcrel %0, _start\n"
30c6b99bedSHuacai Chen 	: "=r" (addr)
31c6b99bedSHuacai Chen 	:
32c6b99bedSHuacai Chen 	:);
33c6b99bedSHuacai Chen 
34c6b99bedSHuacai Chen 	return addr;
35c6b99bedSHuacai Chen }
36c6b99bedSHuacai Chen 
37c6b99bedSHuacai Chen static inline const struct vdso_data *get_vdso_data(void)
38c6b99bedSHuacai Chen {
39*dce6098bSHuacai Chen 	return (const struct vdso_data *)(get_vdso_base()
40*dce6098bSHuacai Chen 			- VDSO_DATA_SIZE + SMP_CACHE_BYTES * NR_CPUS);
41c6b99bedSHuacai Chen }
42c6b99bedSHuacai Chen 
43c6b99bedSHuacai Chen #endif /* __ASSEMBLY__ */
44