[fdtmem] Record size of accessible physical address space

The size of accessible physical address space will be required for the
runtime memory map, not just at relocation time.  Make this size an
additional parameter to fdt_register() (matching the prototype for
fdt_relocate()), and record the value for future reference.

Note that we cannot simply store the limit in fdt_relocate() since it
is called before .data is writable and before .bss is zeroed.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-05-14 22:09:51 +01:00
parent 64ad1d03c3
commit e0c4cfa81e
3 changed files with 10 additions and 2 deletions

View File

@@ -1088,6 +1088,7 @@ install:
/* Copy and register system device tree */
phys_to_virt a0, s1
mv a1, s4
call fdtmem_register
/* Return to a virtual address in the relocated copy */

View File

@@ -66,6 +66,9 @@ struct fdtmem_region {
/** Region is usable as RAM */
#define FDTMEM_RAM 0x0001
/** Size of accessible physical address space (or zero for no limit) */
static size_t fdtmem_limit;
/**
* Update memory region descriptor
*
@@ -360,13 +363,17 @@ physaddr_t fdtmem_relocate ( struct fdt_header *hdr, size_t limit ) {
* Copy and register system device tree
*
* @v hdr FDT header
* @v limit Size of accessible physical address space (or zero)
* @ret rc Return status code
*/
int fdtmem_register ( struct fdt_header *hdr ) {
int fdtmem_register ( struct fdt_header *hdr, size_t limit ) {
struct fdt_header *copy;
struct fdt fdt;
int rc;
/* Record size of accessible physical address space */
fdtmem_limit = limit;
/* Parse FDT to obtain length */
if ( ( rc = fdt_parse ( &fdt, hdr, -1UL ) ) != 0 ) {
DBGC ( colour, "FDTMEM could not parse FDT: %s\n",

View File

@@ -13,6 +13,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/fdt.h>
extern physaddr_t fdtmem_relocate ( struct fdt_header *hdr, size_t limit );
extern int fdtmem_register ( struct fdt_header *hdr );
extern int fdtmem_register ( struct fdt_header *hdr, size_t limit );
#endif /* _IPXE_FDTMEM_H */