xref: /qemu/linux-user/aarch64/vdso.S (revision ee95fae075c68cf1ae0fc1ffb00acca685bfb2c8)
1*ee95fae0SRichard Henderson/*
2*ee95fae0SRichard Henderson * aarch64 linux replacement vdso.
3*ee95fae0SRichard Henderson *
4*ee95fae0SRichard Henderson * Copyright 2023 Linaro, Ltd.
5*ee95fae0SRichard Henderson *
6*ee95fae0SRichard Henderson * SPDX-License-Identifier: GPL-2.0-or-later
7*ee95fae0SRichard Henderson */
8*ee95fae0SRichard Henderson
9*ee95fae0SRichard Henderson#include <asm/unistd.h>
10*ee95fae0SRichard Henderson
11*ee95fae0SRichard Henderson/* ??? These are in include/elf.h, which is not ready for inclusion in asm. */
12*ee95fae0SRichard Henderson#define NT_GNU_PROPERTY_TYPE_0  5
13*ee95fae0SRichard Henderson#define GNU_PROPERTY_AARCH64_FEATURE_1_AND      0xc0000000
14*ee95fae0SRichard Henderson#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI      (1U << 0)
15*ee95fae0SRichard Henderson#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC      (1U << 1)
16*ee95fae0SRichard Henderson
17*ee95fae0SRichard Henderson#define GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT \
18*ee95fae0SRichard Henderson    (GNU_PROPERTY_AARCH64_FEATURE_1_BTI | GNU_PROPERTY_AARCH64_FEATURE_1_PAC)
19*ee95fae0SRichard Henderson
20*ee95fae0SRichard Henderson	.section .note.gnu.property
21*ee95fae0SRichard Henderson	.align	3
22*ee95fae0SRichard Henderson	.long	2f - 1f
23*ee95fae0SRichard Henderson	.long	6f - 3f
24*ee95fae0SRichard Henderson	.long	NT_GNU_PROPERTY_TYPE_0
25*ee95fae0SRichard Henderson1:	.string	"GNU"
26*ee95fae0SRichard Henderson2:	.align	3
27*ee95fae0SRichard Henderson3:	.long	GNU_PROPERTY_AARCH64_FEATURE_1_AND
28*ee95fae0SRichard Henderson	.long	5f - 4f
29*ee95fae0SRichard Henderson4:	.long	GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT
30*ee95fae0SRichard Henderson5:	.align	3
31*ee95fae0SRichard Henderson6:
32*ee95fae0SRichard Henderson
33*ee95fae0SRichard Henderson	.text
34*ee95fae0SRichard Henderson
35*ee95fae0SRichard Henderson.macro endf name
36*ee95fae0SRichard Henderson	.globl	\name
37*ee95fae0SRichard Henderson	.type	\name, @function
38*ee95fae0SRichard Henderson	.size	\name, . - \name
39*ee95fae0SRichard Henderson.endm
40*ee95fae0SRichard Henderson
41*ee95fae0SRichard Henderson.macro vdso_syscall name, nr
42*ee95fae0SRichard Henderson\name:
43*ee95fae0SRichard Henderson	bti	c
44*ee95fae0SRichard Henderson	mov	x8, #\nr
45*ee95fae0SRichard Henderson	svc	#0
46*ee95fae0SRichard Henderson	ret
47*ee95fae0SRichard Hendersonendf	\name
48*ee95fae0SRichard Henderson.endm
49*ee95fae0SRichard Henderson
50*ee95fae0SRichard Henderson	.cfi_startproc
51*ee95fae0SRichard Henderson
52*ee95fae0SRichard Hendersonvdso_syscall __kernel_gettimeofday, __NR_gettimeofday
53*ee95fae0SRichard Hendersonvdso_syscall __kernel_clock_gettime, __NR_clock_gettime
54*ee95fae0SRichard Hendersonvdso_syscall __kernel_clock_getres, __NR_clock_getres
55*ee95fae0SRichard Henderson
56*ee95fae0SRichard Henderson	.cfi_endproc
57*ee95fae0SRichard Henderson
58*ee95fae0SRichard Henderson
59*ee95fae0SRichard Henderson/*
60*ee95fae0SRichard Henderson * TODO: The kernel makes a big deal of turning off the .cfi directives,
61*ee95fae0SRichard Henderson * because they cause libgcc to crash, but that's because they're wrong.
62*ee95fae0SRichard Henderson *
63*ee95fae0SRichard Henderson * For now, elide the unwind info for __kernel_rt_sigreturn and rely on
64*ee95fae0SRichard Henderson * the libgcc fallback routine as we have always done.  This requires
65*ee95fae0SRichard Henderson * that the code sequence used be exact.
66*ee95fae0SRichard Henderson */
67*ee95fae0SRichard Henderson__kernel_rt_sigreturn:
68*ee95fae0SRichard Henderson	/* No BTI C insn here -- we arrive via RET. */
69*ee95fae0SRichard Henderson	mov	x8, #__NR_rt_sigreturn
70*ee95fae0SRichard Henderson	svc	#0
71*ee95fae0SRichard Hendersonendf	__kernel_rt_sigreturn
72