Message ID | 20240307164835.300412-3-gaosong@loongson.cn |
---|---|
State | New |
Headers | show |
Series | Add boot LoongArch elf kernel with FDT | expand |
On 2024/3/8 上午12:48, Song Gao wrote: > we load initrd ramdisk after kernel_high address > > Signed-off-by: Song Gao <gaosong@loongson.cn> > Message-Id: <20240301093839.663947-3-gaosong@loongson.cn> > --- > hw/loongarch/boot.c | 29 ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c > index a8a725a0a8..149deb2e01 100644 > --- a/hw/loongarch/boot.c > +++ b/hw/loongarch/boot.c > @@ -22,7 +22,8 @@ static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr) > > static int64_t load_kernel_info(struct loongarch_boot_info *info) > { > - uint64_t kernel_entry, kernel_low, kernel_high; > + uint64_t kernel_entry, kernel_low, kernel_high, initrd_size; > + ram_addr_t initrd_offset; > ssize_t kernel_size; > > kernel_size = load_elf(info->kernel_filename, NULL, > @@ -37,6 +38,32 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info) > load_elf_strerror(kernel_size)); > exit(1); > } > + > + if (info->initrd_filename) { > + initrd_size = get_image_size(info->initrd_filename); > + if (initrd_size > 0) { > + initrd_offset = ROUND_UP(kernel_high + 4 * kernel_size, 64 * KiB); > + > + if (initrd_offset + initrd_size > info->ram_size) { > + error_report("memory too small for initial ram disk '%s'", > + info->initrd_filename); > + exit(1); > + } > + > + initrd_size = load_image_targphys(info->initrd_filename, initrd_offset, > + info->ram_size - initrd_offset); > + } > + > + if (initrd_size == (target_ulong)-1) { > + error_report("could not load initial ram disk '%s'", > + info->initrd_filename); > + exit(1); > + } > + } else { > + error_report("Need initrd!"); > + exit(1); > + } > + > return kernel_entry; > } > > Reviewed-by: Bibo Mao <maobibo@loongson.cn>
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c index a8a725a0a8..149deb2e01 100644 --- a/hw/loongarch/boot.c +++ b/hw/loongarch/boot.c @@ -22,7 +22,8 @@ static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr) static int64_t load_kernel_info(struct loongarch_boot_info *info) { - uint64_t kernel_entry, kernel_low, kernel_high; + uint64_t kernel_entry, kernel_low, kernel_high, initrd_size; + ram_addr_t initrd_offset; ssize_t kernel_size; kernel_size = load_elf(info->kernel_filename, NULL, @@ -37,6 +38,32 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info) load_elf_strerror(kernel_size)); exit(1); } + + if (info->initrd_filename) { + initrd_size = get_image_size(info->initrd_filename); + if (initrd_size > 0) { + initrd_offset = ROUND_UP(kernel_high + 4 * kernel_size, 64 * KiB); + + if (initrd_offset + initrd_size > info->ram_size) { + error_report("memory too small for initial ram disk '%s'", + info->initrd_filename); + exit(1); + } + + initrd_size = load_image_targphys(info->initrd_filename, initrd_offset, + info->ram_size - initrd_offset); + } + + if (initrd_size == (target_ulong)-1) { + error_report("could not load initial ram disk '%s'", + info->initrd_filename); + exit(1); + } + } else { + error_report("Need initrd!"); + exit(1); + } + return kernel_entry; }
we load initrd ramdisk after kernel_high address Signed-off-by: Song Gao <gaosong@loongson.cn> Message-Id: <20240301093839.663947-3-gaosong@loongson.cn> --- hw/loongarch/boot.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)