xref: /qemu/include/exec/tlb-flags.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
14d43552aSPierrick Bouvier /*
24d43552aSPierrick Bouvier  * TLB flags definition
34d43552aSPierrick Bouvier  *
44d43552aSPierrick Bouvier  *  Copyright (c) 2003 Fabrice Bellard
54d43552aSPierrick Bouvier  *
64d43552aSPierrick Bouvier  * This library is free software; you can redistribute it and/or
74d43552aSPierrick Bouvier  * modify it under the terms of the GNU Lesser General Public
84d43552aSPierrick Bouvier  * License as published by the Free Software Foundation; either
94d43552aSPierrick Bouvier  * version 2.1 of the License, or (at your option) any later version.
104d43552aSPierrick Bouvier  *
114d43552aSPierrick Bouvier  * This library is distributed in the hope that it will be useful,
124d43552aSPierrick Bouvier  * but WITHOUT ANY WARRANTY; without even the implied warranty of
134d43552aSPierrick Bouvier  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
144d43552aSPierrick Bouvier  * Lesser General Public License for more details.
154d43552aSPierrick Bouvier  *
164d43552aSPierrick Bouvier  * You should have received a copy of the GNU Lesser General Public
174d43552aSPierrick Bouvier  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
184d43552aSPierrick Bouvier  */
194d43552aSPierrick Bouvier #ifndef TLB_FLAGS_H
204d43552aSPierrick Bouvier #define TLB_FLAGS_H
214d43552aSPierrick Bouvier 
22*6effa874SRichard Henderson /*
23*6effa874SRichard Henderson  * Flags returned for lookup of a TLB virtual address.
24*6effa874SRichard Henderson  */
254d43552aSPierrick Bouvier 
264d43552aSPierrick Bouvier #ifdef CONFIG_USER_ONLY
274d43552aSPierrick Bouvier 
284d43552aSPierrick Bouvier /*
29*6effa874SRichard Henderson  * Allow some level of source compatibility with softmmu.
30*6effa874SRichard Henderson  * Invalid is set when the page does not have requested permissions.
31*6effa874SRichard Henderson  * MMIO is set when we want the target helper to use the functional
32*6effa874SRichard Henderson  * interface for load/store so that plugins see the access.
334d43552aSPierrick Bouvier  */
34*6effa874SRichard Henderson #define TLB_INVALID_MASK     (1 << 0)
35*6effa874SRichard Henderson #define TLB_MMIO             (1 << 1)
364d43552aSPierrick Bouvier #define TLB_WATCHPOINT       0
374d43552aSPierrick Bouvier 
384d43552aSPierrick Bouvier #else
394d43552aSPierrick Bouvier 
404d43552aSPierrick Bouvier /*
414d43552aSPierrick Bouvier  * Flags stored in CPUTLBEntryFull.slow_flags[x].
424d43552aSPierrick Bouvier  * TLB_FORCE_SLOW must be set in CPUTLBEntry.addr_idx[x].
434d43552aSPierrick Bouvier  */
44*6effa874SRichard Henderson 
454d43552aSPierrick Bouvier /* Set if TLB entry requires byte swap.  */
464d43552aSPierrick Bouvier #define TLB_BSWAP            (1 << 0)
474d43552aSPierrick Bouvier /* Set if TLB entry contains a watchpoint.  */
484d43552aSPierrick Bouvier #define TLB_WATCHPOINT       (1 << 1)
494d43552aSPierrick Bouvier /* Set if TLB entry requires aligned accesses.  */
504d43552aSPierrick Bouvier #define TLB_CHECK_ALIGNED    (1 << 2)
5124b5e0fdSRichard Henderson /* Set if TLB entry writes ignored.  */
5224b5e0fdSRichard Henderson #define TLB_DISCARD_WRITE    (1 << 3)
5324b5e0fdSRichard Henderson /* Set if TLB entry is an IO callback.  */
5424b5e0fdSRichard Henderson #define TLB_MMIO             (1 << 4)
554d43552aSPierrick Bouvier 
5624b5e0fdSRichard Henderson #define TLB_SLOW_FLAGS_MASK \
5724b5e0fdSRichard Henderson     (TLB_BSWAP | TLB_WATCHPOINT | TLB_CHECK_ALIGNED | \
5824b5e0fdSRichard Henderson      TLB_DISCARD_WRITE | TLB_MMIO)
594d43552aSPierrick Bouvier 
60*6effa874SRichard Henderson /*
61*6effa874SRichard Henderson  * Flags stored in CPUTLBEntry.addr_idx[x].
62*6effa874SRichard Henderson  * These must be above the largest alignment (64 bytes),
63*6effa874SRichard Henderson  * and below the smallest page size (1024 bytes).
64*6effa874SRichard Henderson  * This leaves bits [9:6] available for use.
65*6effa874SRichard Henderson  */
66*6effa874SRichard Henderson 
67*6effa874SRichard Henderson /* Zero if TLB entry is valid.  */
68*6effa874SRichard Henderson #define TLB_INVALID_MASK     (1 << 6)
69*6effa874SRichard Henderson /* Set if TLB entry references a clean RAM page.  */
70*6effa874SRichard Henderson #define TLB_NOTDIRTY         (1 << 7)
71*6effa874SRichard Henderson /* Set if the slow path must be used; more flags in CPUTLBEntryFull. */
72*6effa874SRichard Henderson #define TLB_FORCE_SLOW       (1 << 8)
73*6effa874SRichard Henderson 
74*6effa874SRichard Henderson /*
75*6effa874SRichard Henderson  * Use this mask to check interception with an alignment mask
76*6effa874SRichard Henderson  * in a TCG backend.
77*6effa874SRichard Henderson  */
78*6effa874SRichard Henderson #define TLB_FLAGS_MASK \
79*6effa874SRichard Henderson     (TLB_INVALID_MASK | TLB_NOTDIRTY | TLB_FORCE_SLOW)
80*6effa874SRichard Henderson 
814d43552aSPierrick Bouvier /* The two sets of flags must not overlap. */
824d43552aSPierrick Bouvier QEMU_BUILD_BUG_ON(TLB_FLAGS_MASK & TLB_SLOW_FLAGS_MASK);
834d43552aSPierrick Bouvier 
844d43552aSPierrick Bouvier #endif /* !CONFIG_USER_ONLY */
854d43552aSPierrick Bouvier 
864d43552aSPierrick Bouvier #endif /* TLB_FLAGS_H */
87