equal
deleted
inserted
replaced
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; |