1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Copyright (C) 2015 Imagination Technologies
4 * Author: Alex Smith <alex.smith@imgtec.com>
7 #include <asm/sgidefs.h>
15 static inline unsigned long get_vdso_base(void)
20 * We can't use cpu_has_mips_r6 since it needs the cpu_data[]
23 #ifdef CONFIG_CPU_MIPSR6
25 * lapc <symbol> is an alias to addiupc reg, <symbol> - .
27 * We can't use addiupc because there is no label-label
28 * support for the addiupc reloc
30 __asm__("lapc %0, _start \n"
34 * Get the base load address of the VDSO. We have to avoid generating
35 * relocations and references to the GOT because ld.so does not perform
36 * relocations on the VDSO. We use the current offset from the VDSO base
37 * and perform a PC-relative branch which gives the absolute address in
38 * ra, and take the difference. The assembler chokes on
39 * "li %0, _start - .", so embed the offset as a word and branch over
49 " .word _start - . \n"
51 " " STR(PTR_ADDU
) " %0, $31, %0 \n"
56 #endif /* CONFIG_CPU_MIPSR6 */
61 static inline const struct vdso_data
*get_vdso_data(void)
63 return (const struct vdso_data
*)(get_vdso_base() - PAGE_SIZE
);
66 #ifdef CONFIG_CLKSRC_MIPS_GIC
68 static inline void __iomem
*get_gic(const struct vdso_data
*data
)
70 return (void __iomem
*)((unsigned long)data
& PAGE_MASK
) - PAGE_SIZE
;
73 #endif /* CONFIG_CLKSRC_MIPS_GIC */
75 #endif /* __ASSEMBLY__ */