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