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