From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NM5iF-0004vi-II for qemu-devel@nongnu.org; Sat, 19 Dec 2009 15:15:39 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NM5iB-0004tw-Vx for qemu-devel@nongnu.org; Sat, 19 Dec 2009 15:15:39 -0500 Received: from [199.232.76.173] (port=51676 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NM5iB-0004tt-RE for qemu-devel@nongnu.org; Sat, 19 Dec 2009 15:15:35 -0500 Received: from mo-p00-ob.rzone.de ([81.169.146.161]:52859) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA1:24) (Exim 4.60) (envelope-from ) id 1NM5iB-00054z-Fo for qemu-devel@nongnu.org; Sat, 19 Dec 2009 15:15:35 -0500 From: Kevin Wolf Date: Sat, 19 Dec 2009 21:15:20 +0100 Message-Id: <1261253720-6790-1-git-send-email-mail@kevin-wolf.de> Subject: [Qemu-devel] [FOR 0.12][PATCH] Multiboot support: Fix rom_copy List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , aurelien@aurel32.net ROMs need to be loaded if they are anywhere in the requested area, not only at the very beginning. This fixes Multiboot with ELF kernels that have more than one program header. Signed-off-by: Kevin Wolf --- hw/loader.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/hw/loader.c b/hw/loader.c index c7d43f6..2ceb8eb 100644 --- a/hw/loader.c +++ b/hw/loader.c @@ -698,6 +698,11 @@ static Rom *find_rom(target_phys_addr_t addr) return NULL; } +/* + * Copies memory from registered ROMs to dest. Any memory that is contained in + * a ROM between addr and addr + size is copied. Note that this can involve + * multiple ROMs, which need not start at addr and need not end at addr + size. + */ int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size) { target_phys_addr_t end = addr + size; @@ -706,8 +711,6 @@ int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size) Rom *rom; QTAILQ_FOREACH(rom, &roms, next) { - if (rom->addr > addr) - continue; if (rom->addr + rom->romsize < addr) continue; if (rom->addr > end) -- 1.6.0.2