xref: /qemu/include/exec/target_page.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
151180423SJuan Quintela /*
251180423SJuan Quintela  * Target page sizes and friends for non target files
351180423SJuan Quintela  *
451180423SJuan Quintela  * Copyright (c) 2017 Red Hat Inc
551180423SJuan Quintela  *
651180423SJuan Quintela  * Authors:
751180423SJuan Quintela  *  David Alan Gilbert <dgilbert@redhat.com>
851180423SJuan Quintela  *  Juan Quintela <quintela@redhat.com>
951180423SJuan Quintela  *
1051180423SJuan Quintela  * This work is licensed under the terms of the GNU GPL, version 2 or later.
1151180423SJuan Quintela  * See the COPYING file in the top-level directory.
1251180423SJuan Quintela  */
1351180423SJuan Quintela 
1451180423SJuan Quintela #ifndef EXEC_TARGET_PAGE_H
1551180423SJuan Quintela #define EXEC_TARGET_PAGE_H
1651180423SJuan Quintela 
17*58d00538SRichard Henderson /*
18*58d00538SRichard Henderson  * If compiling per-target, get the real values.
19*58d00538SRichard Henderson  * For generic code, reuse the mechanism for variable page size.
20*58d00538SRichard Henderson  */
21*58d00538SRichard Henderson #ifdef COMPILING_PER_TARGET
22*58d00538SRichard Henderson #include "cpu-param.h"
23*58d00538SRichard Henderson #include "exec/target_long.h"
24*58d00538SRichard Henderson #define TARGET_PAGE_TYPE  target_long
25*58d00538SRichard Henderson #else
26*58d00538SRichard Henderson #define TARGET_PAGE_BITS_VARY
27*58d00538SRichard Henderson #define TARGET_PAGE_TYPE  int
28*58d00538SRichard Henderson #endif
2951180423SJuan Quintela 
30*58d00538SRichard Henderson #ifdef TARGET_PAGE_BITS_VARY
31*58d00538SRichard Henderson # include "exec/page-vary.h"
32*58d00538SRichard Henderson extern const TargetPageBits target_page;
33*58d00538SRichard Henderson # ifdef CONFIG_DEBUG_TCG
34*58d00538SRichard Henderson #  define TARGET_PAGE_BITS   ({ assert(target_page.decided); \
35*58d00538SRichard Henderson                                 target_page.bits; })
36*58d00538SRichard Henderson #  define TARGET_PAGE_MASK   ({ assert(target_page.decided); \
37*58d00538SRichard Henderson                                 (TARGET_PAGE_TYPE)target_page.mask; })
38*58d00538SRichard Henderson # else
39*58d00538SRichard Henderson #  define TARGET_PAGE_BITS   target_page.bits
40*58d00538SRichard Henderson #  define TARGET_PAGE_MASK   ((TARGET_PAGE_TYPE)target_page.mask)
41*58d00538SRichard Henderson # endif
42*58d00538SRichard Henderson # define TARGET_PAGE_SIZE    (-(int)TARGET_PAGE_MASK)
43*58d00538SRichard Henderson #else
44*58d00538SRichard Henderson # define TARGET_PAGE_SIZE    (1 << TARGET_PAGE_BITS)
45*58d00538SRichard Henderson # define TARGET_PAGE_MASK    ((TARGET_PAGE_TYPE)-1 << TARGET_PAGE_BITS)
46*58d00538SRichard Henderson #endif
47*58d00538SRichard Henderson 
48*58d00538SRichard Henderson #define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE)
49*58d00538SRichard Henderson 
qemu_target_page_size(void)50*58d00538SRichard Henderson static inline size_t qemu_target_page_size(void)
51*58d00538SRichard Henderson {
52*58d00538SRichard Henderson     return TARGET_PAGE_SIZE;
53*58d00538SRichard Henderson }
54*58d00538SRichard Henderson 
qemu_target_page_mask(void)55*58d00538SRichard Henderson static inline int qemu_target_page_mask(void)
56*58d00538SRichard Henderson {
57*58d00538SRichard Henderson     return TARGET_PAGE_MASK;
58*58d00538SRichard Henderson }
59*58d00538SRichard Henderson 
qemu_target_page_bits(void)60*58d00538SRichard Henderson static inline int qemu_target_page_bits(void)
61*58d00538SRichard Henderson {
62*58d00538SRichard Henderson     return TARGET_PAGE_BITS;
63*58d00538SRichard Henderson }
64*58d00538SRichard Henderson 
6562c5e181SJuan Quintela size_t qemu_target_pages_to_MiB(size_t pages);
66*58d00538SRichard Henderson 
6751180423SJuan Quintela #endif
68