1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
/****************************************************************************
* *
* GNAT COMPILER COMPONENTS *
* *
* S I G T R A M P *
* *
* C/Asm Implementation File *
* *
* Copyright (C) 2015-2024, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
* ware Foundation; either version 3, or (at your option) any later ver- *
* sion. GNAT is distributed in the hope that it will be useful, but WITH- *
* OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. *
* *
* As a special exception under Section 7 of GPL version 3, you are granted *
* additional permissions described in the GCC Runtime Library Exception, *
* version 3.1, as published by the Free Software Foundation. *
* *
* In particular, you can freely distribute your programs built with the *
* GNAT Pro compiler, including any required library run-time units, using *
* any licensing terms of your choosing. See the AdaCore Software License *
* for full details. *
* *
* GNAT was originally developed by the GNAT team at New York University. *
* Extensive contributions were provided by Ada Core Technologies Inc. *
* *
****************************************************************************/
/**************************************************
* Android version of the __gnat_sigtramp service *
**************************************************/
#include "sigtramp.h"
/* The ARM port relies on CFI info setup here. Others such as aarch64
rely on kernel CFI and may relay to the handler directly. */
#if defined(__arm__)
#define __SETUP_CFI 1
#else
#define __SETUP_CFI 0
#endif
#if __SETUP_CFI
/* Craft a sigtramp stub providing unwind info for common registers. */
#define TRAMP_COMMON __gnat_sigtramp_common
extern void TRAMP_COMMON
(int signo, void *siginfo, void *sigcontext,
__sigtramphandler_t * handler);
#include <sys/ucontext.h>
void __gnat_sigtramp (int signo, void *si, void *ucontext,
__sigtramphandler_t * handler)
{
struct sigcontext *mcontext = &((ucontext_t *) ucontext)->uc_mcontext;
TRAMP_COMMON (signo, si, mcontext, handler);
}
#include <sigtramp-android-asm.h>
asm (SIGTRAMP_START(TRAMP_COMMON));
asm (SIGTRAMP_BODY);
asm (SIGTRAMP_END(TRAMP_COMMON));
#else /* !__SETUP_CFI */
void __gnat_sigtramp (int signo, void *si, void *ucontext,
__sigtramphandler_t * handler)
{
handler (signo, si, ucontext);
}
#endif
|