MemRegion G1PageBasedVirtualSpace::uncommit(uintptr_t start, size_t size_in_pages) { guarantee(is_area_committed(start, size_in_pages), "checking"); if (!_special) { os::uncommit_memory(page_start(start), byte_size_for_pages(size_in_pages)); } _committed.clear_range(start, start + size_in_pages); MemRegion result((HeapWord*)page_start(start), byte_size_for_pages(size_in_pages) / HeapWordSize); return result; }
MemRegion G1PageBasedVirtualSpace::commit(uintptr_t start, size_t size_in_pages) { // We need to make sure to commit all pages covered by the given area. guarantee(is_area_uncommitted(start, size_in_pages), "Specified area is not uncommitted"); if (!_special) { os::commit_memory_or_exit(page_start(start), byte_size_for_pages(size_in_pages), _executable, err_msg("Failed to commit pages from "SIZE_FORMAT" of length "SIZE_FORMAT, start, size_in_pages)); } _committed.set_range(start, start + size_in_pages); MemRegion result((HeapWord*)page_start(start), byte_size_for_pages(size_in_pages) / HeapWordSize); return result; }
unsigned char receive(volatile unsigned char *buffer, unsigned char size) { if (buffer == 0) { state = START; return 3; } else { switch (state) { case START: if (size == 3) { addr = (uint16_t)buffer[1] << 8 | (uint16_t)buffer[2]; switch (buffer[0]) { case 0x00: state = READ; break; case 0x01: state = WRITE; return SPM_PAGESIZE - page_offset(addr); case 0x02: state = BOOT; break; default: break; } return 0; } break; case WRITE: if(page_address != page_start(addr)) { write_page(); read_page(page_start(addr)); } for (i = 0; i < size; i++) { page_buffer[page_offset(addr)] = buffer[i]; addr++; page_dirty = 1; } return SPM_PAGESIZE - page_offset(addr); default: break; } } return 0; }
void G1PageBasedVirtualSpace::uncommit_internal(size_t start_page, size_t end_page) { guarantee(start_page < end_page, "Given start page " SIZE_FORMAT " is larger or equal to end page " SIZE_FORMAT, start_page, end_page); char* start_addr = page_start(start_page); os::uncommit_memory(start_addr, pointer_delta(bounded_end_addr(end_page), start_addr, sizeof(char))); }
void G1PageBasedVirtualSpace::commit_preferred_pages(size_t start, size_t num_pages) { vmassert(num_pages > 0, "No full pages to commit"); vmassert(start + num_pages <= _committed.size(), "Tried to commit area from page " SIZE_FORMAT " to page " SIZE_FORMAT " " "that is outside of managed space of " SIZE_FORMAT " pages", start, start + num_pages, _committed.size()); char* start_addr = page_start(start); size_t size = num_pages * _page_size; os::commit_memory_or_exit(start_addr, size, _page_size, _executable, err_msg("Failed to commit area from " PTR_FORMAT " to " PTR_FORMAT " of length " SIZE_FORMAT ".", p2i(start_addr), p2i(start_addr + size), size)); }
void G1PageBasedVirtualSpace::pretouch_internal(size_t start_page, size_t end_page) { guarantee(start_page < end_page, "Given start page " SIZE_FORMAT " is larger or equal to end page " SIZE_FORMAT, start_page, end_page); os::pretouch_memory(page_start(start_page), bounded_end_addr(end_page)); }
char* G1PageBasedVirtualSpace::bounded_end_addr(size_t end_page) const { return MIN2(_high_boundary, page_start(end_page)); }
// the address of the start of the next page after p-1 char* OS::page_end(void *p, unsigned int pg_sz) { return page_start(((char*)p) - 1, pg_sz) + pg_sz; }