xref: /qemu/include/exec/tlb-flags.h (revision 24b5e0fdb543a09c26d6d77051b17055288bef8e)
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 
224d43552aSPierrick Bouvier #include "exec/cpu-defs.h"
234d43552aSPierrick Bouvier 
244d43552aSPierrick Bouvier #ifdef CONFIG_USER_ONLY
254d43552aSPierrick Bouvier 
264d43552aSPierrick Bouvier /*
274d43552aSPierrick Bouvier  * Allow some level of source compatibility with softmmu.  We do not
284d43552aSPierrick Bouvier  * support any of the more exotic features, so only invalid pages may
294d43552aSPierrick Bouvier  * be signaled by probe_access_flags().
304d43552aSPierrick Bouvier  */
314d43552aSPierrick Bouvier #define TLB_INVALID_MASK    (1 << (TARGET_PAGE_BITS_MIN - 1))
324d43552aSPierrick Bouvier #define TLB_MMIO            (1 << (TARGET_PAGE_BITS_MIN - 2))
334d43552aSPierrick Bouvier #define TLB_WATCHPOINT      0
344d43552aSPierrick Bouvier 
354d43552aSPierrick Bouvier #else
364d43552aSPierrick Bouvier 
374d43552aSPierrick Bouvier /*
384d43552aSPierrick Bouvier  * Flags stored in the low bits of the TLB virtual address.
394d43552aSPierrick Bouvier  * These are defined so that fast path ram access is all zeros.
404d43552aSPierrick Bouvier  * The flags all must be between TARGET_PAGE_BITS and
414d43552aSPierrick Bouvier  * maximum address alignment bit.
424d43552aSPierrick Bouvier  *
434d43552aSPierrick Bouvier  * Use TARGET_PAGE_BITS_MIN so that these bits are constant
444d43552aSPierrick Bouvier  * when TARGET_PAGE_BITS_VARY is in effect.
454d43552aSPierrick Bouvier  *
464d43552aSPierrick Bouvier  * The count, if not the placement of these bits is known
474d43552aSPierrick Bouvier  * to tcg/tcg-op-ldst.c, check_max_alignment().
484d43552aSPierrick Bouvier  */
494d43552aSPierrick Bouvier /* Zero if TLB entry is valid.  */
504d43552aSPierrick Bouvier #define TLB_INVALID_MASK    (1 << (TARGET_PAGE_BITS_MIN - 1))
514d43552aSPierrick Bouvier /*
524d43552aSPierrick Bouvier  * Set if TLB entry references a clean RAM page.  The iotlb entry will
534d43552aSPierrick Bouvier  * contain the page physical address.
544d43552aSPierrick Bouvier  */
554d43552aSPierrick Bouvier #define TLB_NOTDIRTY        (1 << (TARGET_PAGE_BITS_MIN - 2))
564d43552aSPierrick Bouvier /* Set if the slow path must be used; more flags in CPUTLBEntryFull. */
57*24b5e0fdSRichard Henderson #define TLB_FORCE_SLOW      (1 << (TARGET_PAGE_BITS_MIN - 3))
584d43552aSPierrick Bouvier 
594d43552aSPierrick Bouvier /*
604d43552aSPierrick Bouvier  * Use this mask to check interception with an alignment mask
614d43552aSPierrick Bouvier  * in a TCG backend.
624d43552aSPierrick Bouvier  */
634d43552aSPierrick Bouvier #define TLB_FLAGS_MASK \
64*24b5e0fdSRichard Henderson     (TLB_INVALID_MASK | TLB_NOTDIRTY | TLB_FORCE_SLOW)
654d43552aSPierrick Bouvier 
664d43552aSPierrick Bouvier /*
674d43552aSPierrick Bouvier  * Flags stored in CPUTLBEntryFull.slow_flags[x].
684d43552aSPierrick Bouvier  * TLB_FORCE_SLOW must be set in CPUTLBEntry.addr_idx[x].
694d43552aSPierrick Bouvier  */
704d43552aSPierrick Bouvier /* Set if TLB entry requires byte swap.  */
714d43552aSPierrick Bouvier #define TLB_BSWAP            (1 << 0)
724d43552aSPierrick Bouvier /* Set if TLB entry contains a watchpoint.  */
734d43552aSPierrick Bouvier #define TLB_WATCHPOINT       (1 << 1)
744d43552aSPierrick Bouvier /* Set if TLB entry requires aligned accesses.  */
754d43552aSPierrick Bouvier #define TLB_CHECK_ALIGNED    (1 << 2)
76*24b5e0fdSRichard Henderson /* Set if TLB entry writes ignored.  */
77*24b5e0fdSRichard Henderson #define TLB_DISCARD_WRITE    (1 << 3)
78*24b5e0fdSRichard Henderson /* Set if TLB entry is an IO callback.  */
79*24b5e0fdSRichard Henderson #define TLB_MMIO             (1 << 4)
804d43552aSPierrick Bouvier 
81*24b5e0fdSRichard Henderson #define TLB_SLOW_FLAGS_MASK \
82*24b5e0fdSRichard Henderson     (TLB_BSWAP | TLB_WATCHPOINT | TLB_CHECK_ALIGNED | \
83*24b5e0fdSRichard Henderson      TLB_DISCARD_WRITE | TLB_MMIO)
844d43552aSPierrick Bouvier 
854d43552aSPierrick Bouvier /* The two sets of flags must not overlap. */
864d43552aSPierrick Bouvier QEMU_BUILD_BUG_ON(TLB_FLAGS_MASK & TLB_SLOW_FLAGS_MASK);
874d43552aSPierrick Bouvier 
884d43552aSPierrick Bouvier #endif /* !CONFIG_USER_ONLY */
894d43552aSPierrick Bouvier 
904d43552aSPierrick Bouvier #endif /* TLB_FLAGS_H */
91