--- old/src/share/vm/utilities/globalDefinitions.cpp 2012-11-12 10:52:11.648617572 -0800 +++ new/src/share/vm/utilities/globalDefinitions.cpp 2012-11-12 10:52:11.564618628 -0800 @@ -355,3 +355,49 @@ return size_t(result); } + +// Clamp an address to be within a specific page +// 1. If the address is on the page it is returned as is +// 2. If the address is above the page_address the start of the *next* page will be returned +// 3. If the address is below the page_address the start of the page will be returned +static address clamp_address_in_page(address addr, address page_address, intptr_t page_size) { + if (align_size_down(intptr_t(addr), page_size) == align_size_down(intptr_t(page_address), page_size)) { + // address is in the specified page, just return it as is + return addr; + } else if (addr > page_address) { + // address is on above specified page, return start of next page + return (address)align_size_down(intptr_t(page_address), page_size) + page_size; + } else { + // address is below specified page, return start of page + return (address)align_size_down(intptr_t(page_address), page_size); + } +} + +address clamp_address_in_page(address addr, address page_address) { + intptr_t page_size = os::vm_page_size(); + return clamp_address_in_page(addr, page_address, page_size); +} + +#ifndef PRODUCT + +void GlobalDefinitions::test_globals() { + intptr_t page_size = 4096; + address a_page = (address)(10*page_size); + + // Check that address within page is returned as is + assert(clamp_address_in_page(a_page, a_page, 4096) == a_page, "incorrect"); + assert(clamp_address_in_page(a_page + 128, a_page, 4096) == a_page + 128, "incorrect"); + assert(clamp_address_in_page(a_page + page_size - 1, a_page, 4096) == a_page + page_size - 1, "incorrect"); + + // Check that address above page returns start of next page + assert(clamp_address_in_page(a_page + page_size, a_page, 4096) == a_page + page_size, "incorrect"); + assert(clamp_address_in_page(a_page + page_size + 1, a_page, 4096) == a_page + page_size, "incorrect"); + assert(clamp_address_in_page(a_page + page_size*5 + 1, a_page, 4096) == a_page + page_size, "incorrect"); + + // Check that address below page returns start of page + assert(clamp_address_in_page(a_page - 1, a_page, 4096) == a_page, "incorrect"); + assert(clamp_address_in_page(a_page - 2*page_size - 1, a_page, 4096) == a_page, "incorrect"); + assert(clamp_address_in_page(a_page - 5*page_size - 1, a_page, 4096) == a_page, "incorrect"); +} + +#endif // PRODUCT