semihosting/arm-compat: replace heuristic for softmmu SYS_HEAPINFO

The previous numbers were a guess at best and rather arbitrary without
taking into account anything that might be loaded. Instead of using
guesses based on the state of registers implement a new function that:

 a) scans the MemoryRegions for the largest RAM block
 b) iterates through all "ROM" blobs looking for the biggest gap

The "ROM" blobs include all code loaded via -kernel and the various
-device loader techniques.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Andrew Strauss <astrauss11@gmail.com>
Cc: Keith Packard <keithp@keithp.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20220225172021.3493923-18-alex.bennee@linaro.org>
This commit is contained in:
Alex Bennée 2022-02-25 17:20:20 +00:00
parent 04e90c1313
commit 5fc983af8b
3 changed files with 163 additions and 61 deletions

View file

@ -343,4 +343,18 @@ int rom_add_option(const char *file, int32_t bootindex);
* overflow on real hardware too. */
#define UBOOT_MAX_GUNZIP_BYTES (64 << 20)
typedef struct RomGap {
hwaddr base;
size_t size;
} RomGap;
/**
* rom_find_largest_gap_between: return largest gap between ROMs in given range
*
* Given a range of addresses, this function finds the largest
* contiguous subrange which has no ROMs loaded to it. That is,
* it finds the biggest gap which is free for use for other things.
*/
RomGap rom_find_largest_gap_between(hwaddr base, size_t size);
#endif