46 private static final int SENDER_SP_OFFSET = 0;
47
48 // Interpreter frames
49 private static final int INTERPRETER_FRAME_MIRROR_OFFSET = -3; // for native calls only
50 private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
51 private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
52 private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
53 private static final int INTERPRETER_FRAME_ESP_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
54 private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
55 private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
56 private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
57 private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
58 private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
59 private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
60 private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
61 private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
62
63 // Entry frames
64 private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
65
66 // Native frames
67 private static int NATIVE_FRAME_INITIAL_PARAM_OFFSET;
68
69
70 static {
71 VM.registerVMInitializedObserver(new Observer() {
72 public void update(Observable o, Object data) {
73 initialize(VM.getVM().getTypeDataBase());
74 }
75 });
76 }
77
78 private static synchronized void initialize(TypeDataBase db) {
79 int abi_minframe_size = db.lookupIntConstant("frame::abi_minframe_size").intValue();
80 int entry_frame_locals_size = db.lookupIntConstant("frame::entry_frame_locals_size").intValue();
81 int wordLength = (int) VM.getVM().getAddressSize();
82 NATIVE_FRAME_INITIAL_PARAM_OFFSET = -abi_minframe_size/wordLength;
83 ENTRY_FRAME_CALL_WRAPPER_OFFSET = -entry_frame_locals_size/wordLength;
84 }
85
86
87 // an additional field beyond sp and pc:
88 Address raw_fp; // frame pointer
89 private Address raw_unextendedSP;
90
91 private PPC64Frame() {
92 }
93
94 private void adjustForDeopt() {
95 if ( pc != null) {
96 // Look for a deopt pc and if it is deopted convert to original pc
97 CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
98 if (cb != null && cb.isJavaMethod()) {
99 NMethod nm = (NMethod) cb;
100 if (pc.equals(nm.deoptHandlerBegin())) {
101 if (Assert.ASSERTS_ENABLED) {
102 Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
371 return new PPC64Frame(senderSP, getLink(), senderPC);
372 }
373
374 protected boolean hasSenderPD() {
375 // FIXME
376 return true;
377 }
378
379 public long frameSize() {
380 return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
381 }
382
383 public Address getLink() {
384 return getSenderSP().getAddressAt(0);
385 }
386
387 public Address getUnextendedSP() { return raw_unextendedSP; }
388
389 // Return address:
390 public Address getSenderPC() { return getSenderSP().getAddressAt(2 * VM.getVM().getAddressSize()); }
391
392 // return address of param, zero origin index.
393 // MPJ note: Appears to be unused.
394 public Address getNativeParamAddr(int idx) {
395 return null;
396 // return addressOfStackSlot(NATIVE_FRAME_INITIAL_PARAM_OFFSET + idx);
397 }
398
399 public Address getSenderSP() { return getFP(); }
400 public Address addressOfInterpreterFrameLocals() {
401 return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
402 }
403
404 private Address addressOfInterpreterFrameBCX() {
405 return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
406 }
407
408 public int getInterpreterFrameBCI() {
409 // FIXME: this is not atomic with respect to GC and is unsuitable
410 // for use in a non-debugging, or reflective, system. Need to
411 // figure out how to express this.
412 Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
413 Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
414 Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
415 return bcpToBci(bcp, method);
416 }
417
|
46 private static final int SENDER_SP_OFFSET = 0;
47
48 // Interpreter frames
49 private static final int INTERPRETER_FRAME_MIRROR_OFFSET = -3; // for native calls only
50 private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
51 private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
52 private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
53 private static final int INTERPRETER_FRAME_ESP_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
54 private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
55 private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
56 private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
57 private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
58 private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
59 private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
60 private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
61 private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
62
63 // Entry frames
64 private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
65
66 static {
67 VM.registerVMInitializedObserver(new Observer() {
68 public void update(Observable o, Object data) {
69 initialize(VM.getVM().getTypeDataBase());
70 }
71 });
72 }
73
74 private static synchronized void initialize(TypeDataBase db) {
75 int entry_frame_locals_size = db.lookupIntConstant("frame::entry_frame_locals_size").intValue();
76 int wordLength = (int) VM.getVM().getAddressSize();
77 ENTRY_FRAME_CALL_WRAPPER_OFFSET = -entry_frame_locals_size/wordLength;
78 }
79
80
81 // an additional field beyond sp and pc:
82 Address raw_fp; // frame pointer
83 private Address raw_unextendedSP;
84
85 private PPC64Frame() {
86 }
87
88 private void adjustForDeopt() {
89 if ( pc != null) {
90 // Look for a deopt pc and if it is deopted convert to original pc
91 CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
92 if (cb != null && cb.isJavaMethod()) {
93 NMethod nm = (NMethod) cb;
94 if (pc.equals(nm.deoptHandlerBegin())) {
95 if (Assert.ASSERTS_ENABLED) {
96 Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
365 return new PPC64Frame(senderSP, getLink(), senderPC);
366 }
367
368 protected boolean hasSenderPD() {
369 // FIXME
370 return true;
371 }
372
373 public long frameSize() {
374 return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
375 }
376
377 public Address getLink() {
378 return getSenderSP().getAddressAt(0);
379 }
380
381 public Address getUnextendedSP() { return raw_unextendedSP; }
382
383 // Return address:
384 public Address getSenderPC() { return getSenderSP().getAddressAt(2 * VM.getVM().getAddressSize()); }
385
386 public Address getSenderSP() { return getFP(); }
387 public Address addressOfInterpreterFrameLocals() {
388 return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
389 }
390
391 private Address addressOfInterpreterFrameBCX() {
392 return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
393 }
394
395 public int getInterpreterFrameBCI() {
396 // FIXME: this is not atomic with respect to GC and is unsuitable
397 // for use in a non-debugging, or reflective, system. Need to
398 // figure out how to express this.
399 Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
400 Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
401 Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
402 return bcpToBci(bcp, method);
403 }
404
|