1*c8061893SJerome Forissier/* SPDX-License-Identifier: BSD-2-Clause */ 2*c8061893SJerome Forissier/* 3*c8061893SJerome Forissier * Copyright (c) 2019, Linaro Limited 4*c8061893SJerome Forissier */ 5*c8061893SJerome Forissier 6*c8061893SJerome Forissier#include <asm.S> 7*c8061893SJerome Forissier 8*c8061893SJerome Forissier#if defined(CFG_UNWIND) 9*c8061893SJerome Forissier#define UNWIND(...) __VA_ARGS__ 10*c8061893SJerome Forissier#else 11*c8061893SJerome Forissier#define UNWIND(...) 12*c8061893SJerome Forissier#endif 13*c8061893SJerome Forissier 14*c8061893SJerome Forissier/* 15*c8061893SJerome Forissier * This function is the bottom of the user call stack. Mark it as such so that 16*c8061893SJerome Forissier * the unwinding code won't try to go further down. 17*c8061893SJerome Forissier * We need an assembly wrapper because Clang does not accept asm(".cantunwind") 18*c8061893SJerome Forissier * in a C function: 19*c8061893SJerome Forissier * 20*c8061893SJerome Forissier * user_ta_header.c:44:6: error: .fnstart must precede .cantunwind directive 21*c8061893SJerome Forissier * asm(".cantunwind"); 22*c8061893SJerome Forissier * ^ 23*c8061893SJerome Forissier */ 24*c8061893SJerome ForissierFUNC __ta_entry, : 25*c8061893SJerome ForissierUNWIND( .fnstart) 26*c8061893SJerome ForissierUNWIND( .cantunwind) 27*c8061893SJerome Forissier bl __ta_entry_c 28*c8061893SJerome Forissier /* 29*c8061893SJerome Forissier * The nop makes the stack unwinding more clear (without it, 30*c8061893SJerome Forissier * symbolize.py may show a file/line outside the function). 31*c8061893SJerome Forissier */ 32*c8061893SJerome Forissier nop 33*c8061893SJerome ForissierUNWIND( .fnend) 34*c8061893SJerome ForissierEND_FUNC __ta_entry 35