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