Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp
32284 views
/*1* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "classfile/javaClasses.hpp"26#include "code/codeBlob.hpp"27#include "memory/allocation.hpp"28#include "prims/jvm.h"29#include "runtime/dtraceJSDT.hpp"30#include "runtime/jniHandles.hpp"31#include "runtime/os.hpp"32#include "runtime/signature.hpp"33#include "utilities/globalDefinitions.hpp"3435#ifdef HAVE_DTRACE_H3637#include <sys/types.h>38#include <sys/stat.h>39#include <fcntl.h>40#include <unistd.h>41#include <dtrace.h>4243static const char* devname = "/dev/dtrace/helper";44static const char* olddevname = "/devices/pseudo/dtrace@0:helper";4546static const char* string_sig = "uintptr_t";47static const char* int_sig = "long";48static const char* long_sig = "long long";4950static void printDOFHelper(dof_helper_t* helper);5152static int dofhelper_open() {53int fd;54if ((fd = open64(devname, O_RDWR)) < 0) {55// Optimize next calls56devname = olddevname;57if ((fd = open64(devname, O_RDWR)) < 0) {58return -1;59}60}61return fd;62}6364static jint dof_register(jstring module, uint8_t* dof, void* modaddr) {65int probe;66dof_helper_t dh;67int fd;6869memset(&dh, 0, sizeof(dh));7071char* module_name = java_lang_String::as_utf8_string(72JNIHandles::resolve_non_null(module));73jio_snprintf(dh.dofhp_mod, sizeof(dh.dofhp_mod), "%s", module_name);74dh.dofhp_dof = (uint64_t)dof;75dh.dofhp_addr = (uint64_t)modaddr;7677fd = dofhelper_open();78if (fd < 0)79return -1;80probe = ioctl(fd, DTRACEHIOC_ADDDOF, &dh);81close(fd);82if (PrintDTraceDOF) {83printDOFHelper(&dh);84tty->print_cr("DOF helper id = %d", probe);85}86return probe;87}8889int DTraceJSDT::pd_activate(90void* moduleBaseAddress, jstring module,91jint providers_count, JVM_DTraceProvider* providers) {9293// We need sections:94// (1) STRTAB95// (96// (2) PROVIDER97// (3) PROBES98// (4) PROBOFFS99// (5) PROBARGS100// ) * Number of Providers101102// Type of sections we create103enum {104STRTAB = 0,105PROVIDERS = 1,106PROBES = 2,107PROBE_OFFSETS = 3,108ARG_OFFSETS = 4,109NUM_SECTIONS = 5110};111112static int alignment_for[NUM_SECTIONS] = { 1, 4, 8, 4, 1 };113114ResourceMark rm;115116uint32_t num_sections = 1 + 4 * providers_count;117uint32_t offset = sizeof(dof_hdr_t) + (num_sections * sizeof(dof_sec_t));118uint32_t* secoffs = NEW_RESOURCE_ARRAY(uint32_t, num_sections);119uint32_t* secsize = NEW_RESOURCE_ARRAY(uint32_t, num_sections);120121// Store offsets of all strings here in such order:122// zero-string (always 0)123// provider1-name124// probe1-function125// probe1-name126// arg-1127// arg-2128// ...129// probe2-function130// probe2-name131// arg-1132// arg-2133// provider2-name134// ...135136uint32_t strcount = 0;137// Count the number of strings we'll need138for(int prvc = 0; prvc < providers_count; ++prvc) {139JVM_DTraceProvider* provider = &providers[prvc];140// Provider name141++strcount;142for(int prbc = 0; prbc < provider->probe_count; ++prbc) {143JVM_DTraceProbe* p = &(provider->probes[prbc]);144Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();145// function + name + one per argument146strcount += 2 + ArgumentCount(sig).size();147}148}149150// Create place for string offsets151uint32_t* stroffs = NEW_RESOURCE_ARRAY(uint32_t, strcount + 1);152uint32_t string_index = 0;153uint32_t curstr = 0;154155// First we need an empty string: ""156stroffs[curstr++] = string_index;157string_index += strlen("") + 1;158159for(int prvc = 0; prvc < providers_count; ++prvc) {160JVM_DTraceProvider* provider = &providers[prvc];161char* provider_name = java_lang_String::as_utf8_string(162JNIHandles::resolve_non_null(provider->name));163stroffs[curstr++] = string_index;164string_index += strlen(provider_name) + 1;165166// All probes167for(int prbc = 0; prbc < provider->probe_count; ++prbc) {168JVM_DTraceProbe* p = &(provider->probes[prbc]);169170char* function = java_lang_String::as_utf8_string(171JNIHandles::resolve_non_null(p->function));172stroffs[curstr++] = string_index;173string_index += strlen(function) + 1;174175char* name = java_lang_String::as_utf8_string(176JNIHandles::resolve_non_null(p->name));177stroffs[curstr++] = string_index;178string_index += strlen(name) + 1;179180Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();181SignatureStream ss(sig);182for ( ; !ss.at_return_type(); ss.next()) {183BasicType bt = ss.type();184const char* t = NULL;185if (bt == T_OBJECT &&186ss.as_symbol_or_null() == vmSymbols::java_lang_String()) {187t = string_sig;188} else if (bt == T_LONG) {189t = long_sig;190} else {191t = int_sig;192}193stroffs[curstr++] = string_index;194string_index += strlen(t) + 1;195}196}197}198secoffs[STRTAB] = offset;199secsize[STRTAB] = string_index;200offset += string_index;201202// Calculate the size of the rest203for(int prvc = 0; prvc < providers_count; ++prvc) {204JVM_DTraceProvider* provider = &providers[prvc];205size_t provider_sec = PROVIDERS + prvc * 4;206size_t probe_sec = PROBES + prvc * 4;207size_t probeoffs_sec = PROBE_OFFSETS + prvc * 4;208size_t argoffs_sec = ARG_OFFSETS + prvc * 4;209210// Allocate space for the provider data struction211secoffs[provider_sec] = align_size_up(offset, alignment_for[PROVIDERS]);212secsize[provider_sec] = sizeof(dof_provider_t);213offset = secoffs[provider_sec] + secsize[provider_sec];214215// Allocate space for all the probes216secoffs[probe_sec] = align_size_up(offset, alignment_for[PROBES]);217secsize[probe_sec] = sizeof(dof_probe_t) * provider->probe_count;218offset = secoffs[probe_sec] + secsize[probe_sec];219220// Allocate space for the probe offsets221secoffs[probeoffs_sec] = align_size_up(offset, alignment_for[PROBE_OFFSETS]);222secsize[probeoffs_sec] = sizeof(uint32_t) * provider->probe_count;223offset = secoffs[probeoffs_sec] + secsize[probeoffs_sec];224225// We need number of arguments argoffs226uint32_t argscount = 0;227for(int prbc = 0; prbc < provider->probe_count; ++prbc) {228JVM_DTraceProbe* p = &(provider->probes[prbc]);229Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();230argscount += ArgumentCount(sig).size();231}232secoffs[argoffs_sec] = align_size_up(offset, alignment_for[ARG_OFFSETS]);233secsize[argoffs_sec] = sizeof(uint8_t) * argscount;234offset = secoffs[argoffs_sec] + secsize[argoffs_sec];235}236237uint32_t size = offset;238239uint8_t* dof = NEW_RESOURCE_ARRAY(uint8_t, size);240if (!dof) {241return -1;242}243memset((void*)dof, 0, size);244245// Fill memory with proper values246dof_hdr_t* hdr = (dof_hdr_t*)dof;247hdr->dofh_ident[DOF_ID_MAG0] = DOF_MAG_MAG0;248hdr->dofh_ident[DOF_ID_MAG1] = DOF_MAG_MAG1;249hdr->dofh_ident[DOF_ID_MAG2] = DOF_MAG_MAG2;250hdr->dofh_ident[DOF_ID_MAG3] = DOF_MAG_MAG3;251hdr->dofh_ident[DOF_ID_MODEL] = DOF_MODEL_NATIVE; // No variants252hdr->dofh_ident[DOF_ID_ENCODING] = DOF_ENCODE_NATIVE; // No variants253hdr->dofh_ident[DOF_ID_VERSION] = DOF_VERSION_1; // No variants254hdr->dofh_ident[DOF_ID_DIFVERS] = DIF_VERSION_2; // No variants255// all other fields of ident to zero256257hdr->dofh_flags = 0;258hdr->dofh_hdrsize = sizeof(dof_hdr_t);259hdr->dofh_secsize = sizeof(dof_sec_t);260hdr->dofh_secnum = num_sections;261hdr->dofh_secoff = sizeof(dof_hdr_t);262hdr->dofh_loadsz = size;263hdr->dofh_filesz = size;264265// First section: STRTAB266dof_sec_t* sec = (dof_sec_t*)(dof + sizeof(dof_hdr_t));267sec->dofs_type = DOF_SECT_STRTAB;268sec->dofs_align = alignment_for[STRTAB];269sec->dofs_flags = DOF_SECF_LOAD;270sec->dofs_entsize = 0;271sec->dofs_offset = secoffs[STRTAB];272sec->dofs_size = secsize[STRTAB];273// Make data for this section274char* str = (char*)(dof + sec->dofs_offset);275276*str = 0; str += 1; // ""277278// Run through all strings again279for(int prvc = 0; prvc < providers_count; ++prvc) {280JVM_DTraceProvider* provider = &providers[prvc];281char* provider_name = java_lang_String::as_utf8_string(282JNIHandles::resolve_non_null(provider->name));283strcpy(str, provider_name);284str += strlen(provider_name) + 1;285286// All probes287for(int prbc = 0; prbc < provider->probe_count; ++prbc) {288JVM_DTraceProbe* p = &(provider->probes[prbc]);289290char* function = java_lang_String::as_utf8_string(291JNIHandles::resolve_non_null(p->function));292strcpy(str, function);293str += strlen(str) + 1;294295char* name = java_lang_String::as_utf8_string(296JNIHandles::resolve_non_null(p->name));297strcpy(str, name);298str += strlen(name) + 1;299300Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();301SignatureStream ss(sig);302for ( ; !ss.at_return_type(); ss.next()) {303BasicType bt = ss.type();304const char* t;305if (bt == T_OBJECT &&306ss.as_symbol_or_null() == vmSymbols::java_lang_String()) {307t = string_sig;308} else if (bt == T_LONG) {309t = long_sig;310} else {311t = int_sig;312}313strcpy(str, t);314str += strlen(t) + 1;315}316}317}318319curstr = 1;320for(int prvc = 0; prvc < providers_count; ++prvc) {321JVM_DTraceProvider* provider = &providers[prvc];322size_t provider_sec = PROVIDERS + prvc * 4;323size_t probe_sec = PROBES + prvc * 4;324size_t probeoffs_sec = PROBE_OFFSETS + prvc * 4;325size_t argoffs_sec = ARG_OFFSETS + prvc * 4;326327// PROVIDER ///////////////////////////////////////////////////////////////328// Section header329sec = (dof_sec_t*)330(dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * provider_sec);331sec->dofs_type = DOF_SECT_PROVIDER;332sec->dofs_align = alignment_for[PROVIDERS];333sec->dofs_flags = DOF_SECF_LOAD;334sec->dofs_entsize = 0;335sec->dofs_offset = secoffs[provider_sec];336sec->dofs_size = secsize[provider_sec];337// Make provider decriiption338dof_provider_t* prv = (dof_provider_t*)(dof + sec->dofs_offset);339prv->dofpv_strtab = STRTAB;340prv->dofpv_probes = probe_sec;341prv->dofpv_prargs = argoffs_sec;342prv->dofpv_proffs = probeoffs_sec;343prv->dofpv_name = stroffs[curstr++]; // Index in string table344prv->dofpv_provattr = DOF_ATTR(345provider->providerAttributes.nameStability,346provider->providerAttributes.dataStability,347provider->providerAttributes.dependencyClass);348prv->dofpv_modattr = DOF_ATTR(349provider->moduleAttributes.nameStability,350provider->moduleAttributes.dataStability,351provider->moduleAttributes.dependencyClass);352prv->dofpv_funcattr = DOF_ATTR(353provider->functionAttributes.nameStability,354provider->functionAttributes.dataStability,355provider->functionAttributes.dependencyClass);356prv->dofpv_nameattr = DOF_ATTR(357provider->nameAttributes.nameStability,358provider->nameAttributes.dataStability,359provider->nameAttributes.dependencyClass);360prv->dofpv_argsattr = DOF_ATTR(361provider->argsAttributes.nameStability,362provider->argsAttributes.dataStability,363provider->argsAttributes.dependencyClass);364365// PROBES /////////////////////////////////////////////////////////////////366// Section header367sec = (dof_sec_t*)368(dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * probe_sec);369sec->dofs_type = DOF_SECT_PROBES;370sec->dofs_align = alignment_for[PROBES];371sec->dofs_flags = DOF_SECF_LOAD;372sec->dofs_entsize = sizeof(dof_probe_t);373sec->dofs_offset = secoffs[probe_sec];374sec->dofs_size = secsize[probe_sec];375// Make probes descriptions376uint32_t argsoffs = 0;377for(int prbc = 0; prbc < provider->probe_count; ++prbc) {378JVM_DTraceProbe* probe = &(provider->probes[prbc]);379Method* m = Method::resolve_jmethod_id(probe->method);380int arg_count = ArgumentCount(m->signature()).size();381assert(m->code() != NULL, "must have an nmethod");382383dof_probe_t* prb =384(dof_probe_t*)(dof + sec->dofs_offset + prbc * sizeof(dof_probe_t));385386prb->dofpr_addr = (uint64_t)m->code()->entry_point();387prb->dofpr_func = stroffs[curstr++]; // Index in string table388prb->dofpr_name = stroffs[curstr++]; // Index in string table389prb->dofpr_nargv = stroffs[curstr ]; // Index in string table390// We spent siglen strings here391curstr += arg_count;392prb->dofpr_xargv = prb->dofpr_nargv; // Same bunch of strings393prb->dofpr_argidx = argsoffs;394prb->dofpr_offidx = prbc;395prb->dofpr_nargc = arg_count;396prb->dofpr_xargc = arg_count;397prb->dofpr_noffs = 1; // Number of offsets398// Next bunch of offsets399argsoffs += arg_count;400}401402// PROFFS /////////////////////////////////////////////////////////////////403// Section header404sec = (dof_sec_t*)405(dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * probeoffs_sec);406sec->dofs_type = DOF_SECT_PROFFS;407sec->dofs_align = alignment_for[PROBE_OFFSETS];408sec->dofs_flags = DOF_SECF_LOAD;409sec->dofs_entsize = sizeof(uint32_t);410sec->dofs_offset = secoffs[probeoffs_sec];411sec->dofs_size = secsize[probeoffs_sec];412// Make offsets413for (int prbc = 0; prbc < provider->probe_count; ++prbc) {414uint32_t* pof =415(uint32_t*)(dof + sec->dofs_offset + sizeof(uint32_t) * prbc);416JVM_DTraceProbe* probe = &(provider->probes[prbc]);417Method* m = Method::resolve_jmethod_id(probe->method);418*pof = m->code()->trap_offset();419}420421// PRARGS /////////////////////////////////////////////////////////////////422// Section header423sec = (dof_sec_t*)424(dof + sizeof(dof_hdr_t) + sizeof(dof_sec_t) * argoffs_sec);425sec->dofs_type = DOF_SECT_PRARGS;426sec->dofs_align = alignment_for[ARG_OFFSETS];427sec->dofs_flags = DOF_SECF_LOAD;428sec->dofs_entsize = sizeof(uint8_t);429sec->dofs_offset = secoffs[argoffs_sec];430sec->dofs_size = secsize[argoffs_sec];431// Make arguments432uint8_t* par = (uint8_t*)(dof + sec->dofs_offset);433for (int prbc = 0; prbc < provider->probe_count; ++prbc) {434JVM_DTraceProbe* p = &(provider->probes[prbc]);435Symbol* sig = Method::resolve_jmethod_id(p->method)->signature();436uint8_t count = (uint8_t)ArgumentCount(sig).size();437for (uint8_t i = 0; i < count; ++i) {438*par++ = i;439}440}441}442443// Register module444return dof_register(module, dof, moduleBaseAddress);445}446447448void DTraceJSDT::pd_dispose(int handle) {449int fd;450if (handle == -1) {451return;452}453fd = dofhelper_open();454if (fd < 0)455return;456ioctl(fd, DTRACEHIOC_REMOVE, handle);457close(fd);458}459460jboolean DTraceJSDT::pd_is_supported() {461int fd = dofhelper_open();462if (fd < 0) {463return false;464}465close(fd);466return true;467}468469static const char* dofSecTypeFor(uint32_t type) {470switch (type) {471case 0: return "DOF_SECT_NONE";472case 1: return "DOF_SECT_COMMENTS";473case 2: return "DOF_SECT_SOURCE";474case 3: return "DOF_SECT_ECBDESC";475case 4: return "DOF_SECT_PROBEDESC";476case 5: return "DOF_SECT_ACTDESC";477case 6: return "DOF_SECT_DIFOHDR";478case 7: return "DOF_SECT_DIF";479case 8: return "DOF_SECT_STRTAB";480case 9: return "DOF_SECT_VARTAB";481case 10: return "DOF_SECT_RELTAB";482case 11: return "DOF_SECT_TYPETAB";483case 12: return "DOF_SECT_URELHDR";484case 13: return "DOF_SECT_KRELHDR";485case 14: return "DOF_SECT_OPTDESC";486case 15: return "DOF_SECT_PROVIDER";487case 16: return "DOF_SECT_PROBES";488case 17: return "DOF_SECT_PRARGS";489case 18: return "DOF_SECT_PROFFS";490case 19: return "DOF_SECT_INTTAB";491case 20: return "DOF_SECT_UTSNAME";492case 21: return "DOF_SECT_XLTAB";493case 22: return "DOF_SECT_XLMEMBERS";494case 23: return "DOF_SECT_XLIMPORT";495case 24: return "DOF_SECT_XLEXPORT";496case 25: return "DOF_SECT_PREXPORT";497case 26: return "DOF_SECT_PRENOFFS";498default: return "<unknown>";499}500}501502static void printDOFStringTabSec(void* dof, dof_sec_t* sec) {503size_t tab = sec->dofs_offset;504size_t limit = sec->dofs_size;505tty->print_cr("// String Table:");506for (size_t idx = 0; idx < limit; /*empty*/) {507char* str = ((char*)dof) + tab + idx;508tty->print_cr("// [0x%x + 0x%x] '%s'", tab, idx, str);509idx += strlen(str) + 1;510}511}512513static void printDOFProviderSec(void* dof, dof_sec_t* sec) {514dof_provider_t* prov = (dof_provider_t*)((char*)dof + sec->dofs_offset);515tty->print_cr("// dof_provider_t {");516tty->print_cr("// dofpv_strtab = %d", prov->dofpv_strtab);517tty->print_cr("// dofpv_probes = %d", prov->dofpv_probes);518tty->print_cr("// dofpv_prargs = %d", prov->dofpv_prargs);519tty->print_cr("// dofpv_proffs = %d", prov->dofpv_proffs);520tty->print_cr("// dofpv_name = 0x%x", prov->dofpv_name);521tty->print_cr("// dofpv_provattr = 0x%08x", prov->dofpv_provattr);522tty->print_cr("// dofpv_modattr = 0x%08x", prov->dofpv_modattr);523tty->print_cr("// dofpv_funcattr = 0x%08x", prov->dofpv_funcattr);524tty->print_cr("// dofpv_nameattr = 0x%08x", prov->dofpv_nameattr);525tty->print_cr("// dofpv_argsattr = 0x%08x", prov->dofpv_argsattr);526tty->print_cr("// }");527}528529static void printDOFProbesSec(void* dof, dof_sec_t* sec) {530size_t idx = sec->dofs_offset;531size_t limit = idx + sec->dofs_size;532for (size_t idx = sec->dofs_offset; idx < limit; idx += sec->dofs_entsize) {533dof_probe_t* prb = (dof_probe_t*)((char*)dof + idx);534tty->print_cr("// dof_probe_t {");535tty->print_cr("// dofpr_addr = 0x%016llx", prb->dofpr_addr);536tty->print_cr("// dofpr_func = 0x%x", prb->dofpr_func);537tty->print_cr("// dofpr_name = 0x%x", prb->dofpr_name);538tty->print_cr("// dofpr_nargv = 0x%x", prb->dofpr_nargv);539tty->print_cr("// dofpr_xargv = 0x%x", prb->dofpr_xargv);540tty->print_cr("// dofpr_argidx = 0x%x", prb->dofpr_argidx);541tty->print_cr("// dofpr_offidx = 0x%x", prb->dofpr_offidx);542tty->print_cr("// dofpr_nargc = %d", prb->dofpr_nargc);543tty->print_cr("// dofpr_xargc = %d", prb->dofpr_xargc);544tty->print_cr("// dofpr_noffs = %d", prb->dofpr_noffs);545tty->print_cr("// }");546}547}548549static void printDOFOffsetsSec(void* dof, dof_sec_t* sec) {550size_t tab = sec->dofs_offset;551size_t limit = sec->dofs_size;552tty->print_cr("// Offsets:");553for (size_t idx = 0; idx < limit; idx += sec->dofs_entsize) {554uint32_t* off = (uint32_t*)((char*)dof + tab + idx);555tty->print_cr("// [0x%x + 0x%x]: %d", tab, idx, *off);556}557}558559static void printDOFArgsSec(void* dof, dof_sec_t* sec) {560size_t tab = sec->dofs_offset;561size_t limit = sec->dofs_size;562tty->print_cr("// Arguments:");563for (size_t idx = 0; idx < limit; idx += sec->dofs_entsize) {564uint8_t* arg = (uint8_t*)((char*)dof + tab + idx);565tty->print_cr("// [0x%x + 0x%x]: %d", tab, idx, *arg);566}567}568569static void printDOFSection(void* dof, dof_sec_t* sec) {570tty->print_cr("// dof_sec_t {");571tty->print_cr("// dofs_type = 0x%x /* %s */",572sec->dofs_type, dofSecTypeFor(sec->dofs_type));573tty->print_cr("// dofs_align = %d", sec->dofs_align);574tty->print_cr("// dofs_flags = 0x%x", sec->dofs_flags);575tty->print_cr("// dofs_entsize = %d", sec->dofs_entsize);576tty->print_cr("// dofs_offset = 0x%llx", sec->dofs_offset);577tty->print_cr("// dofs_size = %lld", sec->dofs_size);578tty->print_cr("// }");579switch (sec->dofs_type) {580case DOF_SECT_STRTAB: printDOFStringTabSec(dof, sec); break;581case DOF_SECT_PROVIDER: printDOFProviderSec(dof, sec); break;582case DOF_SECT_PROBES: printDOFProbesSec(dof, sec); break;583case DOF_SECT_PROFFS: printDOFOffsetsSec(dof, sec); break;584case DOF_SECT_PRARGS: printDOFArgsSec(dof, sec); break;585default: tty->print_cr("// <section type not recognized>");586}587}588589static void printDOFHeader(dof_hdr_t* hdr) {590tty->print_cr("// dof_hdr_t {");591tty->print_cr("// dofh_ident[DOF_ID_MAG0] = 0x%x",592hdr->dofh_ident[DOF_ID_MAG0]);593tty->print_cr("// dofh_ident[DOF_ID_MAG1] = 0x%x",594hdr->dofh_ident[DOF_ID_MAG1]);595tty->print_cr("// dofh_ident[DOF_ID_MAG2] = 0x%x",596hdr->dofh_ident[DOF_ID_MAG2]);597tty->print_cr("// dofh_ident[DOF_ID_MAG3] = 0x%x",598hdr->dofh_ident[DOF_ID_MAG3]);599tty->print_cr("// dofh_ident[DOF_ID_MODEL] = 0x%x",600hdr->dofh_ident[DOF_ID_MODEL]);601tty->print_cr("// dofh_ident[DOF_ID_ENCODING] = 0x%x",602hdr->dofh_ident[DOF_ID_ENCODING]);603tty->print_cr("// dofh_ident[DOF_ID_VERSION] = 0x%x",604hdr->dofh_ident[DOF_ID_VERSION]);605tty->print_cr("// dofh_ident[DOF_ID_DIFVERS] = 0x%x",606hdr->dofh_ident[DOF_ID_DIFVERS]);607tty->print_cr("// dofh_flags = 0x%x", hdr->dofh_flags);608tty->print_cr("// dofh_hdrsize = %d", hdr->dofh_hdrsize);609tty->print_cr("// dofh_secsize = %d", hdr->dofh_secsize);610tty->print_cr("// dofh_secnum = %d", hdr->dofh_secnum);611tty->print_cr("// dofh_secoff = %lld", hdr->dofh_secoff);612tty->print_cr("// dofh_loadsz = %lld", hdr->dofh_loadsz);613tty->print_cr("// dofh_filesz = %lld", hdr->dofh_filesz);614tty->print_cr("// }");615}616617static void printDOF(void* dof) {618dof_hdr_t* hdr = (dof_hdr_t*)dof;619printDOFHeader(hdr);620for (int i = 0; i < hdr->dofh_secnum; ++i) {621dof_sec_t* sec =622(dof_sec_t*)((char*)dof + sizeof(dof_hdr_t) + i * sizeof(dof_sec_t));623tty->print_cr("// [Section #%d]", i);624printDOFSection(dof, sec);625}626}627628static void printDOFHelper(dof_helper_t* helper) {629tty->print_cr("// dof_helper_t {");630tty->print_cr("// dofhp_mod = \"%s\"", helper->dofhp_mod);631tty->print_cr("// dofhp_addr = 0x%016llx", helper->dofhp_addr);632tty->print_cr("// dofhp_dof = 0x%016llx", helper->dofhp_dof);633printDOF((void*)helper->dofhp_dof);634tty->print_cr("// }");635size_t len = ((dof_hdr_t*)helper)->dofh_loadsz;636tty->print_data((void*)helper->dofhp_dof, len, true);637}638639#else // ndef HAVE_DTRACE_H640641// Get here if we're not building on at least Solaris 10642int DTraceJSDT::pd_activate(643void* baseAddress, jstring module,644jint provider_count, JVM_DTraceProvider* providers) {645return -1;646}647648void DTraceJSDT::pd_dispose(int handle) {649}650651jboolean DTraceJSDT::pd_is_supported() {652return false;653}654#endif655656657