1 /*
2  * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 package sun.jvm.hotspot.debugger.windows.x86;
26 
27 import sun.jvm.hotspot.debugger.*;
28 import sun.jvm.hotspot.debugger.x86.*;
29 import sun.jvm.hotspot.debugger.cdbg.*;
30 import sun.jvm.hotspot.debugger.cdbg.basic.*;
31 import sun.jvm.hotspot.debugger.windbg.*;
32 
33 public class WindowsX86CFrame extends BasicCFrame {
34   private Address ebp;
35   private Address pc;
36 
37   private static final int ADDRESS_SIZE = 4;
38 
39   /** Constructor for topmost frame */
WindowsX86CFrame(WindbgDebugger dbg, Address ebp, Address pc)40   public WindowsX86CFrame(WindbgDebugger dbg, Address ebp, Address pc) {
41     super(dbg.getCDebugger());
42     this.ebp = ebp;
43     this.pc  = pc;
44     this.dbg = dbg;
45   }
46 
sender(ThreadProxy thread)47   public CFrame sender(ThreadProxy thread) {
48     X86ThreadContext context = (X86ThreadContext) thread.getContext();
49     /*
50      * Native code fills in the stack pointer register value using index
51      * X86ThreadContext.SP.
52      * See file sawindbg.cpp macro REG_INDEX(x).
53      *
54      * Be sure to use SP, or UESP which is aliased to SP in Java code,
55      * for the frame pointer validity check.
56      */
57     Address esp = context.getRegisterAsAddress(X86ThreadContext.SP);
58 
59     if ( (ebp == null) || ebp.lessThan(esp) ) {
60       return null;
61     }
62 
63     // Check alignment of ebp
64     if ( dbg.getAddressValue(ebp) % ADDRESS_SIZE != 0) {
65         return null;
66     }
67 
68     Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE);
69     if (nextEBP == null || nextEBP.lessThanOrEqual(ebp)) {
70       return null;
71     }
72     Address nextPC  = ebp.getAddressAt( 1 * ADDRESS_SIZE);
73     if (nextPC == null) {
74       return null;
75     }
76     return new WindowsX86CFrame(dbg, nextEBP, nextPC);
77   }
78 
pc()79   public Address pc() {
80     return pc;
81   }
82 
localVariableBase()83   public Address localVariableBase() {
84     return ebp;
85   }
86 
87   private WindbgDebugger dbg;
88 }
89