| /* | |
| * Variable page size handling -- target independent part. | |
| * | |
| * Copyright (c) 2003 Fabrice Bellard | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
| */ | |
| #define IN_PAGE_VARY 1 | |
| #include "qemu/osdep.h" | |
| #include "qemu/target-info-def.h" | |
| #include "exec/page-vary.h" | |
| /* WARNING: This file must *not* be complied with -flto. */ | |
| TargetPageBits target_page; | |
| bool set_preferred_target_page_bits(int bits) | |
| { | |
| const TargetInfo *ti = target_info(); | |
| assert(bits >= TARGET_PAGE_BITS_MIN); | |
| if (ti->page_bits_vary) { | |
| /* | |
| * The target page size is the lowest common denominator for all | |
| * the CPUs in the system, so we can only make it smaller, never | |
| * larger. And we can't make it smaller once we've committed to | |
| * a particular size. | |
| */ | |
| if (target_page.bits == 0 || target_page.bits > bits) { | |
| if (target_page.decided) { | |
| return false; | |
| } | |
| target_page.bits = bits; | |
| } | |
| } | |
| return true; | |
| } | |
| void finalize_target_page_bits(void) | |
| { | |
| int bits = target_page.bits; | |
| if (bits == 0) { | |
| const TargetInfo *ti = target_info(); | |
| bits = ti->page_bits_init; | |
| assert(bits != 0); | |
| target_page.bits = bits; | |
| } | |
| target_page.mask = -1ull << bits; | |
| target_page.decided = true; | |
| } |