Richard Henderson <richard.hender...@linaro.org> writes:
> When PAGE_RESET is set, we are replacing pages with new > content, which means that we need to invalidate existing > cached data, such as TranslationBlocks. Perform the > reset invalidate while we're doing other invalidates, > which allows us to remove the separate invalidates from > the user-only mmap/munmap/mprotect routines. > > In addition, restrict invalidation to PAGE_EXEC pages. > Since cdf713085131, we have validated PAGE_EXEC is present > before translation, which means we can assume that if the > bit is not present, there are no translations to invalidate. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > accel/tcg/translate-all.c | 19 +++++++++++-------- > bsd-user/mmap.c | 2 -- > linux-user/mmap.c | 4 ---- > 3 files changed, 11 insertions(+), 14 deletions(-) > > diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c > index 8d5233fa9e..478301f227 100644 > --- a/accel/tcg/translate-all.c > +++ b/accel/tcg/translate-all.c > @@ -1352,7 +1352,7 @@ int page_get_flags(target_ulong address) > void page_set_flags(target_ulong start, target_ulong end, int flags) > { > target_ulong addr, len; > - bool reset_target_data; > + bool reset; > > /* This function should never be called with addresses outside the > guest address space. If this assert fires, it probably indicates > @@ -1369,7 +1369,7 @@ void page_set_flags(target_ulong start, target_ulong > end, int flags) > if (flags & PAGE_WRITE) { > flags |= PAGE_WRITE_ORG; > } > - reset_target_data = !(flags & PAGE_VALID) || (flags & PAGE_RESET); > + reset = !(flags & PAGE_VALID) || (flags & PAGE_RESET); > flags &= ~PAGE_RESET; Not a problem with this patch but I was a little confused by PAGE_VALID because its the one "special" flag not documented in cpu-all.h: /* same as PROT_xxx */ #define PAGE_READ 0x0001 #define PAGE_WRITE 0x0002 #define PAGE_EXEC 0x0004 #define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC) The above are self explanatory as they mirror the mmap flags. But what does PAGE_VALID really mean. We set it in the elfloader and whenever we mmap which begs the question when is a page not VALID? The only place that ever seems to clear the flag is the PPC mmu_helper code in a response to a particular TLB operations. Should that code instead be doing page_set_flags(PAGE_RESET)? #define PAGE_VALID 0x0008 /* * Original state of the write flag (used when tracking self-modifying code) */ #define PAGE_WRITE_ORG 0x0010 /* * Invalidate the TLB entry immediately, helpful for s390x * Low-Address-Protection. Used with PAGE_WRITE in tlb_set_page_with_attrs() */ #define PAGE_WRITE_INV 0x0020 /* For use with page_set_flags: page is being replaced; target_data cleared. */ #define PAGE_RESET 0x0040 /* For linux-user, indicates that the page is MAP_ANON. */ #define PAGE_ANON 0x0080 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) /* FIXME: Code that sets/uses this is broken and needs to go away. */ #define PAGE_RESERVED 0x0100 #endif /* Target-specific bits that will be used via page_get_flags(). */ #define PAGE_TARGET_1 0x0200 #define PAGE_TARGET_2 0x0400 /* * For linux-user, indicates that the page is mapped with the same semantics * in both guest and host. */ #define PAGE_PASSTHROUGH 0x0800 Anyway that confusion aside: Reviewed-by: Alex Bennée <alex.ben...@linaro.org> -- Alex Bennée