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

Reply via email to