More build fixes.
[dyninst.git] / dyninstAPI / src / inst-aarch64.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  *
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  *
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  *
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  *
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  *
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #ifndef INST_AARCH64_H
32 #define INST_AARCH64_H
33
34 #define DEAD_REG              0
35 #define LIVE_REG              1
36 #define LIVE_UNCLOBBERED_REG  2
37 #define LIVE_CLOBBERED_REG    3
38
39 #define GPRSIZE_32            4
40 #define GPRSIZE_64            8
41 #define FPRSIZE               16
42
43 #define REG_SP                  1
44 #define REG_TOC               2   /* TOC anchor                            */
45 // REG_GUARD_OFFSET and REG_GUARD_VALUE could overlap.
46 #define REG_GUARD_ADDR        5   /* Arbitrary                             */
47 #define REG_GUARD_VALUE       6
48 #define REG_GUARD_OFFSET      6
49
50 #define REG_COST_ADDR         5
51 #define REG_COST_VALUE        6
52
53 #define REG_SCRATCH          10
54
55 //TODO ??
56 // The stack grows down from high addresses toward low addresses.
57 // There is a maximum number of bytes on the stack below the current
58 // value of the stack frame pointer that a function can use without
59 // first establishing a new stack frame.  When our instrumentation
60 // needs to use the stack, we make sure not to write into this
61 // potentially used area.  AIX documentation stated 220 bytes as
62 // the maximum size of this area.  64-bit PowerPC ELF ABI Supplement,
63 // Version 1.9, 2004-10-23, used by Linux, stated 288 bytes for this
64 // area.  We skip the larger number of bytes (288) to be safe on both
65 // AIX and Linux, 32-bit and 64-bit.
66 #define STACKSKIP          288
67
68 #define ALIGN_QUADWORD(x)  ( ((x) + 0xf) & ~0xf )  //x is positive or unsigned
69
70 //TODO Fix for ARM
71 #define GPRSAVE_64  (31*8)
72 #define FPRSAVE     (32*16)
73 #define SPRSAVE_64  (1*8+3*4)
74 #define FUNCSAVE_64 (32*8)
75 #define FUNCARGS_64 (16*8)
76 #define LINKAREA_64 (6*8)
77
78 #if defined(os_linux)
79 #define PARAM_OFFSET(mutatee_address_width)                         \
80         (                                                           \
81             ((mutatee_address_width) == sizeof(uint64_t))           \
82             ? (   /* 64-bit ELF PowerPC Linux                   */  \
83                   sizeof(uint64_t) +  /* TOC save               */  \
84                   sizeof(uint64_t) +  /* link editor doubleword */  \
85                   sizeof(uint64_t) +  /* compiler doubleword    */  \
86                   sizeof(uint64_t) +  /* LR save                */  \
87                   sizeof(uint64_t) +  /* CR save                */  \
88                   sizeof(uint64_t)    /* Stack frame back chain */  \
89               )                                                     \
90             : (   /* 32-bit ELF PowerPC Linux                   */  \
91                   sizeof(uint32_t) +  /* LR save                */  \
92                   sizeof(uint32_t)    /* Stack frame back chain */  \
93               )                                                     \
94         )
95 #elif defined(os_vxworks)
96 #define PARAM_OFFSET(bah) (0)
97 #else
98 #error "Unknown operating system in inst-aarch64.h"
99 #endif
100
101
102 #define TRAMP_FRAME_SIZE_64 ALIGN_QUADWORD(STACKSKIP + GPRSAVE_64 + FPRSAVE \
103                                            + SPRSAVE_64 \
104                                            + FUNCSAVE_64 + FUNCARGS_64 + LINKAREA_64)
105 #define PDYN_RESERVED_64 (LINKAREA_64 + FUNCARGS_64 + FUNCSAVE_64)
106
107 #define TRAMP_SPR_OFFSET_64 (PDYN_RESERVED_64)
108 #define STK_LR       (              0)
109 #define STK_NZCV     (STK_SP_EL0  + 8)
110 #define STK_FPCR     (STK_NZCV    + 4)
111 #define STK_FPSR     (STK_FPCR    + 4)
112
113 #define TRAMP_FPR_OFFSET_64 (TRAMP_SPR_OFFSET_64 + SPRSAVE_64)
114 #define TRAMP_GPR_OFFSET_64 (TRAMP_FPR_OFFSET_64 + FPRSAVE)
115 #define FUNC_CALL_SAVE_64   (LINKAREA_64 + FUNCARGS_64)
116
117 #endif