Updates for StackwalkerAPI
[dyninst.git] / stackwalk / src / ppc-swk.C
1 /*
2  * Copyright (c) 1996-2007 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
30  */
31
32 #include "stackwalk/h/swk_errors.h"
33 #include "stackwalk/h/procstate.h"
34 #include "stackwalk/h/framestepper.h"
35 #include "stackwalk/h/basetypes.h"
36 #include "stackwalk/h/frame.h"
37
38 #include "stackwalk/src/sw.h"
39
40 using namespace Dyninst;
41 using namespace Dyninst::Stackwalker;
42
43 bool ProcSelf::getRegValue(Dyninst::MachRegister reg, THR_ID, Dyninst::MachRegisterVal &val)
44 {
45   register Dyninst::MachRegisterVal **sp;
46   Dyninst::MachRegisterVal *fp_ra;
47
48   __asm__("or %0, %%r1, %%r1\n"
49           : "=r"(sp));
50
51   if (reg == Dyninst::MachRegStackBase) {
52      val = (Dyninst::MachRegisterVal) sp;
53   }
54
55   fp_ra = *sp;
56   if (reg == Dyninst::MachRegFrameBase) 
57   {
58      val = fp_ra[0];
59   }
60
61   if (reg == Dyninst::MachRegPC) 
62   {
63      val = fp_ra[1];
64   }
65
66   sw_printf("[%s:%u] - Returning value %lx for reg %u\n", 
67             __FILE__, __LINE__, val, reg);
68   return true;
69 }
70
71 FrameFuncStepperImpl::FrameFuncStepperImpl(Walker *w, FrameStepper *parent_,
72                                            FrameFuncHelper *) :
73    FrameStepper(w),
74    parent(parent_),
75    helper(NULL)
76 {
77 }
78
79 gcframe_ret_t FrameFuncStepperImpl::getCallerFrame(const Frame &in, Frame &out)
80 {
81   Address in_fp, out_sp;
82   bool result;
83   struct {
84     Address out_fp;
85     Address out_ra;
86   } ra_fp_pair;
87
88   if (!in.getFP())
89     return gcf_stackbottom;
90
91   in_fp = in.getFP();
92
93   //TODO: Mutatee word size
94   out_sp = in_fp;
95   out.setSP(out_sp);
96   
97   result = getProcessState()->readMem(&ra_fp_pair, in_fp, 
98                                       sizeof(ra_fp_pair));
99   if (!result) {
100     sw_printf("[%s:%u] - Couldn't read from %lx\n", __FILE__, __LINE__, in_fp);
101     return gcf_error;
102   }
103   out.setFP(ra_fp_pair.out_fp);
104
105   result = getProcessState()->readMem(&ra_fp_pair, ra_fp_pair.out_fp, 
106                                       sizeof(ra_fp_pair));
107   if (!result) {
108     sw_printf("[%s:%u] - Couldn't read from %lx\n", __FILE__, __LINE__,
109               ra_fp_pair.out_fp);
110     return gcf_error;
111   }
112   if (!ra_fp_pair.out_ra) {
113     return gcf_stackbottom;
114   }
115
116
117   out.setRA(ra_fp_pair.out_ra);
118
119
120   return gcf_success;
121 }
122  
123 unsigned FrameFuncStepperImpl::getPriority() const
124 {
125   return 0x11000;
126 }
127
128 FrameFuncStepperImpl::~FrameFuncStepperImpl()
129 {
130 }
131
132 UninitFrameStepper::UninitFrameStepper(Walker *w, FrameFuncHelper *) :
133    FrameStepper(w)
134 {
135    impl = NULL;
136 }
137
138 gcframe_ret_t UninitFrameStepper::getCallerFrame(const Frame &, Frame &)
139 {
140    sw_printf("[%s:%u] - Error,  UninitFrame used on unsupported platform\n",
141              __FILE__, __LINE__);
142    assert(0);
143    return gcf_error;
144 }
145
146 unsigned UninitFrameStepper::getPriority() const
147 {
148    sw_printf("[%s:%u] - Error,  UninitFrame used on unsupported platform\n",
149              __FILE__, __LINE__);
150    assert(0);
151    return 0;
152 }
153
154 void UninitFrameStepper::registerStepperGroup(StepperGroup *)
155 {
156    sw_printf("[%s:%u] - Error,  UninitFrame used on unsupported platform\n",
157              __FILE__, __LINE__);
158    assert(0);
159 }
160
161 UninitFrameStepper::~UninitFrameStepper()
162 {
163    impl = NULL;
164 }
165
166 StepperWanderer::StepperWanderer(Walker *, WandererHelper *, FrameFuncHelper *) :
167    FrameStepper(NULL)
168 {
169    sw_printf("[%s:%u] - Error,  Wanderer used on unsupported platform\n",
170              __FILE__, __LINE__);
171    assert(0);
172 }
173
174 gcframe_ret_t StepperWanderer::getCallerFrame(const Frame &, Frame &)
175 {
176    sw_printf("[%s:%u] - Error,  Wanderer used on unsupported platform\n",
177              __FILE__, __LINE__);
178    assert(0);
179 }
180
181 unsigned StepperWanderer::getPriority() const
182 {
183    sw_printf("[%s:%u] - Error,  Wanderer used on unsupported platform\n",
184              __FILE__, __LINE__);
185    assert(0);
186 }
187
188 StepperWanderer::~StepperWanderer()
189 {
190 }
191
192 WandererHelper::WandererHelper(ProcessState *proc_) :
193    proc(proc_)
194 {
195 }
196
197 bool WandererHelper::isPrevInstrACall(Address, Address&)
198 {
199    sw_printf("[%s:%u] - Unimplemented on this platform!\n");
200    assert(0);
201    return false;
202 }
203
204 bool WandererHelper::isPCInFunc(Address, Address)
205 {
206    sw_printf("[%s:%u] - Unimplemented on this platform!\n");
207    assert(0);
208    return false;
209 }
210
211 WandererHelper::~WandererHelper()
212 {
213 }
214