xref: /optee_os/ta/arch/arm/ta_entry_a32.S (revision c80618936c7024c4ceb06b6783ca6f9626ff30ac)
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