Refactoring of AddressSpace from process class - - - - - - - - - - - - -
[dyninst.git] / dyninstAPI / src / inst-ia64.h
1 /* -*- Mode: C; indent-tabs-mode: true -*-; tab-width: 4 */
2
3 /*
4  * Copyright (c) 1996-2004 Barton P. Miller
5  * 
6  * We provide the Paradyn Parallel Performance Tools (below
7  * described as "Paradyn") on an AS IS basis, and do not warrant its
8  * validity or performance.  We reserve the right to update, modify,
9  * or discontinue this software at any time.  We shall have no
10  * obligation to supply such updates or modifications or any other
11  * form of support to you.
12  * 
13  * This license is for research uses.  For such uses, there is no
14  * charge. We define "research use" to mean you may freely use it
15  * inside your organization for whatever purposes you see fit. But you
16  * may not re-distribute Paradyn or parts of Paradyn, in any form
17  * source or binary (including derivatives), electronic or otherwise,
18  * to any other organization or entity without our permission.
19  * 
20  * (for other uses, please contact us at paradyn@cs.wisc.edu)
21  * 
22  * All warranties, including without limitation, any warranty of
23  * merchantability or fitness for a particular purpose, are hereby
24  * excluded.
25  * 
26  * By your use of Paradyn, you understand and agree that we (or any
27  * other person or entity with proprietary rights in Paradyn) are
28  * under no obligation to provide either maintenance services,
29  * update services, notices of latent defects, or correction of
30  * defects for Paradyn.
31  * 
32  * Even if advised of the possibility of such damages, under no
33  * circumstances shall we (or any other person or entity with
34  * proprietary rights in the software licensed hereunder) be liable
35  * to you or any third party for direct, indirect, or consequential
36  * damages of any character regardless of type of action, including,
37  * without limitation, loss of profits, loss of use, loss of good
38  * will, or computer failure or malfunction.  You agree to indemnify
39  * us (and any other person or entity with proprietary rights in the
40  * software licensed hereunder) for any and all liability it may
41  * incur to third parties resulting from your use of Paradyn.
42  */
43
44 // $Id: inst-ia64.h,v 1.17 2007/09/12 20:57:37 bernat Exp $
45
46 #ifndef INST_IA64_H
47 #define INST_IA64_H
48
49 #include "common/h/Types.h"     // Address
50 class AddressSpace;
51 class IA64_bundle;
52 class IA64_instruction;
53
54 /* Stores locations of pre-baseTramp registers */
55 #define BP_GR0          0               //   0-127
56 #define BP_GR127                (BP_GR0 + 127)
57 #define BP_BR0          128             // 128-135
58 #define BP_BR7                  (BP_BR0 + 7)
59 #define BP_PR           136             // 136
60 #define BP_AR0          137             // 137-264
61 #define BP_AR63                 (BP_AR0 + 63)
62 #define BP_AR64                 (BP_AR0 + 64)
63 #define BP_AR127                (BP_AR0 + 127)
64 #define BP_R_MAX        (BP_AR0 + 128)
65
66 /* aliases */
67 #define BP_KR0          BP_AR0
68 #define BP_AR_CSD       (BP_AR0 + 25)
69 #define BP_AR_SSD       (BP_AR0 + 26)
70 #define BP_AR_CCV       (BP_AR0 + 32)
71 #define BP_AR_PFS       (BP_AR0 + 64)
72
73 /* Required for ast.C */
74 #define REG_MT_POS      13
75
76 class InsnAddr {
77         public:
78                 /* prefix increment */
79                 InsnAddr operator++ ();
80
81                 /* prefix decrement */
82                 InsnAddr operator-- ();
83
84                 /* postfix increment */
85                 InsnAddr operator++ (int dummy);
86
87                 /* postfix decrement */
88                 InsnAddr operator-- (int dummy);
89
90                 /* sum of two InsnAddrs */
91                 friend InsnAddr operator + ( InsnAddr lhs, InsnAddr rhs );
92
93                 /* difference of two InsnAddrs */
94                 friend InsnAddr operator - ( InsnAddr lhs, InsnAddr rhs );
95
96                 /* Returns the left-aligned instruction at this address. */
97                 uint64_t operator * ();
98
99                 friend bool operator < ( InsnAddr lhs, InsnAddr rhs );
100                 friend bool operator <= ( InsnAddr lhs, InsnAddr rhs );
101                 friend bool operator > ( InsnAddr lhs, InsnAddr rhs );
102                 friend bool operator >= ( InsnAddr lhs, InsnAddr rhs );
103                 friend bool operator == ( InsnAddr lhs, InsnAddr rhs );
104                 friend bool operator != ( InsnAddr lhs, InsnAddr rhs );
105
106                 static InsnAddr generateFromAlignedDataAddress( Address addr, AddressSpace * p );
107                 bool writeMyBundleFrom( const unsigned char * savedCodeBuffer );
108                 bool saveMyBundleTo( unsigned char * savedCodeBuffer );
109                 bool saveBundlesTo( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
110                 bool writeBundlesFrom( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
111                 bool replaceBundleWith( const IA64_bundle & bundle );
112                 bool replaceBundlesWith( const IA64_bundle * replacementBundles, unsigned int numberOfReplacementBundles );
113                 bool writeStringAtOffset( unsigned int offsetInBundles, const char * pdstring, unsigned int length );
114
115         private:
116                 InsnAddr( Address addr, AddressSpace * p ) : encodedAddress( addr ), myProc( p ) { }
117                 Address encodedAddress;
118                 AddressSpace * myProc;
119 }; /* end class InsnAddr */
120
121 #include "arch-ia64.h"
122
123 class IA64_iterator {
124         /* FIXME: if/when InsnAddr and/or InstrucIter are implemented, move the
125            address-munging functionality here. */
126         public:
127                 IA64_iterator( Address addr );
128
129                 friend bool operator < ( IA64_iterator lhs, IA64_iterator rhs );
130
131                 /* Returns the left-aligned instruction at this address. */
132                 IA64_instruction * operator * ();
133                 
134                 /* postfix increment */
135                 const IA64_iterator operator++ (int dummy);
136
137                 Address getEncodedAddress() { return encodedAddress; }
138
139         private:
140                 Address encodedAddress;
141                 IA64_bundle currentBundle;
142 }; /* end class IA64_iterator */
143
144 class dyn_lwp;
145 /* Necessary for get and restore registers() to Do The Right Thing
146    for inferior RPCs. */
147 bool needToHandleSyscall( dyn_lwp * lwp, bool * pcMayHaveRewound = NULL );
148
149 /* Handle machine-encoded offsets correctly. */
150 uint64_t signExtend( bool signBit, uint64_t immediate );
151
152 #endif