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