qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm <qemu-arm@nongnu.org>,
	Andrew Strauss <astrauss11@gmail.com>,
	QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [PATCH v2] semihosting/arm-compat: remove heuristic softmmu SYS_HEAPINFO
Date: Thu, 10 Jun 2021 15:12:21 +0100	[thread overview]
Message-ID: <87im2liz4x.fsf@linaro.org> (raw)
In-Reply-To: <CAFEAcA9yhRS_=zr+76HdDN=iYU=ghDjLPfSaFUA9fzmJ5p3vCA@mail.gmail.com>


Peter Maydell <peter.maydell@linaro.org> writes:

> On Thu, 10 Jun 2021 at 11:26, Alex Bennée <alex.bennee@linaro.org> wrote:
>>
>> The previous numbers were a guess at best. While we could extract the
>> information from a loaded ELF file via -kernel we could still get
>> tripped up by self decompressing or relocating code. Besides sane
>> library code like newlib will fall back to known symbols to determine
>> of the location of the heap. We can still report the limits though as
>> we are reasonably confident that busting out of RAM would be a bad
>> thing for either stack or heap.
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Tested-by: Andrew Strauss <astrauss11@gmail.com>
>> Reviewed-by: Andrew Strauss <astrauss11@gmail.com>
>> Message-Id: <20210601090715.22330-1-alex.bennee@linaro.org>
>>
>> ---
>> v2
>>   - report some known information (limits)
>>   - reword the commit message
>> ---
>>  semihosting/arm-compat-semi.c | 12 ++++++++----
>>  1 file changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
>> index 1c29146dcf..8873486e8c 100644
>> --- a/semihosting/arm-compat-semi.c
>> +++ b/semihosting/arm-compat-semi.c
>> @@ -1202,10 +1202,14 @@ target_ulong do_common_semihosting(CPUState *cs)
>>              retvals[3] = 0; /* Stack limit.  */
>>  #else
>>              limit = current_machine->ram_size;
>> -            /* TODO: Make this use the limit of the loaded application.  */
>> -            retvals[0] = rambase + limit / 2;
>> -            retvals[1] = rambase + limit;
>> -            retvals[2] = rambase + limit; /* Stack base */
>> +            /*
>> +             * Reporting 0 indicates we couldn't calculate the real
>> +             * values which should force most software to fall back to
>> +             * using information it has.
>> +             */
>> +            retvals[0] = 0; /* Heap Base */
>> +            retvals[1] = rambase + limit; /* Heap Limit */
>> +            retvals[2] = 0; /* Stack base */
>>              retvals[3] = rambase; /* Stack limit.  */
>>  #endif
>
> I'm told that the Arm C compiler C library always assumes that
> the "stack base" value is what it should set SP to, so reporting 0
> for that will break binaries that were built with it.
>
> As the TODO comment notes, the "heap base" is a bit of a guess,
> but putting stackbase at top-of-RAM seems generally sensible.
>
> What bug are we trying to fix here?

Having newlib use a value that's wrong and therefor plant it's heap in
the middle of the loaded code.

> I think one possible implementation that might not be too
> hard to make work would be:
>
>  (1) find the guest physical address of the main machine
>      RAM (machine->ram). You can do this with flatview_for_each_range()
>      similar to what rom_ptr_for_as() does. (It might be mapped
>      more than once, we could just pick the first one.)

Currently this is done by common_semi_find_region_base which pokes
around get_system_memory()->subregions to find a region containing an
initialised register pointer.

>  (2) find the largest contiguous extent of that RAM which
>      is not covered by a ROM blob, by iterating through the
>      ROM blob data. (This sounds like one of those slightly
>      irritating but entirely tractable algorithms questions :-))

Does that assume that any rom blob (so anything from -kernel, -pflash or
-generic-loader?) will have also included space for guest data and bss?

>  (3) report the lowest address of that extent as the heap base
>      and the stack limit, and the highest address as the heap
>      limit and the stack base.
>
> This would work for all guest architectures and remove the need
> for that Arm-specific code...
>
> -- PMM


-- 
Alex Bennée


  reply	other threads:[~2021-06-10 14:17 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-10 10:26 [PATCH v2] semihosting/arm-compat: remove heuristic softmmu SYS_HEAPINFO Alex Bennée
2021-06-10 10:57 ` Peter Maydell
2021-06-10 13:55   ` Alex Bennée
2021-06-10 12:32 ` Peter Maydell
2021-06-10 14:12   ` Alex Bennée [this message]
2021-06-10 14:25     ` Peter Maydell
2021-06-11 17:01       ` Alex Bennée
2021-06-13 14:58         ` Peter Maydell

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=87im2liz4x.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=astrauss11@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).