1 /* 2 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #include "precompiled.hpp" 25 #include "gc/z/zPage.inline.hpp" 26 #include "gc/z/zPageTable.inline.hpp" 27 #include "runtime/orderAccess.hpp" 28 #include "utilities/debug.hpp" 29 30 ZPageTable::ZPageTable() : 31 _map() {} 32 33 ZPageTableEntry ZPageTable::get_entry(ZPage* page) const { 34 const uintptr_t addr = ZAddress::good(page->start()); 35 return _map.get(addr); 36 } 37 38 void ZPageTable::put_entry(ZPage* page, ZPageTableEntry entry) { 39 // Make sure a newly created page is globally visible before 40 // updating the pagetable. 41 OrderAccess::storestore(); 42 43 const uintptr_t start = ZAddress::good(page->start()); 44 const uintptr_t end = start + page->size(); 45 for (uintptr_t addr = start; addr < end; addr += ZPageSizeMin) { 46 _map.put(addr, entry); 47 } 48 } 49 50 void ZPageTable::insert(ZPage* page) { 51 assert(get_entry(page).page() == NULL || 52 get_entry(page).page() == page, "Invalid entry"); 53 54 // Cached pages stays in the pagetable and we must not re-insert 55 // those when they get re-allocated because they might also be 56 // relocating and we don't want to clear their relocating bit. 57 if (get_entry(page).page() == NULL) { 58 ZPageTableEntry entry(page, false /* relocating */); 59 put_entry(page, entry); 60 } 61 62 assert(get_entry(page).page() == page, "Invalid entry"); 63 } 64 65 void ZPageTable::remove(ZPage* page) { 66 assert(get_entry(page).page() == page, "Invalid entry"); 67 68 ZPageTableEntry entry; 69 put_entry(page, entry); 70 71 assert(get_entry(page).page() == NULL, "Invalid entry"); 72 } 73 74 void ZPageTable::set_relocating(ZPage* page) { 75 assert(get_entry(page).page() == page, "Invalid entry"); 76 assert(!get_entry(page).relocating(), "Invalid entry"); 77 78 ZPageTableEntry entry(page, true /* relocating */); 79 put_entry(page, entry); 80 81 assert(get_entry(page).page() == page, "Invalid entry"); 82 assert(get_entry(page).relocating(), "Invalid entry"); 83 } 84 85 void ZPageTable::clear_relocating(ZPage* page) { 86 assert(get_entry(page).page() == page, "Invalid entry"); 87 assert(get_entry(page).relocating(), "Invalid entry"); 88 89 ZPageTableEntry entry(page, false /* relocating */); 90 put_entry(page, entry); 91 92 assert(get_entry(page).page() == page, "Invalid entry"); 93 assert(!get_entry(page).relocating(), "Invalid entry"); 94 }