hotspot/src/os/solaris/dtrace/libjvm_db.c
Print this page
rev 611 : Merge
*** 1,10 ****
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)libjvm_db.c 1.29 07/05/05 17:04:38 JVM"
#endif
/*
! * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,10 ----
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)libjvm_db.c 1.29 07/05/05 17:04:38 JVM"
#endif
/*
! * Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 149,161 ****
--- 149,163 ----
uint64_t BufferBlob_vtbl;
uint64_t RuntimeStub_vtbl;
uint64_t Universe_methodKlassObj_address;
uint64_t CodeCache_heap_address;
+ uint64_t Universe_heap_base_address;
/* Volatiles */
uint64_t Universe_methodKlassObj;
+ uint64_t Universe_heap_base;
uint64_t CodeCache_low;
uint64_t CodeCache_high;
uint64_t CodeCache_segmap_low;
uint64_t CodeCache_segmap_high;
*** 167,177 ****
Nmethod_t *N; /*Inlined methods support */
Frame_t prev_fr;
Frame_t curr_fr;
};
-
static int
read_string(struct ps_prochandle *P,
char *buf, /* caller's buffer */
size_t size, /* upper limit on bytes to read */
uintptr_t addr) /* address in process */
--- 169,178 ----
*** 186,195 ****
--- 187,204 ----
buf += 1;
}
return -1;
}
+ static int read_compressed_pointer(jvm_agent_t* J, uint64_t base, uint32_t *ptr) {
+ int err = -1;
+ uint32_t ptr32;
+ err = ps_pread(J->P, base, &ptr32, sizeof(uint32_t));
+ *ptr = ptr32;
+ return err;
+ }
+
static int read_pointer(jvm_agent_t* J, uint64_t base, uint64_t* ptr) {
int err = -1;
uint32_t ptr32;
switch (DATA_MODEL) {
*** 271,280 ****
--- 280,292 ----
}
} else if (vmp->typeName[0] == 'U' && strcmp("Universe", vmp->typeName) == 0) {
if (strcmp("_methodKlassObj", vmp->fieldName) == 0) {
J->Universe_methodKlassObj_address = vmp->address;
}
+ if (strcmp("_heap_base", vmp->fieldName) == 0) {
+ J->Universe_heap_base_address = vmp->address;
+ }
}
CHECK_FAIL(err);
base += SIZE_VMStructEntry;
if (vmp->typeName != NULL) free((void*)vmp->typeName);
*** 293,302 ****
--- 305,316 ----
uint64_t ptr;
int err;
err = read_pointer(J, J->Universe_methodKlassObj_address, &J->Universe_methodKlassObj);
CHECK_FAIL(err);
+ err = read_pointer(J, J->Universe_heap_base_address, &J->Universe_heap_base);
+ CHECK_FAIL(err);
err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
OFFSET_VirtualSpace_low, &J->CodeCache_low);
CHECK_FAIL(err);
err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
OFFSET_VirtualSpace_high, &J->CodeCache_high);
*** 445,455 ****
}
static int is_methodOop(jvm_agent_t* J, uint64_t methodOopPtr) {
uint64_t klass;
int err;
! err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_klass, &klass);
if (err != PS_OK) goto fail;
return klass == J->Universe_methodKlassObj;
fail:
return 0;
--- 459,479 ----
}
static int is_methodOop(jvm_agent_t* J, uint64_t methodOopPtr) {
uint64_t klass;
int err;
! // If heap_base is nonnull, this was a compressed oop.
! if (J->Universe_heap_base != NULL) {
! uint32_t cklass;
! err = read_compressed_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata,
! &cklass);
! // decode heap oop, same as oop.inline.hpp
! klass = (uint64_t)((uintptr_t)J->Universe_heap_base +
! ((uintptr_t)cklass << 3));
! } else {
! err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata, &klass);
! }
if (err != PS_OK) goto fail;
return klass == J->Universe_methodKlassObj;
fail:
return 0;