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