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