17886cefeSRichard Henderson /* 26670d4d0SRichard Henderson * Variable page size handling -- target specific part. 37886cefeSRichard Henderson * 47886cefeSRichard Henderson * Copyright (c) 2003 Fabrice Bellard 57886cefeSRichard Henderson * 67886cefeSRichard Henderson * This library is free software; you can redistribute it and/or 77886cefeSRichard Henderson * modify it under the terms of the GNU Lesser General Public 87886cefeSRichard Henderson * License as published by the Free Software Foundation; either 961f3c91aSChetan Pant * version 2.1 of the License, or (at your option) any later version. 107886cefeSRichard Henderson * 117886cefeSRichard Henderson * This library is distributed in the hope that it will be useful, 127886cefeSRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 137886cefeSRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 147886cefeSRichard Henderson * Lesser General Public License for more details. 157886cefeSRichard Henderson * 167886cefeSRichard Henderson * You should have received a copy of the GNU Lesser General Public 177886cefeSRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>. 187886cefeSRichard Henderson */ 197886cefeSRichard Henderson 2044b99a6dSRichard Henderson #define IN_PAGE_VARY 1 2144b99a6dSRichard Henderson 227886cefeSRichard Henderson #include "qemu/osdep.h" 23ec5f7ca8SMarc-André Lureau #include "exec/page-vary.h" 242ec0dc24SPierrick Bouvier #include "exec/target_page.h" 257886cefeSRichard Henderson 26*d11bf649SRichard Henderson 27*d11bf649SRichard Henderson /* 28*d11bf649SRichard Henderson * For system mode, the minimum comes from the number of bits 29*d11bf649SRichard Henderson * required for maximum alignment (6) and the number of bits 30*d11bf649SRichard Henderson * required for TLB_FLAGS_MASK (3). 31*d11bf649SRichard Henderson * 32*d11bf649SRichard Henderson * For user mode, TARGET_PAGE_BITS_VARY is a hack to allow the target 33*d11bf649SRichard Henderson * page size to match the host page size. Mostly, this reduces the 34*d11bf649SRichard Henderson * ordinary target page size to run on a host with 4KiB pages (i.e. x86). 35*d11bf649SRichard Henderson * There is no true minimum required by the implementation, but keep the 36*d11bf649SRichard Henderson * same minimum as for system mode for sanity. 37*d11bf649SRichard Henderson * See linux-user/mmap.c, mmap_h_lt_g and mmap_h_gt_g. 38*d11bf649SRichard Henderson */ 39*d11bf649SRichard Henderson #define TARGET_PAGE_BITS_MIN 9 40*d11bf649SRichard Henderson 41*d11bf649SRichard Henderson #ifndef TARGET_PAGE_BITS_VARY 42*d11bf649SRichard Henderson QEMU_BUILD_BUG_ON(TARGET_PAGE_BITS < TARGET_PAGE_BITS_MIN); 43*d11bf649SRichard Henderson #endif 44*d11bf649SRichard Henderson 45*d11bf649SRichard Henderson #ifndef CONFIG_USER_ONLY 46*d11bf649SRichard Henderson #include "exec/tlb-flags.h" 47*d11bf649SRichard Henderson 48*d11bf649SRichard Henderson QEMU_BUILD_BUG_ON(TLB_FLAGS_MASK & ((1u < TARGET_PAGE_BITS_MIN) - 1)); 49*d11bf649SRichard Henderson migration_legacy_page_bits(void)5012eeb04aSRichard Hendersonint migration_legacy_page_bits(void) 5112eeb04aSRichard Henderson { 5212eeb04aSRichard Henderson #ifdef TARGET_PAGE_BITS_VARY 53*d11bf649SRichard Henderson QEMU_BUILD_BUG_ON(TARGET_PAGE_BITS_LEGACY < TARGET_PAGE_BITS_MIN); 54*d11bf649SRichard Henderson return TARGET_PAGE_BITS_LEGACY; 5512eeb04aSRichard Henderson #else 5612eeb04aSRichard Henderson return TARGET_PAGE_BITS; 5712eeb04aSRichard Henderson #endif 5812eeb04aSRichard Henderson } 59*d11bf649SRichard Henderson #endif 6012eeb04aSRichard Henderson set_preferred_target_page_bits(int bits)617886cefeSRichard Hendersonbool set_preferred_target_page_bits(int bits) 627886cefeSRichard Henderson { 637886cefeSRichard Henderson assert(bits >= TARGET_PAGE_BITS_MIN); 64*d11bf649SRichard Henderson #ifdef TARGET_PAGE_BITS_VARY 6544b99a6dSRichard Henderson return set_preferred_target_page_bits_common(bits); 6644b99a6dSRichard Henderson #else 677886cefeSRichard Henderson return true; 6844b99a6dSRichard Henderson #endif 697886cefeSRichard Henderson } 707886cefeSRichard Henderson finalize_target_page_bits(void)717886cefeSRichard Hendersonvoid finalize_target_page_bits(void) 727886cefeSRichard Henderson { 73*d11bf649SRichard Henderson #ifndef TARGET_PAGE_BITS_VARY 74*d11bf649SRichard Henderson finalize_target_page_bits_common(TARGET_PAGE_BITS); 75*d11bf649SRichard Henderson #elif defined(CONFIG_USER_ONLY) 76*d11bf649SRichard Henderson assert(target_page.bits != 0); 77*d11bf649SRichard Henderson finalize_target_page_bits_common(target_page.bits); 78*d11bf649SRichard Henderson #else 79*d11bf649SRichard Henderson finalize_target_page_bits_common(TARGET_PAGE_BITS_LEGACY); 80*d11bf649SRichard Henderson #endif 817886cefeSRichard Henderson } 82