From: Michael Brown Date: Wed, 14 May 2025 21:09:51 +0000 (+0100) Subject: [fdtmem] Record size of accessible physical address space X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0c4cfa81e7ff919f594a6aca8416536c855838d;p=thirdparty%2Fipxe.git [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 --- diff --git a/src/arch/riscv/prefix/libprefix.S b/src/arch/riscv/prefix/libprefix.S index b011616da..834a48655 100644 --- a/src/arch/riscv/prefix/libprefix.S +++ b/src/arch/riscv/prefix/libprefix.S @@ -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 */ diff --git a/src/core/fdtmem.c b/src/core/fdtmem.c index 9e8ab2406..18ae5ce96 100644 --- a/src/core/fdtmem.c +++ b/src/core/fdtmem.c @@ -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", diff --git a/src/include/ipxe/fdtmem.h b/src/include/ipxe/fdtmem.h index a5777f6a2..1bf0015b4 100644 --- a/src/include/ipxe/fdtmem.h +++ b/src/include/ipxe/fdtmem.h @@ -13,6 +13,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include 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 */