//===-- hwasan_setjmp_riscv64.S -------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of HWAddressSanitizer. // setjmp interceptor for risc-v. // HWAddressSanitizer runtime. //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_asm.h" #include "builtins/assembly.h" #if HWASAN_WITH_INTERCEPTORS && defined(__riscv) && (__riscv_xlen == 64) #include "sanitizer_common/sanitizer_platform.h" // We want to save the context of the calling function. // That requires // 1) No modification of the link register by this function. // 2) No modification of the stack pointer by this function. // 3) (no modification of any other saved register, but that's not really going // to occur, and hence isn't as much of a worry). // // There's essentially no way to ensure that the compiler will not modify the // stack pointer when compiling a C function. // Hence we have to write this function in assembly. .section .text .file "hwasan_setjmp_riscv64.S" .global __interceptor_setjmp ASM_TYPE_FUNCTION(__interceptor_setjmp) __interceptor_setjmp: CFI_STARTPROC addi x11, x0, 0 tail __interceptor_sigsetjmp CFI_ENDPROC ASM_SIZE(__interceptor_setjmp) .global __interceptor_sigsetjmp ASM_TYPE_FUNCTION(__interceptor_sigsetjmp) __interceptor_sigsetjmp: CFI_STARTPROC sd ra, 0<<3(x10) sd s0, 1<<3(x10) sd s1, 2<<3(x10) sd s2, 3<<3(x10) sd s3, 4<<3(x10) sd s4, 5<<3(x10) sd s5, 6<<3(x10) sd s6, 7<<3(x10) sd s7, 8<<3(x10) sd s8, 9<<3(x10) sd s9, 10<<3(x10) sd s10, 11<<3(x10) sd s11, 12<<3(x10) sd sp, 13<<3(x10) #if __riscv_float_abi_double fsd fs0, 14<<3(x10) fsd fs1, 15<<3(x10) fsd fs2, 16<<3(x10) fsd fs3, 17<<3(x10) fsd fs4, 18<<3(x10) fsd fs5, 19<<3(x10) fsd fs6, 20<<3(x10) fsd fs7, 21<<3(x10) fsd fs8, 22<<3(x10) fsd fs9, 23<<3(x10) fsd fs10, 24<<3(x10) fsd fs11, 25<<3(x10) #elif __riscv_float_abi_soft #else # error "Unsupported case" #endif // We always have the second argument to __sigjmp_save (savemask) set, since // the _setjmp function above has set it for us as `false`. // This function is defined in hwasan_interceptors.cc tail __sigjmp_save CFI_ENDPROC ASM_SIZE(__interceptor_sigsetjmp) .macro WEAK_ALIAS first second .weak \second .equ \second\(), \first .endm WEAK_ALIAS __interceptor_sigsetjmp, __sigsetjmp WEAK_ALIAS __interceptor_setjmp, _setjmp #endif // We do not need executable stack. NO_EXEC_STACK_DIRECTIVE