mirror of
https://github.com/ipxe/ipxe
synced 2025-12-15 09:04:37 +03:00
[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:
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user