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 */