mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 12:04:39 +02:00
Merge
This commit is contained in:
commit
41463d1d3a
81 changed files with 2355 additions and 948 deletions
|
@ -2582,7 +2582,7 @@ bool os::large_page_init() {
|
|||
#define SHM_HUGETLB 04000
|
||||
#endif
|
||||
|
||||
char* os::reserve_memory_special(size_t bytes) {
|
||||
char* os::reserve_memory_special(size_t bytes, char* req_addr) {
|
||||
assert(UseLargePages, "only for large pages");
|
||||
|
||||
key_t key = IPC_PRIVATE;
|
||||
|
|
|
@ -249,6 +249,10 @@ int generateJvmOffsets(GEN_variant gen_variant) {
|
|||
|
||||
printf("\n");
|
||||
|
||||
GEN_OFFS(NarrowOopStruct, _base);
|
||||
GEN_OFFS(NarrowOopStruct, _shift);
|
||||
printf("\n");
|
||||
|
||||
GEN_VALUE(SIZE_HeapBlockHeader, sizeof(HeapBlock::Header));
|
||||
GEN_SIZE(oopDesc);
|
||||
GEN_SIZE(constantPoolOopDesc);
|
||||
|
|
|
@ -46,7 +46,10 @@ extern pointer __JvmOffsets;
|
|||
extern pointer __1cJCodeCacheF_heap_;
|
||||
extern pointer __1cIUniverseP_methodKlassObj_;
|
||||
extern pointer __1cIUniverseO_collectedHeap_;
|
||||
extern pointer __1cIUniverseK_heap_base_;
|
||||
extern pointer __1cIUniverseL_narrow_oop_;
|
||||
#ifdef _LP64
|
||||
extern pointer UseCompressedOops;
|
||||
#endif
|
||||
|
||||
extern pointer __1cHnmethodG__vtbl_;
|
||||
extern pointer __1cKBufferBlobG__vtbl_;
|
||||
|
@ -56,6 +59,7 @@ extern pointer __1cKBufferBlobG__vtbl_;
|
|||
#define copyin_uint16(ADDR) *(uint16_t*) copyin((pointer) (ADDR), sizeof(uint16_t))
|
||||
#define copyin_uint32(ADDR) *(uint32_t*) copyin((pointer) (ADDR), sizeof(uint32_t))
|
||||
#define copyin_int32(ADDR) *(int32_t*) copyin((pointer) (ADDR), sizeof(int32_t))
|
||||
#define copyin_uint8(ADDR) *(uint8_t*) copyin((pointer) (ADDR), sizeof(uint8_t))
|
||||
|
||||
#define SAME(x) x
|
||||
#define copyin_offset(JVM_CONST) JVM_CONST = \
|
||||
|
@ -132,6 +136,9 @@ dtrace:helper:ustack:
|
|||
copyin_offset(SIZE_oopDesc);
|
||||
copyin_offset(SIZE_constantPoolOopDesc);
|
||||
|
||||
copyin_offset(OFFSET_NarrowOopStruct_base);
|
||||
copyin_offset(OFFSET_NarrowOopStruct_shift);
|
||||
|
||||
/*
|
||||
* The PC to translate is in arg0.
|
||||
*/
|
||||
|
@ -151,9 +158,19 @@ dtrace:helper:ustack:
|
|||
|
||||
this->Universe_methodKlassOop = copyin_ptr(&``__1cIUniverseP_methodKlassObj_);
|
||||
this->CodeCache_heap_address = copyin_ptr(&``__1cJCodeCacheF_heap_);
|
||||
this->Universe_heap_base = copyin_ptr(&``__1cIUniverseK_heap_base_);
|
||||
|
||||
/* Reading volatile values */
|
||||
#ifdef _LP64
|
||||
this->Use_Compressed_Oops = copyin_uint8(&``UseCompressedOops);
|
||||
#else
|
||||
this->Use_Compressed_Oops = 0;
|
||||
#endif
|
||||
|
||||
this->Universe_narrow_oop_base = copyin_ptr(&``__1cIUniverseL_narrow_oop_ +
|
||||
OFFSET_NarrowOopStruct_base);
|
||||
this->Universe_narrow_oop_shift = copyin_int32(&``__1cIUniverseL_narrow_oop_ +
|
||||
OFFSET_NarrowOopStruct_shift);
|
||||
|
||||
this->CodeCache_low = copyin_ptr(this->CodeCache_heap_address +
|
||||
OFFSET_CodeHeap_memory + OFFSET_VirtualSpace_low);
|
||||
|
||||
|
@ -295,7 +312,7 @@ dtrace:helper:ustack:
|
|||
|
||||
dtrace:helper:ustack:
|
||||
/!this->done && this->vtbl == this->BufferBlob_vtbl &&
|
||||
this->Universe_heap_base == NULL &&
|
||||
this->Use_Compressed_Oops == 0 &&
|
||||
this->methodOopPtr > this->heap_start && this->methodOopPtr < this->heap_end/
|
||||
{
|
||||
MARK_LINE;
|
||||
|
@ -306,7 +323,7 @@ this->methodOopPtr > this->heap_start && this->methodOopPtr < this->heap_end/
|
|||
|
||||
dtrace:helper:ustack:
|
||||
/!this->done && this->vtbl == this->BufferBlob_vtbl &&
|
||||
this->Universe_heap_base != NULL &&
|
||||
this->Use_Compressed_Oops != 0 &&
|
||||
this->methodOopPtr > this->heap_start && this->methodOopPtr < this->heap_end/
|
||||
{
|
||||
MARK_LINE;
|
||||
|
@ -314,8 +331,8 @@ this->methodOopPtr > this->heap_start && this->methodOopPtr < this->heap_end/
|
|||
* Read compressed pointer and decode heap oop, same as oop.inline.hpp
|
||||
*/
|
||||
this->cklass = copyin_uint32(this->methodOopPtr + OFFSET_oopDesc_metadata);
|
||||
this->klass = (uint64_t)((uintptr_t)this->Universe_heap_base +
|
||||
((uintptr_t)this->cklass << 3));
|
||||
this->klass = (uint64_t)((uintptr_t)this->Universe_narrow_oop_base +
|
||||
((uintptr_t)this->cklass << this->Universe_narrow_oop_shift));
|
||||
this->methodOop = this->klass == this->Universe_methodKlassOop;
|
||||
this->done = !this->methodOop;
|
||||
}
|
||||
|
|
|
@ -146,13 +146,17 @@ struct jvm_agent {
|
|||
uint64_t BufferBlob_vtbl;
|
||||
uint64_t RuntimeStub_vtbl;
|
||||
|
||||
uint64_t Use_Compressed_Oops_address;
|
||||
uint64_t Universe_methodKlassObj_address;
|
||||
uint64_t Universe_narrow_oop_base_address;
|
||||
uint64_t Universe_narrow_oop_shift_address;
|
||||
uint64_t CodeCache_heap_address;
|
||||
uint64_t Universe_heap_base_address;
|
||||
|
||||
/* Volatiles */
|
||||
uint8_t Use_Compressed_Oops;
|
||||
uint64_t Universe_methodKlassObj;
|
||||
uint64_t Universe_heap_base;
|
||||
uint64_t Universe_narrow_oop_base;
|
||||
uint32_t Universe_narrow_oop_shift;
|
||||
uint64_t CodeCache_low;
|
||||
uint64_t CodeCache_high;
|
||||
uint64_t CodeCache_segmap_low;
|
||||
|
@ -279,8 +283,11 @@ static int parse_vmstructs(jvm_agent_t* J) {
|
|||
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;
|
||||
if (strcmp("_narrow_oop._base", vmp->fieldName) == 0) {
|
||||
J->Universe_narrow_oop_base_address = vmp->address;
|
||||
}
|
||||
if (strcmp("_narrow_oop._shift", vmp->fieldName) == 0) {
|
||||
J->Universe_narrow_oop_shift_address = vmp->address;
|
||||
}
|
||||
}
|
||||
CHECK_FAIL(err);
|
||||
|
@ -298,14 +305,39 @@ static int parse_vmstructs(jvm_agent_t* J) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int find_symbol(jvm_agent_t* J, const char *name, uint64_t* valuep) {
|
||||
psaddr_t sym_addr;
|
||||
int err;
|
||||
|
||||
err = ps_pglobal_lookup(J->P, LIBJVM_SO, name, &sym_addr);
|
||||
if (err != PS_OK) goto fail;
|
||||
*valuep = sym_addr;
|
||||
return PS_OK;
|
||||
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int read_volatiles(jvm_agent_t* J) {
|
||||
uint64_t ptr;
|
||||
int err;
|
||||
|
||||
err = find_symbol(J, "UseCompressedOops", &J->Use_Compressed_Oops_address);
|
||||
if (err == PS_OK) {
|
||||
err = ps_pread(J->P, J->Use_Compressed_Oops_address, &J->Use_Compressed_Oops, sizeof(uint8_t));
|
||||
CHECK_FAIL(err);
|
||||
} else {
|
||||
J->Use_Compressed_Oops = 0;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
err = read_pointer(J, J->Universe_narrow_oop_base_address, &J->Universe_narrow_oop_base);
|
||||
CHECK_FAIL(err);
|
||||
err = ps_pread(J->P, J->Universe_narrow_oop_shift_address, &J->Universe_narrow_oop_shift, sizeof(uint32_t));
|
||||
CHECK_FAIL(err);
|
||||
|
||||
err = read_pointer(J, J->CodeCache_heap_address + OFFSET_CodeHeap_memory +
|
||||
OFFSET_VirtualSpace_low, &J->CodeCache_low);
|
||||
CHECK_FAIL(err);
|
||||
|
@ -374,19 +406,6 @@ static int find_start(jvm_agent_t* J, uint64_t ptr, uint64_t *startp) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int find_symbol(jvm_agent_t* J, const char *name, uint64_t* valuep) {
|
||||
psaddr_t sym_addr;
|
||||
int err;
|
||||
|
||||
err = ps_pglobal_lookup(J->P, LIBJVM_SO, name, &sym_addr);
|
||||
if (err != PS_OK) goto fail;
|
||||
*valuep = sym_addr;
|
||||
return PS_OK;
|
||||
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int find_jlong_constant(jvm_agent_t* J, const char *name, uint64_t* valuep) {
|
||||
psaddr_t sym_addr;
|
||||
int err = ps_pglobal_lookup(J->P, LIBJVM_SO, name, &sym_addr);
|
||||
|
@ -458,14 +477,14 @@ void Jagent_destroy(jvm_agent_t *J) {
|
|||
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) {
|
||||
// If UseCompressedOops, this was a compressed oop.
|
||||
if (J->Use_Compressed_Oops != 0) {
|
||||
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));
|
||||
klass = (uint64_t)((uintptr_t)J->Universe_narrow_oop_base +
|
||||
((uintptr_t)cklass << J->Universe_narrow_oop_shift));
|
||||
} else {
|
||||
err = read_pointer(J, methodOopPtr + OFFSET_oopDesc_metadata, &klass);
|
||||
}
|
||||
|
|
|
@ -3220,7 +3220,7 @@ bool os::Solaris::set_mpss_range(caddr_t start, size_t bytes, size_t align) {
|
|||
return true;
|
||||
}
|
||||
|
||||
char* os::reserve_memory_special(size_t bytes) {
|
||||
char* os::reserve_memory_special(size_t bytes, char* addr) {
|
||||
assert(UseLargePages && UseISM, "only for ISM large pages");
|
||||
|
||||
size_t size = bytes;
|
||||
|
@ -4451,6 +4451,9 @@ int_fnP_thread_t_i os::Solaris::_thr_setmutator;
|
|||
int_fnP_thread_t os::Solaris::_thr_suspend_mutator;
|
||||
int_fnP_thread_t os::Solaris::_thr_continue_mutator;
|
||||
|
||||
// (Static) wrapper for getisax(2) call.
|
||||
os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
|
||||
|
||||
// (Static) wrappers for the liblgrp API
|
||||
os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
|
||||
os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
|
||||
|
@ -4465,16 +4468,19 @@ os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
|
|||
// (Static) wrapper for meminfo() call.
|
||||
os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
|
||||
|
||||
static address resolve_symbol(const char *name) {
|
||||
address addr;
|
||||
|
||||
addr = (address) dlsym(RTLD_DEFAULT, name);
|
||||
static address resolve_symbol_lazy(const char* name) {
|
||||
address addr = (address) dlsym(RTLD_DEFAULT, name);
|
||||
if(addr == NULL) {
|
||||
// RTLD_DEFAULT was not defined on some early versions of 2.5.1
|
||||
addr = (address) dlsym(RTLD_NEXT, name);
|
||||
if(addr == NULL) {
|
||||
fatal(dlerror());
|
||||
}
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
static address resolve_symbol(const char* name) {
|
||||
address addr = resolve_symbol_lazy(name);
|
||||
if(addr == NULL) {
|
||||
fatal(dlerror());
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
@ -4673,15 +4679,26 @@ bool os::Solaris::liblgrp_init() {
|
|||
}
|
||||
|
||||
void os::Solaris::misc_sym_init() {
|
||||
address func = (address)dlsym(RTLD_DEFAULT, "meminfo");
|
||||
if(func == NULL) {
|
||||
func = (address) dlsym(RTLD_NEXT, "meminfo");
|
||||
address func;
|
||||
|
||||
// getisax
|
||||
func = resolve_symbol_lazy("getisax");
|
||||
if (func != NULL) {
|
||||
os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
|
||||
}
|
||||
|
||||
// meminfo
|
||||
func = resolve_symbol_lazy("meminfo");
|
||||
if (func != NULL) {
|
||||
os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
|
||||
}
|
||||
}
|
||||
|
||||
uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
|
||||
assert(_getisax != NULL, "_getisax not set");
|
||||
return _getisax(array, n);
|
||||
}
|
||||
|
||||
// Symbol doesn't exist in Solaris 8 pset.h
|
||||
#ifndef PS_MYID
|
||||
#define PS_MYID -3
|
||||
|
@ -4716,6 +4733,10 @@ void os::init(void) {
|
|||
|
||||
Solaris::initialize_system_info();
|
||||
|
||||
// Initialize misc. symbols as soon as possible, so we can use them
|
||||
// if we need them.
|
||||
Solaris::misc_sym_init();
|
||||
|
||||
int fd = open("/dev/zero", O_RDWR);
|
||||
if (fd < 0) {
|
||||
fatal1("os::init: cannot open /dev/zero (%s)", strerror(errno));
|
||||
|
@ -4857,7 +4878,6 @@ jint os::init_2(void) {
|
|||
}
|
||||
}
|
||||
|
||||
Solaris::misc_sym_init();
|
||||
Solaris::signal_sets_init();
|
||||
Solaris::init_signal_mem();
|
||||
Solaris::install_signal_handlers();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1997-2009 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
|
||||
|
@ -72,6 +72,8 @@ class Solaris {
|
|||
LGRP_VIEW_OS /* what's available to operating system */
|
||||
} lgrp_view_t;
|
||||
|
||||
typedef uint_t (*getisax_func_t)(uint32_t* array, uint_t n);
|
||||
|
||||
typedef lgrp_id_t (*lgrp_home_func_t)(idtype_t idtype, id_t id);
|
||||
typedef lgrp_cookie_t (*lgrp_init_func_t)(lgrp_view_t view);
|
||||
typedef int (*lgrp_fini_func_t)(lgrp_cookie_t cookie);
|
||||
|
@ -87,6 +89,8 @@ class Solaris {
|
|||
const uint_t info_req[], int info_count,
|
||||
uint64_t outdata[], uint_t validity[]);
|
||||
|
||||
static getisax_func_t _getisax;
|
||||
|
||||
static lgrp_home_func_t _lgrp_home;
|
||||
static lgrp_init_func_t _lgrp_init;
|
||||
static lgrp_fini_func_t _lgrp_fini;
|
||||
|
@ -283,6 +287,9 @@ class Solaris {
|
|||
}
|
||||
static lgrp_cookie_t lgrp_cookie() { return _lgrp_cookie; }
|
||||
|
||||
static bool supports_getisax() { return _getisax != NULL; }
|
||||
static uint_t getisax(uint32_t* array, uint_t n);
|
||||
|
||||
static void set_meminfo(meminfo_func_t func) { _meminfo = func; }
|
||||
static int meminfo (const uint64_t inaddr[], int addr_count,
|
||||
const uint_t info_req[], int info_count,
|
||||
|
|
|
@ -2595,7 +2595,7 @@ bool os::can_execute_large_page_memory() {
|
|||
return true;
|
||||
}
|
||||
|
||||
char* os::reserve_memory_special(size_t bytes) {
|
||||
char* os::reserve_memory_special(size_t bytes, char* addr) {
|
||||
|
||||
if (UseLargePagesIndividualAllocation) {
|
||||
if (TracePageSizes && Verbose) {
|
||||
|
@ -2615,7 +2615,7 @@ char* os::reserve_memory_special(size_t bytes) {
|
|||
"use -XX:-UseLargePagesIndividualAllocation to turn off");
|
||||
return NULL;
|
||||
}
|
||||
p_buf = (char *) VirtualAlloc(NULL,
|
||||
p_buf = (char *) VirtualAlloc(addr,
|
||||
size_of_reserve, // size of Reserve
|
||||
MEM_RESERVE,
|
||||
PAGE_EXECUTE_READWRITE);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue