All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: cota@braap.org, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: Re: [PATCH for-8.0 11/11] linux-user/arm: Take more care allocating commpage
Date: Mon, 27 Mar 2023 09:38:33 +0100	[thread overview]
Message-ID: <87zg7ysi4y.fsf@linaro.org> (raw)
In-Reply-To: <20230322150744.175010-12-richard.henderson@linaro.org>


Richard Henderson <richard.henderson@linaro.org> writes:

> User setting of -R reserved_va can lead to an assertion
> failure in page_set_flags.  Sanity check the value of
> reserved_va and print an error message instead.  Do not
> allocate a commpage at all for m-profile cpus.

I see this:

  TEST    convd on i386
qemu-i386: Unable to reserve 0x100000000 bytes of virtual address space
at 0x8000 (File exists) for use as guest address space (check your
virtual memory ulimit setting, min_mmap_addr or reserve less using -R
option)

on the ubuntu aarch64 static build:

  https://gitlab.com/stsquad/qemu/-/jobs/4003523064

>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/elfload.c | 37 +++++++++++++++++++++++++++----------
>  1 file changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index b068676340..0529430b1d 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -422,12 +422,32 @@ enum {
>  
>  static bool init_guest_commpage(void)
>  {
> -    abi_ptr commpage = HI_COMMPAGE & -qemu_host_page_size;
> -    void *want = g2h_untagged(commpage);
> -    void *addr = mmap(want, qemu_host_page_size, PROT_READ | PROT_WRITE,
> -                      MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
> +    ARMCPU *cpu = ARM_CPU(thread_cpu);
> +    abi_ptr want = HI_COMMPAGE & TARGET_PAGE_MASK;
> +    abi_ptr addr;
>  
> -    if (addr == MAP_FAILED) {
> +    /*
> +     * M-profile allocates maximum of 2GB address space, so can never
> +     * allocate the commpage.  Skip it.
> +     */
> +    if (arm_feature(&cpu->env, ARM_FEATURE_M)) {
> +        return true;
> +    }
> +
> +    /*
> +     * If reserved_va does not cover the commpage, we get an assert
> +     * in page_set_flags.  Produce an intelligent error instead.
> +     */
> +    if (reserved_va != 0 && want + TARGET_PAGE_SIZE - 1 > reserved_va) {
> +        error_report("Allocating guest commpage: -R 0x%" PRIx64 " too small",
> +                     (uint64_t)reserved_va + 1);
> +        exit(EXIT_FAILURE);
> +    }
> +
> +    addr = target_mmap(want, TARGET_PAGE_SIZE, PROT_READ | PROT_WRITE,
> +                       MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
> +
> +    if (addr == -1) {
>          perror("Allocating guest commpage");
>          exit(EXIT_FAILURE);
>      }
> @@ -436,15 +456,12 @@ static bool init_guest_commpage(void)
>      }
>  
>      /* Set kernel helper versions; rest of page is 0.  */
> -    __put_user(5, (uint32_t *)g2h_untagged(0xffff0ffcu));
> +    put_user_u32(5, 0xffff0ffcu);
>  
> -    if (mprotect(addr, qemu_host_page_size, PROT_READ)) {
> +    if (target_mprotect(addr, qemu_host_page_size, PROT_READ | PROT_EXEC)) {
>          perror("Protecting guest commpage");
>          exit(EXIT_FAILURE);
>      }
> -
> -    page_set_flags(commpage, commpage | ~qemu_host_page_mask,
> -                   PAGE_READ | PAGE_EXEC | PAGE_VALID);
>      return true;
>  }


-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


  reply	other threads:[~2023-03-27  8:40 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-22 15:07 [PATCH for-8.0 00/11] tcg patch queue Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 01/11] util: import GTree as QTree Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 02/11] tcg: use QTree instead of GTree Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 03/11] linux-user: Diagnose misaligned -R size Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 04/11] include/exec: Change reserved_va semantics to last byte Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 05/11] accel/tcg: Pass last not end to page_set_flags Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 06/11] accel/tcg: Pass last not end to page_reset_target_data Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 07/11] accel/tcg: Pass last not end to PAGE_FOR_EACH_TB Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 08/11] accel/tcg: Pass last not end to page_collection_lock Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 09/11] accel/tcg: Pass last not end to tb_invalidate_phys_page_range__locked Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 10/11] accel/tcg: Pass last not end to tb_invalidate_phys_range Richard Henderson
2023-03-22 15:07 ` [PATCH for-8.0 11/11] linux-user/arm: Take more care allocating commpage Richard Henderson
2023-03-27  8:38   ` Alex Bennée [this message]
2023-03-27 12:47     ` Philippe Mathieu-Daudé
2023-03-27 17:36     ` Richard Henderson
2023-03-27 19:27       ` Richard Henderson
2023-03-27 19:42       ` Alex Bennée
2023-03-26  4:51 ` [PATCH for-8.0 00/11] tcg patch queue Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zg7ysi4y.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=cota@braap.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.