File Index
Files and directories
Sign in
FILE

vdso.h

File preview with syntax highlighting.

linux-6.19.14/arch/mips/include/asm/vdso/vdso.h C
 1/* SPDX-License-Identifier: GPL-2.0-or-later */
 2/*
 3 * Copyright (C) 2015 Imagination Technologies
 4 * Author: Alex Smith <alex.smith@imgtec.com>
 5 */
 6
 7#include <asm/sgidefs.h>
 8#include <vdso/page.h>
 9
10#define __VDSO_PAGES 4
11
12#ifndef __ASSEMBLER__
13
14#include <asm/asm.h>
15#include <asm/vdso.h>
16
17static inline const struct vdso_time_data *get_vdso_time_data(void)
18{
19	const struct vdso_time_data *addr;
20
21	/*
22	 * We can't use cpu_has_mips_r6 since it needs the cpu_data[]
23	 * kernel symbol.
24	 */
25#ifdef CONFIG_CPU_MIPSR6
26	/*
27	 * lapc <symbol> is an alias to addiupc reg, <symbol> - .
28	 *
29	 * We can't use addiupc because there is no label-label
30	 * support for the addiupc reloc
31	 */
32	__asm__("lapc	%0, vdso_u_time_data		\n"
33		: "=r" (addr) : :);
34#else
35	/*
36	 * Get the base load address of the VDSO. We have to avoid generating
37	 * relocations and references to the GOT because ld.so does not perform
38	 * relocations on the VDSO. We use the current offset from the VDSO base
39	 * and perform a PC-relative branch which gives the absolute address in
40	 * ra, and take the difference. The assembler chokes on
41	 * "li %0, _start - .", so embed the offset as a word and branch over
42	 * it.
43	 *
44	 */
45
46	__asm__(
47	"	.set push				\n"
48	"	.set noreorder				\n"
49	"	bal	1f				\n"
50	"	 nop					\n"
51	"	.word	vdso_u_time_data - .		\n"
52	"1:	lw	%0, 0($31)			\n"
53	"	" STR(PTR_ADDU) " %0, $31, %0		\n"
54	"	.set pop				\n"
55	: "=r" (addr)
56	:
57	: "$31");
58#endif /* CONFIG_CPU_MIPSR6 */
59
60	return addr;
61}
62
63#ifdef CONFIG_CLKSRC_MIPS_GIC
64
65static inline void __iomem *get_gic(const struct vdso_time_data *data)
66{
67	return (void __iomem *)((unsigned long)data & PAGE_MASK) - PAGE_SIZE;
68}
69
70#endif /* CONFIG_CLKSRC_MIPS_GIC */
71
72#endif /* __ASSEMBLER__ */
~/ Read-only file preview.