[lkrn] Allow a single initrd to be passed to the booted kernel

Allow a single initrd image to be passed verbatim to the booted RISC-V
kernel, as a proof of concept.

We do not yet support reshuffling to make optimal use of available
memory, or dynamic construction of CPIO headers, but this is
sufficient to allow iPXE to start up the Fedora 42 kernel with its
matching initrd image.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-05-21 14:28:29 +01:00
parent 9bc559850c
commit 969e8b5462
2 changed files with 17 additions and 1 deletions

View File

@@ -153,8 +153,10 @@ static int lkrn_fdt ( struct image *image, struct lkrn_context *ctx ) {
int rc;
/* Build device tree (which may change system memory map) */
if ( ( rc = fdt_create ( &fdt, image->cmdline, 0, 0 ) ) != 0 )
if ( ( rc = fdt_create ( &fdt, image->cmdline, ctx->initrd,
ctx->initrd_len ) ) != 0 ) {
goto err_create;
}
len = be32_to_cpu ( fdt->totalsize );
/* Place device tree after kernel, rounded up to a page boundary */
@@ -197,6 +199,7 @@ static int lkrn_fdt ( struct image *image, struct lkrn_context *ctx ) {
*/
static int lkrn_exec ( struct image *image ) {
struct lkrn_context ctx;
struct image *initrd;
int rc;
/* Parse header */
@@ -207,6 +210,15 @@ static int lkrn_exec ( struct image *image ) {
if ( ( rc = lkrn_ram ( image, &ctx ) ) != 0 )
return rc;
/* Locate initrd image, if any */
if ( ( initrd = first_image() ) != NULL ) {
ctx.initrd = virt_to_phys ( initrd->data );
ctx.initrd_len = initrd->len;
DBGC ( image, "LKRN %s initrd %s at [%#08lx,%#08lx)\n",
image->name, initrd->name, ctx.initrd,
( ctx.initrd + ctx.initrd_len ) );
}
/* Create device tree (which may change system memory map) */
if ( ( rc = lkrn_fdt ( image, &ctx ) ) != 0 )
return rc;

View File

@@ -54,6 +54,10 @@ struct lkrn_context {
physaddr_t entry;
/** Device tree */
physaddr_t fdt;
/** Initial ramdisk (if any) */
physaddr_t initrd;
/** Length of initial ramdisk (if any) */
size_t initrd_len;
};
/** Compressed kernel image header */