semihosting/arm-compat-semi.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
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 has access to the same symbols in run time to make a
determination of the location of the heap.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Andrew <astrauss11@gmail.com>
---
semihosting/arm-compat-semi.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
index 1c29146dcf..041b4f6c04 100644
--- a/semihosting/arm-compat-semi.c
+++ b/semihosting/arm-compat-semi.c
@@ -1165,12 +1165,10 @@ target_ulong do_common_semihosting(CPUState *cs)
case TARGET_SYS_HEAPINFO:
{
target_ulong retvals[4];
- target_ulong limit;
int i;
#ifdef CONFIG_USER_ONLY
+ target_ulong limit;
TaskState *ts = cs->opaque;
-#else
- target_ulong rambase = common_semi_rambase(cs);
#endif
GET_ARG(0);
@@ -1201,12 +1199,15 @@ target_ulong do_common_semihosting(CPUState *cs)
retvals[2] = ts->stack_base;
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 */
- retvals[3] = rambase; /* Stack limit. */
+ /*
+ * 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] = 0; /* Heap Limit */
+ retvals[2] = 0; /* Stack base */
+ retvals[3] = 0; /* Stack limit. */
#endif
for (i = 0; i < ARRAY_SIZE(retvals); i++) {
--
2.20.1
On Tue, 1 Jun 2021 at 10:12, 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 has access to the same symbols in run time to make a > determination of the location of the heap. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Cc: Andrew <astrauss11@gmail.com> > --- > semihosting/arm-compat-semi.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) This seems like a pretty good candidate for breaking existing working binaries. How much testing against different varieties of guest-code-using-semihosting have you done ? thanks -- PMM
Peter Maydell <peter.maydell@linaro.org> writes: > On Tue, 1 Jun 2021 at 10:12, 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 has access to the same symbols in run time to make a >> determination of the location of the heap. >> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> >> Cc: Andrew <astrauss11@gmail.com> >> --- >> semihosting/arm-compat-semi.c | 19 ++++++++++--------- >> 1 file changed, 10 insertions(+), 9 deletions(-) > > This seems like a pretty good candidate for breaking existing > working binaries. How much testing against different varieties of > guest-code-using-semihosting have you done ? None, which is why it's an RFC - but at least one user reported newlib attempts to use the numbers we gave it rather than falling back to numbers it knew from the build and getting it wrong. I suspect any code that doesn't have a fallback path is getting it right more by luck than judgement though. I'd be curious to hear of code that relies on the numbers it gets from QEMU. > > thanks > -- PMM -- Alex Bennée
On Tue, 1 Jun 2021 at 11:07, Alex Bennée <alex.bennee@linaro.org> wrote: > > > Peter Maydell <peter.maydell@linaro.org> writes: > > > On Tue, 1 Jun 2021 at 10:12, 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 has access to the same symbols in run time to make a > >> determination of the location of the heap. > >> > >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > >> Cc: Andrew <astrauss11@gmail.com> > >> --- > >> semihosting/arm-compat-semi.c | 19 ++++++++++--------- > >> 1 file changed, 10 insertions(+), 9 deletions(-) > > > > This seems like a pretty good candidate for breaking existing > > working binaries. How much testing against different varieties of > > guest-code-using-semihosting have you done ? > > None, which is why it's an RFC - but at least one user reported newlib > attempts to use the numbers we gave it rather than falling back to > numbers it knew from the build and getting it wrong. I suspect any code > that doesn't have a fallback path is getting it right more by luck than > judgement though. I'd be curious to hear of code that relies on the > numbers it gets from QEMU. Well, newlib is the main one I had in mind -- does it have a fallback codepath? -- PMM
Yeah, newlib falls back to using the symbols __stack and end to figure out where to start the stack and heap if 0 is returned by SYS_HEAPINFO. -- Andrew Strauss On Tue, Jun 1, 2021 at 6:31 AM Peter Maydell <peter.maydell@linaro.org> wrote: > On Tue, 1 Jun 2021 at 11:07, Alex Bennée <alex.bennee@linaro.org> wrote: > > > > > > Peter Maydell <peter.maydell@linaro.org> writes: > > > > > On Tue, 1 Jun 2021 at 10:12, 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 has access to the same symbols in run time to make a > > >> determination of the location of the heap. > > >> > > >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > > >> Cc: Andrew <astrauss11@gmail.com> > > >> --- > > >> semihosting/arm-compat-semi.c | 19 ++++++++++--------- > > >> 1 file changed, 10 insertions(+), 9 deletions(-) > > > > > > This seems like a pretty good candidate for breaking existing > > > working binaries. How much testing against different varieties of > > > guest-code-using-semihosting have you done ? > > > > None, which is why it's an RFC - but at least one user reported newlib > > attempts to use the numbers we gave it rather than falling back to > > numbers it knew from the build and getting it wrong. I suspect any code > > that doesn't have a fallback path is getting it right more by luck than > > judgement though. I'd be curious to hear of code that relies on the > > numbers it gets from QEMU. > > Well, newlib is the main one I had in mind -- does it have a fallback > codepath? > > -- PMM >
Tested-by: Andrew Strauss <astrauss11@gmail.com>
Reviewed-by: Andrew Strauss <astrauss11@gmail.com>
On Tue, Jun 1, 2021 at 5:07 AM 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 has access to the same symbols in run time to make a
> determination of the location of the heap.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Cc: Andrew <astrauss11@gmail.com>
> ---
> semihosting/arm-compat-semi.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
> index 1c29146dcf..041b4f6c04 100644
> --- a/semihosting/arm-compat-semi.c
> +++ b/semihosting/arm-compat-semi.c
> @@ -1165,12 +1165,10 @@ target_ulong do_common_semihosting(CPUState *cs)
> case TARGET_SYS_HEAPINFO:
> {
> target_ulong retvals[4];
> - target_ulong limit;
> int i;
> #ifdef CONFIG_USER_ONLY
> + target_ulong limit;
> TaskState *ts = cs->opaque;
> -#else
> - target_ulong rambase = common_semi_rambase(cs);
> #endif
>
> GET_ARG(0);
> @@ -1201,12 +1199,15 @@ target_ulong do_common_semihosting(CPUState *cs)
> retvals[2] = ts->stack_base;
> 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 */
> - retvals[3] = rambase; /* Stack limit. */
> + /*
> + * 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] = 0; /* Heap Limit */
> + retvals[2] = 0; /* Stack base */
> + retvals[3] = 0; /* Stack limit. */
> #endif
>
> for (i = 0; i < ARRAY_SIZE(retvals); i++) {
> --
> 2.20.1
>
>
© 2016 - 2026 Red Hat, Inc.