diff options
| author | Stefan Hajnoczi <stefanha@redhat.com> | 2025-05-14 07:16:57 -0400 |
|---|---|---|
| committer | Stefan Hajnoczi <stefanha@redhat.com> | 2025-05-14 07:16:57 -0400 |
| commit | 864813878951b44e964eb4c012d832fd21f8cc0c (patch) | |
| tree | 21cdcc42acfd8ecad9170cbaa6671a5fb22b02fa /hw/loongarch/boot.c | |
| parent | cacb211471e3a4b4abc517bfb2aef7bde5e71eaa (diff) | |
| parent | a3d5f62254a48b7c260d5aa7bd8e8467a0bb8ea3 (diff) | |
| download | focaccia-qemu-864813878951b44e964eb4c012d832fd21f8cc0c.tar.gz focaccia-qemu-864813878951b44e964eb4c012d832fd21f8cc0c.zip | |
Merge tag 'pull-loongarch-20250514' of https://github.com/gaosong715/qemu into staging
pull-loongarch-20250514 # -----BEGIN PGP SIGNATURE----- # # iLMEAAEKAB0WIQS4/x2g0v3LLaCcbCxAov/yOSY+3wUCaCRNgwAKCRBAov/yOSY+ # 343NBACeXLcXkNfPDRsuYC/Z0iYrMO8HuQ6VAcN1f4H+qP6Uo7ywb13GpJTLmewD # iYmD93qVZBAglSUWhaVzBZbAjGFzZSDLcO0bmfsMvmUaIJfIZkJqRG01shk9iMMR # zDLEax9udJdhJxBPCINNonXHds4vYKasjUureKd1SJidiBKG4w== # =wdkQ # -----END PGP SIGNATURE----- # gpg: Signature made Wed 14 May 2025 04:00:03 EDT # gpg: using RSA key B8FF1DA0D2FDCB2DA09C6C2C40A2FFF239263EDF # gpg: Good signature from "Song Gao <m17746591750@163.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: B8FF 1DA0 D2FD CB2D A09C 6C2C 40A2 FFF2 3926 3EDF * tag 'pull-loongarch-20250514' of https://github.com/gaosong715/qemu: hw/loongarch/boot: Adjust the loading position of the initrd hw/intc/loongarch_pch: Merge three memory region into one hw/intc/loongarch_pch: Set flexible memory access size with iomem region hw/intc/loongarch_pch: Rename memory region iomem32_low with iomem hw/intc/loongarch_pch: Use unified trace event for memory region ops hw/intc/loongarch_pch: Use generic write callback for iomem8 region hw/intc/loongarch_pch: Use generic write callback for iomem32_high region hw/intc/loongarch_pch: Use generic write callback for iomem32_low region hw/intc/loongarch_pch: Use generic read callback for iomem8 region hw/intc/loongarch_pch: Use generic read callback for iomem32_high region hw/intc/loongarch_pch: Use generic read callback for iomem32_low region hw/intc/loongarch_pch: Discard write operation with ISR register hw/intc/loongarch_pch: Use relative address in MemoryRegionOps hw/intc/loongarch_pch: Set version information at initial stage hw/intc/loongarch_pch: Remove some duplicate macro hw/intc/loongarch_pch: Modify register name PCH_PIC_xxx_OFFSET with PCH_PIC_xxx hw/intc/loongarch_pch: Modify name of some registers Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw/loongarch/boot.c')
| -rw-r--r-- | hw/loongarch/boot.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c index 0324d6adcb..9b6292eaa1 100644 --- a/hw/loongarch/boot.c +++ b/hw/loongarch/boot.c @@ -235,6 +235,45 @@ static int64_t load_loongarch_linux_image(const char *filename, return size; } +static ram_addr_t alloc_initrd_memory(struct loongarch_boot_info *info, + uint64_t advice_start, ssize_t rd_size) +{ + hwaddr base, ram_size, gap, low_end; + ram_addr_t initrd_end, initrd_start; + + base = VIRT_LOWMEM_BASE; + gap = VIRT_LOWMEM_SIZE; + initrd_start = advice_start; + initrd_end = initrd_start + rd_size; + + ram_size = info->ram_size; + low_end = base + MIN(ram_size, gap); + if (initrd_end <= low_end) { + return initrd_start; + } + + if (ram_size <= gap) { + error_report("The low memory too small for initial ram disk '%s'," + "You need to expand the ram", + info->initrd_filename); + exit(1); + } + + /* + * Try to load initrd in the high memory + */ + ram_size -= gap; + initrd_start = VIRT_HIGHMEM_BASE; + if (rd_size <= ram_size) { + return initrd_start; + } + + error_report("The high memory too small for initial ram disk '%s'," + "You need to expand the ram", + info->initrd_filename); + exit(1); +} + static int64_t load_kernel_info(struct loongarch_boot_info *info) { uint64_t kernel_entry, kernel_low, kernel_high; @@ -263,15 +302,10 @@ static int64_t load_kernel_info(struct loongarch_boot_info *info) 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); + initrd_offset = alloc_initrd_memory(info, initrd_offset, + initrd_size); + initrd_size = load_image_targphys(info->initrd_filename, + initrd_offset, initrd_size); } if (initrd_size == (target_ulong)-1) { |