hotspot/src/os/solaris/dtrace/libjvm_db.c
changeset 360 21d113ecbf6a
parent 1 489c9b5090e2
child 670 ddf3e9583f2f
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
   146   uint64_t BufferBlob_vtbl;
   146   uint64_t BufferBlob_vtbl;
   147   uint64_t RuntimeStub_vtbl;
   147   uint64_t RuntimeStub_vtbl;
   148 
   148 
   149   uint64_t Universe_methodKlassObj_address;
   149   uint64_t Universe_methodKlassObj_address;
   150   uint64_t CodeCache_heap_address;
   150   uint64_t CodeCache_heap_address;
       
   151   uint64_t Universe_heap_base_address;
   151 
   152 
   152   /* Volatiles */
   153   /* Volatiles */
   153   uint64_t Universe_methodKlassObj;
   154   uint64_t Universe_methodKlassObj;
       
   155   uint64_t Universe_heap_base;
   154   uint64_t CodeCache_low;
   156   uint64_t CodeCache_low;
   155   uint64_t CodeCache_high;
   157   uint64_t CodeCache_high;
   156   uint64_t CodeCache_segmap_low;
   158   uint64_t CodeCache_segmap_low;
   157   uint64_t CodeCache_segmap_high;
   159   uint64_t CodeCache_segmap_high;
   158 
   160 
   163 
   165 
   164   Nmethod_t *N;                 /*Inlined methods support */
   166   Nmethod_t *N;                 /*Inlined methods support */
   165   Frame_t   prev_fr;
   167   Frame_t   prev_fr;
   166   Frame_t   curr_fr;
   168   Frame_t   curr_fr;
   167 };
   169 };
   168 
       
   169 
   170 
   170 static int
   171 static int
   171 read_string(struct ps_prochandle *P,
   172 read_string(struct ps_prochandle *P,
   172         char *buf,              /* caller's buffer */
   173         char *buf,              /* caller's buffer */
   173         size_t size,            /* upper limit on bytes to read */
   174         size_t size,            /* upper limit on bytes to read */
   183     buf += 1;
   184     buf += 1;
   184   }
   185   }
   185   return -1;
   186   return -1;
   186 }
   187 }
   187 
   188 
       
   189 static int read_compressed_pointer(jvm_agent_t* J, uint64_t base, uint32_t *ptr) {
       
   190   int err = -1;
       
   191   uint32_t ptr32;
       
   192   err = ps_pread(J->P, base, &ptr32, sizeof(uint32_t));
       
   193   *ptr = ptr32;
       
   194   return err;
       
   195 }
       
   196 
   188 static int read_pointer(jvm_agent_t* J, uint64_t base, uint64_t* ptr) {
   197 static int read_pointer(jvm_agent_t* J, uint64_t base, uint64_t* ptr) {
   189   int err = -1;
   198   int err = -1;
   190   uint32_t ptr32;
   199   uint32_t ptr32;
   191 
   200 
   192   switch (DATA_MODEL) {
   201   switch (DATA_MODEL) {
   268       }
   277       }
   269     } else if (vmp->typeName[0] == 'U' && strcmp("Universe", vmp->typeName) == 0) {
   278     } else if (vmp->typeName[0] == 'U' && strcmp("Universe", vmp->typeName) == 0) {
   270       if (strcmp("_methodKlassObj", vmp->fieldName) == 0) {
   279       if (strcmp("_methodKlassObj", vmp->fieldName) == 0) {
   271         J->Universe_methodKlassObj_address = vmp->address;
   280         J->Universe_methodKlassObj_address = vmp->address;
   272       }
   281       }
       
   282       if (strcmp("_heap_base", vmp->fieldName) == 0) {
       
   283         J->Universe_heap_base_address = vmp->address;
       
   284       }
   273     }
   285     }
   274     CHECK_FAIL(err);
   286     CHECK_FAIL(err);
   275 
   287 
   276     base += SIZE_VMStructEntry;
   288     base += SIZE_VMStructEntry;
   277     if (vmp->typeName != NULL) free((void*)vmp->typeName);
   289     if (vmp->typeName != NULL) free((void*)vmp->typeName);
   289 static int read_volatiles(jvm_agent_t* J) {
   301 static int read_volatiles(jvm_agent_t* J) {
   290   uint64_t ptr;
   302   uint64_t ptr;
   291   int err;
   303   int err;
   292 
   304 
   293   err = read_pointer(J, J->Universe_methodKlassObj_address, &J->Universe_methodKlassObj);
   305   err = read_pointer(J, J->Universe_methodKlassObj_address, &J->Universe_methodKlassObj);
       
   306   CHECK_FAIL(err);
       
   307   err = read_pointer(J, J->Universe_heap_base_address, &J->Universe_heap_base);
   294   CHECK_FAIL(err);
   308   CHECK_FAIL(err);
   295   err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
   309   err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
   296                      OFFSET_VirtualSpace_low, &J->CodeCache_low);
   310                      OFFSET_VirtualSpace_low, &J->CodeCache_low);
   297   CHECK_FAIL(err);
   311   CHECK_FAIL(err);
   298   err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
   312   err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
   442 }
   456 }
   443 
   457 
   444 static int is_methodOop(jvm_agent_t* J, uint64_t methodOopPtr) {
   458 static int is_methodOop(jvm_agent_t* J, uint64_t methodOopPtr) {
   445   uint64_t klass;
   459   uint64_t klass;
   446   int err;
   460   int err;
   447   err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_klass, &klass);
   461   // If heap_base is nonnull, this was a compressed oop.
       
   462   if (J->Universe_heap_base != NULL) {
       
   463     uint32_t cklass;
       
   464     err = read_compressed_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata,
       
   465           &cklass);
       
   466     // decode heap oop, same as oop.inline.hpp
       
   467     klass = (uint64_t)((uintptr_t)J->Universe_heap_base +
       
   468             ((uintptr_t)cklass << 3));
       
   469   } else {
       
   470     err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata, &klass);
       
   471   }
   448   if (err != PS_OK) goto fail;
   472   if (err != PS_OK) goto fail;
   449   return klass == J->Universe_methodKlassObj;
   473   return klass == J->Universe_methodKlassObj;
   450 
   474 
   451  fail:
   475  fail:
   452   return 0;
   476   return 0;