11bb92983SJerome Forissier/* SPDX-License-Identifier: BSD-3-Clause */ 20c81fcd6SJens Wiklander/* 30c81fcd6SJens Wiklander Copyright (c) 2011, 2012 ARM Ltd 40c81fcd6SJens Wiklander All rights reserved. 50c81fcd6SJens Wiklander 60c81fcd6SJens Wiklander Redistribution and use in source and binary forms, with or without 70c81fcd6SJens Wiklander modification, are permitted provided that the following conditions 80c81fcd6SJens Wiklander are met: 90c81fcd6SJens Wiklander 1. Redistributions of source code must retain the above copyright 100c81fcd6SJens Wiklander notice, this list of conditions and the following disclaimer. 110c81fcd6SJens Wiklander 2. Redistributions in binary form must reproduce the above copyright 120c81fcd6SJens Wiklander notice, this list of conditions and the following disclaimer in the 130c81fcd6SJens Wiklander documentation and/or other materials provided with the distribution. 140c81fcd6SJens Wiklander 3. The name of the company may not be used to endorse or promote 150c81fcd6SJens Wiklander products derived from this software without specific prior written 160c81fcd6SJens Wiklander permission. 170c81fcd6SJens Wiklander 180c81fcd6SJens Wiklander THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED 190c81fcd6SJens Wiklander WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 200c81fcd6SJens Wiklander MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 210c81fcd6SJens Wiklander IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 220c81fcd6SJens Wiklander SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 230c81fcd6SJens Wiklander TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 240c81fcd6SJens Wiklander PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 250c81fcd6SJens Wiklander LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 260c81fcd6SJens Wiklander NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 270c81fcd6SJens Wiklander SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 280c81fcd6SJens Wiklander */ 290c81fcd6SJens Wiklander 307ad2713dSRuchika Gupta#include <asm.S> 317ad2713dSRuchika Gupta 320c81fcd6SJens Wiklander#define GPR_LAYOUT \ 330c81fcd6SJens Wiklander REG_PAIR (x19, x20, 0); \ 340c81fcd6SJens Wiklander REG_PAIR (x21, x22, 16); \ 350c81fcd6SJens Wiklander REG_PAIR (x23, x24, 32); \ 360c81fcd6SJens Wiklander REG_PAIR (x25, x26, 48); \ 370c81fcd6SJens Wiklander REG_PAIR (x27, x28, 64); \ 380c81fcd6SJens Wiklander REG_PAIR (x29, x30, 80); \ 390c81fcd6SJens Wiklander REG_ONE (x16, 96) 400c81fcd6SJens Wiklander 410c81fcd6SJens Wiklander#define FPR_LAYOUT \ 420c81fcd6SJens Wiklander REG_PAIR ( d8, d9, 112); \ 430c81fcd6SJens Wiklander REG_PAIR (d10, d11, 128); \ 440c81fcd6SJens Wiklander REG_PAIR (d12, d13, 144); \ 450c81fcd6SJens Wiklander REG_PAIR (d14, d15, 160); 460c81fcd6SJens Wiklander 470c81fcd6SJens Wiklander// int setjmp (jmp_buf) 480c81fcd6SJens Wiklander .global setjmp 490c81fcd6SJens Wiklander .type setjmp, %function 500c81fcd6SJens Wiklandersetjmp: 517ad2713dSRuchika GuptaBTI( bti c) 520c81fcd6SJens Wiklander mov x16, sp 530c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS] 540c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS] 550c81fcd6SJens Wiklander GPR_LAYOUT 560c81fcd6SJens Wiklander FPR_LAYOUT 57099918f6SSumit Garg#ifdef CFG_FTRACE_SUPPORT 589d6ac097SSumit Garg stp x29, x30, [sp, #-16]! 599d6ac097SSumit Garg mov x29, sp 609d6ac097SSumit Garg add x0, x0, #104 619d6ac097SSumit Garg bl ftrace_setjmp 629d6ac097SSumit Garg ldp x29, x30, [sp], #16 639d6ac097SSumit Garg#endif 640c81fcd6SJens Wiklander#undef REG_PAIR 650c81fcd6SJens Wiklander#undef REG_ONE 660c81fcd6SJens Wiklander mov w0, #0 670c81fcd6SJens Wiklander ret 680c81fcd6SJens Wiklander .size setjmp, .-setjmp 690c81fcd6SJens Wiklander 700c81fcd6SJens Wiklander// void longjmp (jmp_buf, int) __attribute__ ((noreturn)) 710c81fcd6SJens Wiklander .global longjmp 720c81fcd6SJens Wiklander .type longjmp, %function 730c81fcd6SJens Wiklanderlongjmp: 747ad2713dSRuchika GuptaBTI( bti c) 750c81fcd6SJens Wiklander#define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS] 760c81fcd6SJens Wiklander#define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS] 77099918f6SSumit Garg#ifdef CFG_FTRACE_SUPPORT 789d6ac097SSumit Garg stp x0, x1, [sp, #-16]! 799d6ac097SSumit Garg stp x29, x30, [sp, #-16]! 809d6ac097SSumit Garg mov x29, sp 819d6ac097SSumit Garg add x0, x0, #104 829d6ac097SSumit Garg bl ftrace_longjmp 839d6ac097SSumit Garg ldp x29, x30, [sp], #16 849d6ac097SSumit Garg ldp x0, x1, [sp], #16 859d6ac097SSumit Garg#endif 86*7749dda2SAleksandr Iashchenko#if defined(__KERNEL__) && defined(CFG_CORE_SANITIZE_KADDRESS) && \ 87*7749dda2SAleksandr Iashchenko !defined(CFG_DYN_CONFIG) 88*7749dda2SAleksandr Iashchenko stp x0, x1, [sp, #-16]! 89*7749dda2SAleksandr Iashchenko ldr x0, [x0, 96] 90*7749dda2SAleksandr Iashchenko bl asan_handle_longjmp 91*7749dda2SAleksandr Iashchenko ldp x0, x1, [sp], #16 92*7749dda2SAleksandr Iashchenko#endif 930c81fcd6SJens Wiklander GPR_LAYOUT 940c81fcd6SJens Wiklander FPR_LAYOUT 950c81fcd6SJens Wiklander#undef REG_PAIR 960c81fcd6SJens Wiklander#undef REG_ONE 970c81fcd6SJens Wiklander mov sp, x16 980c81fcd6SJens Wiklander cmp w1, #0 990c81fcd6SJens Wiklander cinc w0, w1, eq 10030e743f6SRuchika Gupta/* 10130e743f6SRuchika Gupta * clang has a bug and doesn't insert bti after setjmp 10230e743f6SRuchika Gupta * causing BTI ecxception. Remove this when the bug is fixed. 10330e743f6SRuchika Gupta * https://bugs.llvm.org/show_bug.cgi?id=49544 10430e743f6SRuchika Gupta */ 10530e743f6SRuchika Gupta#if defined(__clang__) && defined(CFG_TA_BTI) 10630e743f6SRuchika Gupta ret 10730e743f6SRuchika Gupta#else 1080c81fcd6SJens Wiklander // use br not ret, as ret is guaranteed to mispredict 1090c81fcd6SJens Wiklander br x30 11030e743f6SRuchika Gupta#endif 1110c81fcd6SJens Wiklander .size longjmp, .-longjmp 112181f8492SRuchika Gupta 113181f8492SRuchika GuptaBTI(emit_aarch64_feature_1_and GNU_PROPERTY_AARCH64_FEATURE_1_BTI) 114