xref: /openbmc/qemu/page-vary-common.c (revision 1be5a765c08cee3a9587c8a8d3fc2ea247b13f9c)
1*44b99a6dSRichard Henderson /*
2*44b99a6dSRichard Henderson  * Variable page size handling -- target independent part.
3*44b99a6dSRichard Henderson  *
4*44b99a6dSRichard Henderson  *  Copyright (c) 2003 Fabrice Bellard
5*44b99a6dSRichard Henderson  *
6*44b99a6dSRichard Henderson  * This library is free software; you can redistribute it and/or
7*44b99a6dSRichard Henderson  * modify it under the terms of the GNU Lesser General Public
8*44b99a6dSRichard Henderson  * License as published by the Free Software Foundation; either
9*44b99a6dSRichard Henderson  * version 2.1 of the License, or (at your option) any later version.
10*44b99a6dSRichard Henderson  *
11*44b99a6dSRichard Henderson  * This library is distributed in the hope that it will be useful,
12*44b99a6dSRichard Henderson  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*44b99a6dSRichard Henderson  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*44b99a6dSRichard Henderson  * Lesser General Public License for more details.
15*44b99a6dSRichard Henderson  *
16*44b99a6dSRichard Henderson  * You should have received a copy of the GNU Lesser General Public
17*44b99a6dSRichard Henderson  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*44b99a6dSRichard Henderson  */
19*44b99a6dSRichard Henderson 
20*44b99a6dSRichard Henderson #define IN_PAGE_VARY 1
21*44b99a6dSRichard Henderson 
22*44b99a6dSRichard Henderson #include "qemu/osdep.h"
23*44b99a6dSRichard Henderson #include "exec/page-vary.h"
24*44b99a6dSRichard Henderson 
25*44b99a6dSRichard Henderson /* WARNING: This file must *not* be complied with -flto. */
26*44b99a6dSRichard Henderson 
27*44b99a6dSRichard Henderson TargetPageBits target_page;
28*44b99a6dSRichard Henderson 
set_preferred_target_page_bits_common(int bits)29*44b99a6dSRichard Henderson bool set_preferred_target_page_bits_common(int bits)
30*44b99a6dSRichard Henderson {
31*44b99a6dSRichard Henderson     /*
32*44b99a6dSRichard Henderson      * The target page size is the lowest common denominator for all
33*44b99a6dSRichard Henderson      * the CPUs in the system, so we can only make it smaller, never
34*44b99a6dSRichard Henderson      * larger. And we can't make it smaller once we've committed to
35*44b99a6dSRichard Henderson      * a particular size.
36*44b99a6dSRichard Henderson      */
37*44b99a6dSRichard Henderson     if (target_page.bits == 0 || target_page.bits > bits) {
38*44b99a6dSRichard Henderson         if (target_page.decided) {
39*44b99a6dSRichard Henderson             return false;
40*44b99a6dSRichard Henderson         }
41*44b99a6dSRichard Henderson         target_page.bits = bits;
42*44b99a6dSRichard Henderson     }
43*44b99a6dSRichard Henderson     return true;
44*44b99a6dSRichard Henderson }
45*44b99a6dSRichard Henderson 
finalize_target_page_bits_common(int min)46*44b99a6dSRichard Henderson void finalize_target_page_bits_common(int min)
47*44b99a6dSRichard Henderson {
48*44b99a6dSRichard Henderson     if (target_page.bits == 0) {
49*44b99a6dSRichard Henderson         target_page.bits = min;
50*44b99a6dSRichard Henderson     }
51*44b99a6dSRichard Henderson     target_page.mask = -1ull << target_page.bits;
52*44b99a6dSRichard Henderson     target_page.decided = true;
53*44b99a6dSRichard Henderson }
54