diff --git a/src/image/lkrn.c b/src/image/lkrn.c index 4f04c3ff6..15e9c0d7b 100644 --- a/src/image/lkrn.c +++ b/src/image/lkrn.c @@ -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; diff --git a/src/include/ipxe/lkrn.h b/src/include/ipxe/lkrn.h index 59aabdd4b..43daa8006 100644 --- a/src/include/ipxe/lkrn.h +++ b/src/include/ipxe/lkrn.h @@ -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 */