34 import sun.jvm.hotspot.utilities.*;
35
36 /** Specialization of and implementation of abstract methods of the
37 Frame class for the ppc64 family of CPUs. */
38
39 public class PPC64Frame extends Frame {
40 private static final boolean DEBUG;
41 static {
42 DEBUG = System.getProperty("sun.jvm.hotspot.runtime.ppc64.PPC64Frame.DEBUG") != null;
43 }
44
45 // All frames
46 private static final int SENDER_SP_OFFSET = 0;
47
48 // Interpreter frames
49 private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
50 private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
51 private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
52 private static final int INTERPRETER_FRAME_ESP_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
53 private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
54 private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
55 private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
56 private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
57 private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
58 private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_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:
427 }
428
429 /** Expression stack from top down */
430 public Address addressOfInterpreterFrameTOSAt(int slot) {
431 return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
432 }
433
434 public Address getInterpreterFrameSenderSP() {
435 if (Assert.ASSERTS_ENABLED) {
436 Assert.that(isInterpretedFrame(), "interpreted frame expected");
437 }
438 return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
439 }
440
441 // Monitors
442 public BasicObjectLock interpreterFrameMonitorBegin() {
443 return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
444 }
445
446 public BasicObjectLock interpreterFrameMonitorEnd() {
447 Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET).getAddressAt(0);
448 if (Assert.ASSERTS_ENABLED) {
449 // make sure the pointer points inside the frame
450 Assert.that(AddressOps.gt(getFP(), result), "result must < than frame pointer");
451 Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
452 }
453 return new BasicObjectLock(result);
454 }
455
456 public int interpreterFrameMonitorSize() {
457 return BasicObjectLock.size();
458 }
459
460 // Method
461 public Address addressOfInterpreterFrameMethod() {
462 return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
463 }
464
465 // Constant pool cache
466 public Address addressOfInterpreterFrameCPCache() {
467 return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
|
34 import sun.jvm.hotspot.utilities.*;
35
36 /** Specialization of and implementation of abstract methods of the
37 Frame class for the ppc64 family of CPUs. */
38
39 public class PPC64Frame extends Frame {
40 private static final boolean DEBUG;
41 static {
42 DEBUG = System.getProperty("sun.jvm.hotspot.runtime.ppc64.PPC64Frame.DEBUG") != null;
43 }
44
45 // All frames
46 private static final int SENDER_SP_OFFSET = 0;
47
48 // Interpreter frames
49 private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
50 private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
51 private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
52 private static final int INTERPRETER_FRAME_ESP_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
53 private static final int INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_ESP_OFFSET - 1;
54 private static final int INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1;
55 private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
56 private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
57 private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
58 private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
59 private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
60
61 // Entry frames
62 private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET;
63
64 static {
65 VM.registerVMInitializedObserver(new Observer() {
66 public void update(Observable o, Object data) {
67 initialize(VM.getVM().getTypeDataBase());
68 }
69 });
70 }
71
72 private static synchronized void initialize(TypeDataBase db) {
73 int entry_frame_locals_size = db.lookupIntConstant("frame::entry_frame_locals_size").intValue();
74 int wordLength = (int) VM.getVM().getAddressSize();
75 ENTRY_FRAME_CALL_WRAPPER_OFFSET = -entry_frame_locals_size/wordLength;
76 }
77
78
79 // an additional field beyond sp and pc:
425 }
426
427 /** Expression stack from top down */
428 public Address addressOfInterpreterFrameTOSAt(int slot) {
429 return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
430 }
431
432 public Address getInterpreterFrameSenderSP() {
433 if (Assert.ASSERTS_ENABLED) {
434 Assert.that(isInterpretedFrame(), "interpreted frame expected");
435 }
436 return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
437 }
438
439 // Monitors
440 public BasicObjectLock interpreterFrameMonitorBegin() {
441 return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
442 }
443
444 public BasicObjectLock interpreterFrameMonitorEnd() {
445 Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITORS_OFFSET).getAddressAt(0);
446 if (Assert.ASSERTS_ENABLED) {
447 // make sure the pointer points inside the frame
448 Assert.that(AddressOps.gt(getFP(), result), "result must < than frame pointer");
449 Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
450 }
451 return new BasicObjectLock(result);
452 }
453
454 public int interpreterFrameMonitorSize() {
455 return BasicObjectLock.size();
456 }
457
458 // Method
459 public Address addressOfInterpreterFrameMethod() {
460 return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
461 }
462
463 // Constant pool cache
464 public Address addressOfInterpreterFrameCPCache() {
465 return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
|