xref: /qemu/include/exec/tlb-flags.h (revision 4d43552abe5c20ab414c054dd591bb6777832355)
1*4d43552aSPierrick Bouvier /*
2*4d43552aSPierrick Bouvier  * TLB flags definition
3*4d43552aSPierrick Bouvier  *
4*4d43552aSPierrick Bouvier  *  Copyright (c) 2003 Fabrice Bellard
5*4d43552aSPierrick Bouvier  *
6*4d43552aSPierrick Bouvier  * This library is free software; you can redistribute it and/or
7*4d43552aSPierrick Bouvier  * modify it under the terms of the GNU Lesser General Public
8*4d43552aSPierrick Bouvier  * License as published by the Free Software Foundation; either
9*4d43552aSPierrick Bouvier  * version 2.1 of the License, or (at your option) any later version.
10*4d43552aSPierrick Bouvier  *
11*4d43552aSPierrick Bouvier  * This library is distributed in the hope that it will be useful,
12*4d43552aSPierrick Bouvier  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d43552aSPierrick Bouvier  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*4d43552aSPierrick Bouvier  * Lesser General Public License for more details.
15*4d43552aSPierrick Bouvier  *
16*4d43552aSPierrick Bouvier  * You should have received a copy of the GNU Lesser General Public
17*4d43552aSPierrick Bouvier  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*4d43552aSPierrick Bouvier  */
19*4d43552aSPierrick Bouvier #ifndef TLB_FLAGS_H
20*4d43552aSPierrick Bouvier #define TLB_FLAGS_H
21*4d43552aSPierrick Bouvier 
22*4d43552aSPierrick Bouvier #include "exec/cpu-defs.h"
23*4d43552aSPierrick Bouvier 
24*4d43552aSPierrick Bouvier #ifdef CONFIG_USER_ONLY
25*4d43552aSPierrick Bouvier 
26*4d43552aSPierrick Bouvier /*
27*4d43552aSPierrick Bouvier  * Allow some level of source compatibility with softmmu.  We do not
28*4d43552aSPierrick Bouvier  * support any of the more exotic features, so only invalid pages may
29*4d43552aSPierrick Bouvier  * be signaled by probe_access_flags().
30*4d43552aSPierrick Bouvier  */
31*4d43552aSPierrick Bouvier #define TLB_INVALID_MASK    (1 << (TARGET_PAGE_BITS_MIN - 1))
32*4d43552aSPierrick Bouvier #define TLB_MMIO            (1 << (TARGET_PAGE_BITS_MIN - 2))
33*4d43552aSPierrick Bouvier #define TLB_WATCHPOINT      0
34*4d43552aSPierrick Bouvier 
35*4d43552aSPierrick Bouvier #else
36*4d43552aSPierrick Bouvier 
37*4d43552aSPierrick Bouvier /*
38*4d43552aSPierrick Bouvier  * Flags stored in the low bits of the TLB virtual address.
39*4d43552aSPierrick Bouvier  * These are defined so that fast path ram access is all zeros.
40*4d43552aSPierrick Bouvier  * The flags all must be between TARGET_PAGE_BITS and
41*4d43552aSPierrick Bouvier  * maximum address alignment bit.
42*4d43552aSPierrick Bouvier  *
43*4d43552aSPierrick Bouvier  * Use TARGET_PAGE_BITS_MIN so that these bits are constant
44*4d43552aSPierrick Bouvier  * when TARGET_PAGE_BITS_VARY is in effect.
45*4d43552aSPierrick Bouvier  *
46*4d43552aSPierrick Bouvier  * The count, if not the placement of these bits is known
47*4d43552aSPierrick Bouvier  * to tcg/tcg-op-ldst.c, check_max_alignment().
48*4d43552aSPierrick Bouvier  */
49*4d43552aSPierrick Bouvier /* Zero if TLB entry is valid.  */
50*4d43552aSPierrick Bouvier #define TLB_INVALID_MASK    (1 << (TARGET_PAGE_BITS_MIN - 1))
51*4d43552aSPierrick Bouvier /*
52*4d43552aSPierrick Bouvier  * Set if TLB entry references a clean RAM page.  The iotlb entry will
53*4d43552aSPierrick Bouvier  * contain the page physical address.
54*4d43552aSPierrick Bouvier  */
55*4d43552aSPierrick Bouvier #define TLB_NOTDIRTY        (1 << (TARGET_PAGE_BITS_MIN - 2))
56*4d43552aSPierrick Bouvier /* Set if TLB entry is an IO callback.  */
57*4d43552aSPierrick Bouvier #define TLB_MMIO            (1 << (TARGET_PAGE_BITS_MIN - 3))
58*4d43552aSPierrick Bouvier /* Set if TLB entry writes ignored.  */
59*4d43552aSPierrick Bouvier #define TLB_DISCARD_WRITE   (1 << (TARGET_PAGE_BITS_MIN - 4))
60*4d43552aSPierrick Bouvier /* Set if the slow path must be used; more flags in CPUTLBEntryFull. */
61*4d43552aSPierrick Bouvier #define TLB_FORCE_SLOW      (1 << (TARGET_PAGE_BITS_MIN - 5))
62*4d43552aSPierrick Bouvier 
63*4d43552aSPierrick Bouvier /*
64*4d43552aSPierrick Bouvier  * Use this mask to check interception with an alignment mask
65*4d43552aSPierrick Bouvier  * in a TCG backend.
66*4d43552aSPierrick Bouvier  */
67*4d43552aSPierrick Bouvier #define TLB_FLAGS_MASK \
68*4d43552aSPierrick Bouvier     (TLB_INVALID_MASK | TLB_NOTDIRTY | TLB_MMIO \
69*4d43552aSPierrick Bouvier     | TLB_FORCE_SLOW | TLB_DISCARD_WRITE)
70*4d43552aSPierrick Bouvier 
71*4d43552aSPierrick Bouvier /*
72*4d43552aSPierrick Bouvier  * Flags stored in CPUTLBEntryFull.slow_flags[x].
73*4d43552aSPierrick Bouvier  * TLB_FORCE_SLOW must be set in CPUTLBEntry.addr_idx[x].
74*4d43552aSPierrick Bouvier  */
75*4d43552aSPierrick Bouvier /* Set if TLB entry requires byte swap.  */
76*4d43552aSPierrick Bouvier #define TLB_BSWAP            (1 << 0)
77*4d43552aSPierrick Bouvier /* Set if TLB entry contains a watchpoint.  */
78*4d43552aSPierrick Bouvier #define TLB_WATCHPOINT       (1 << 1)
79*4d43552aSPierrick Bouvier /* Set if TLB entry requires aligned accesses.  */
80*4d43552aSPierrick Bouvier #define TLB_CHECK_ALIGNED    (1 << 2)
81*4d43552aSPierrick Bouvier 
82*4d43552aSPierrick Bouvier #define TLB_SLOW_FLAGS_MASK  (TLB_BSWAP | TLB_WATCHPOINT | TLB_CHECK_ALIGNED)
83*4d43552aSPierrick Bouvier 
84*4d43552aSPierrick Bouvier /* The two sets of flags must not overlap. */
85*4d43552aSPierrick Bouvier QEMU_BUILD_BUG_ON(TLB_FLAGS_MASK & TLB_SLOW_FLAGS_MASK);
86*4d43552aSPierrick Bouvier 
87*4d43552aSPierrick Bouvier #endif /* !CONFIG_USER_ONLY */
88*4d43552aSPierrick Bouvier 
89*4d43552aSPierrick Bouvier #endif /* TLB_FLAGS_H */
90