< prev index next >
src/hotspot/os/aix/safepointMechanism_aix.cpp
Print this page
rev 50788 : 8205609: [PPC64] Fix PPC64 part of 8010319 and TLH without UseSIGTRAP on AIX
Reviewed-by: dholmes
*** 36,46 ****
return;
}
// Allocate one protected page
char* map_address = (char*)MAP_FAILED;
! const size_t page_size = os::vm_page_size();
const int prot = PROT_READ;
const int flags = MAP_PRIVATE | MAP_ANONYMOUS;
// Use optimized addresses for the polling page,
// e.g. map it to a special 32-bit address.
--- 36,46 ----
return;
}
// Allocate one protected page
char* map_address = (char*)MAP_FAILED;
! const size_t map_size = ThreadLocalHandshakes ? 2 * os::vm_page_size() : os::vm_page_size();
const int prot = PROT_READ;
const int flags = MAP_PRIVATE | MAP_ANONYMOUS;
// Use optimized addresses for the polling page,
// e.g. map it to a special 32-bit address.
*** 66,76 ****
for (int i = 0; i < address_wishes_length; i++) {
// Try to map with current address wish.
// AIX: AIX needs MAP_FIXED if we provide an address and mmap will
// fail if the address is already mapped.
map_address = (char*) ::mmap(address_wishes[i],
! page_size, prot,
flags | MAP_FIXED,
-1, 0);
log_debug(os)("SafePoint Polling Page address: %p (wish) => %p",
address_wishes[i], map_address);
--- 66,76 ----
for (int i = 0; i < address_wishes_length; i++) {
// Try to map with current address wish.
// AIX: AIX needs MAP_FIXED if we provide an address and mmap will
// fail if the address is already mapped.
map_address = (char*) ::mmap(address_wishes[i],
! map_size, prot,
flags | MAP_FIXED,
-1, 0);
log_debug(os)("SafePoint Polling Page address: %p (wish) => %p",
address_wishes[i], map_address);
*** 79,104 ****
break;
}
if (map_address != (char*)MAP_FAILED) {
// Map succeeded, but polling_page is not at wished address, unmap and continue.
! ::munmap(map_address, page_size);
map_address = (char*)MAP_FAILED;
}
// Map failed, continue loop.
}
}
if (map_address == (char*)MAP_FAILED) {
! map_address = (char*) ::mmap(NULL, page_size, prot, flags, -1, 0);
}
! guarantee(map_address != (char*)MAP_FAILED, "SafepointMechanism::pd_initialize: failed to allocate polling page");
log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(map_address));
os::set_polling_page((address)(map_address));
// Use same page for ThreadLocalHandshakes without SIGTRAP
if (ThreadLocalHandshakes) {
set_uses_thread_local_poll();
! intptr_t bad_page_val = reinterpret_cast<intptr_t>(map_address);
! _poll_armed_value = reinterpret_cast<void*>(bad_page_val | poll_bit());
! _poll_disarmed_value = NULL; // Readable on AIX
}
}
--- 79,107 ----
break;
}
if (map_address != (char*)MAP_FAILED) {
// Map succeeded, but polling_page is not at wished address, unmap and continue.
! ::munmap(map_address, map_size);
map_address = (char*)MAP_FAILED;
}
// Map failed, continue loop.
}
}
if (map_address == (char*)MAP_FAILED) {
! map_address = (char*) ::mmap(NULL, map_size, prot, flags, -1, 0);
}
! guarantee(map_address != (char*)MAP_FAILED && map_address != NULL,
! "SafepointMechanism::pd_initialize: failed to allocate polling page");
log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(map_address));
os::set_polling_page((address)(map_address));
// Use same page for ThreadLocalHandshakes without SIGTRAP
if (ThreadLocalHandshakes) {
set_uses_thread_local_poll();
! os::make_polling_page_unreadable();
! intptr_t bad_page_val = reinterpret_cast<intptr_t>(map_address),
! good_page_val = bad_page_val + os::vm_page_size();
! _poll_armed_value = reinterpret_cast<void*>(bad_page_val + poll_bit());
! _poll_disarmed_value = reinterpret_cast<void*>(good_page_val);
}
}
< prev index next >