[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 1/4] accel/tcg: Invalidate translations when clearing PAGE
From: |
Peter Maydell |
Subject: |
Re: [PATCH v2 1/4] accel/tcg: Invalidate translations when clearing PAGE_READ |
Date: |
Fri, 5 Aug 2022 18:42:25 +0100 |
On Fri, 5 Aug 2022 at 18:33, Ilya Leoshkevich <iii@linux.ibm.com> wrote:
>
> After mprotect(addr, PROT_NONE), addr can still be executed if there
> are cached translations. Drop them.
>
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
> accel/tcg/translate-all.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
> index ef62a199c7..9318ada6b9 100644
> --- a/accel/tcg/translate-all.c
> +++ b/accel/tcg/translate-all.c
> @@ -2295,12 +2295,19 @@ void page_set_flags(target_ulong start, target_ulong
> end, int flags)
> len != 0;
> len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
> PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
> + bool write_set, read_cleared;
>
> - /* If the write protection bit is set, then we invalidate
> - the code inside. */
> - if (!(p->flags & PAGE_WRITE) &&
> - (flags & PAGE_WRITE) &&
> - p->first_tb) {
> + /*
> + * If the write protection bit is set, then we invalidate the code
> + * inside.
> + */
> + write_set = !(p->flags & PAGE_WRITE) && (flags & PAGE_WRITE);
> + /*
> + * If PAGE_READ is cleared, we also need to invalidate the code in
> + * order to force a fault when trying to run it.
> + */
> + read_cleared = (p->flags & PAGE_READ) && !(flags & PAGE_READ);
Isn't it architecture-dependent whether you need PAGE_READ
to execute code ? How about PAGE_EXEC ?
thanks
-- PMM