From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1STHQX-0002NQ-Tw for qemu-devel@nongnu.org; Sat, 12 May 2012 14:52:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1STHQV-0007gf-Je for qemu-devel@nongnu.org; Sat, 12 May 2012 14:52:25 -0400 Received: from mail-qc0-f173.google.com ([209.85.216.173]:58268) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1STHQV-0007gW-Cf for qemu-devel@nongnu.org; Sat, 12 May 2012 14:52:23 -0400 Received: by qcsc20 with SMTP id c20so3031907qcs.4 for ; Sat, 12 May 2012 11:52:21 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: From: Artyom Tarasenko Date: Sat, 12 May 2012 20:52:00 +0200 Message-ID: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 1.1] sparc64: fix initrd loading List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Blue Swirl Cc: qemu-devel This was an annoying bug, thanks for fixing it! Tested-by: Artyom Tarasenko On Sat, May 12, 2012 at 7:30 PM, Blue Swirl wrote: > Initrd load address is too low, it conflicts with kernel load > address: > rom: requested regions overlap (rom phdr #0: > /tmp/vmlinux-debian-6.0.4-sparc64. free=3D0x0000000000742519, > addr=3D0x0000000000400000) > rom loading failed > > Fix by making the initrd address variable, load initrd after kernel > image. Use 64 bit variables instead of longs or 32 bit types. > > Signed-off-by: Blue Swirl > --- > =A0hw/sun4u.c | =A0 56 +++++++++++++++++++++++++++++++++-----------------= ------ > =A01 file changed, 33 insertions(+), 23 deletions(-) > > diff --git a/hw/sun4u.c b/hw/sun4u.c > index fe33138..517bdb8 100644 > --- a/hw/sun4u.c > +++ b/hw/sun4u.c > @@ -67,7 +67,6 @@ > > =A0#define KERNEL_LOAD_ADDR =A0 =A0 0x00404000 > =A0#define CMDLINE_ADDR =A0 =A0 =A0 =A0 0x003ff000 > -#define INITRD_LOAD_ADDR =A0 =A0 0x00300000 > =A0#define PROM_SIZE_MAX =A0 =A0 =A0 =A0(4 * 1024 * 1024) > =A0#define PROM_VADDR =A0 =A0 =A0 =A0 =A0 0x000ffd00000ULL > =A0#define APB_SPECIAL_BASE =A0 =A0 0x1fe00000000ULL > @@ -181,14 +180,18 @@ static int sun4u_NVRAM_set_params(M48t59State > *nvram, uint16_t NVRAM_size, > > =A0 =A0 return 0; > =A0} > -static unsigned long sun4u_load_kernel(const char *kernel_filename, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 const char *initrd_filename, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 ram_addr_t RAM_size, long *initrd_size) > + > +static uint64_t sun4u_load_kernel(const char *kernel_filename, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0cons= t char *initrd_filename, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ram_= addr_t RAM_size, uint64_t *initrd_size, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint= 64_t *initrd_addr, uint64_t *kernel_addr, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0uint= 64_t *kernel_entry) > =A0{ > =A0 =A0 int linux_boot; > =A0 =A0 unsigned int i; > =A0 =A0 long kernel_size; > =A0 =A0 uint8_t *ptr; > + =A0 =A0uint64_t kernel_top; > > =A0 =A0 linux_boot =3D (kernel_filename !=3D NULL); > > @@ -201,29 +204,34 @@ static unsigned long sun4u_load_kernel(const > char *kernel_filename, > =A0#else > =A0 =A0 =A0 =A0 bswap_needed =3D 0; > =A0#endif > - =A0 =A0 =A0 =A0kernel_size =3D load_elf(kernel_filename, NULL, NULL, NU= LL, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 NULL, NULL,= 1, ELF_MACHINE, 0); > - =A0 =A0 =A0 =A0if (kernel_size < 0) > + =A0 =A0 =A0 =A0kernel_size =3D load_elf(kernel_filename, NULL, NULL, ke= rnel_entry, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 kernel_addr= , &kernel_top, 1, ELF_MACHINE, 0); > + =A0 =A0 =A0 =A0if (kernel_size < 0) { > + =A0 =A0 =A0 =A0 =A0 =A0*kernel_addr =3D KERNEL_LOAD_ADDR; > + =A0 =A0 =A0 =A0 =A0 =A0*kernel_entry =3D KERNEL_LOAD_ADDR; > =A0 =A0 =A0 =A0 =A0 =A0 kernel_size =3D load_aout(kernel_filename, KERNEL= _LOAD_ADDR, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 R= AM_size - KERNEL_LOAD_ADDR, bswap_needed, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 T= ARGET_PAGE_SIZE); > - =A0 =A0 =A0 =A0if (kernel_size < 0) > + =A0 =A0 =A0 =A0} > + =A0 =A0 =A0 =A0if (kernel_size < 0) { > =A0 =A0 =A0 =A0 =A0 =A0 kernel_size =3D load_image_targphys(kernel_filena= me, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 KERNEL_LOAD_ADDR, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 RAM_size - KERNEL_LOAD_ADDR); > + =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 if (kernel_size < 0) { > =A0 =A0 =A0 =A0 =A0 =A0 fprintf(stderr, "qemu: could not load kernel '%s'= \n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 kernel_filename); > =A0 =A0 =A0 =A0 =A0 =A0 exit(1); > =A0 =A0 =A0 =A0 } > - > - =A0 =A0 =A0 =A0/* load initrd */ > + =A0 =A0 =A0 =A0/* load initrd above kernel */ > =A0 =A0 =A0 =A0 *initrd_size =3D 0; > =A0 =A0 =A0 =A0 if (initrd_filename) { > + =A0 =A0 =A0 =A0 =A0 =A0*initrd_addr =3D TARGET_PAGE_ALIGN(kernel_top); > + > =A0 =A0 =A0 =A0 =A0 =A0 *initrd_size =3D load_image_targphys(initrd_filen= ame, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 INITRD_LOAD_ADDR, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 RAM_size - INITRD_LOAD_ADDR); > - =A0 =A0 =A0 =A0 =A0 =A0if (*initrd_size < 0) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 *initrd_addr, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 RAM_size - *initrd_addr); > + =A0 =A0 =A0 =A0 =A0 =A0if ((int)*initrd_size < 0) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 fprintf(stderr, "qemu: could not load ini= tial ram disk '%s'\n", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 initrd_filename); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 exit(1); > @@ -231,9 +239,9 @@ static unsigned long sun4u_load_kernel(const char > *kernel_filename, > =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 if (*initrd_size > 0) { > =A0 =A0 =A0 =A0 =A0 =A0 for (i =3D 0; i < 64 * TARGET_PAGE_SIZE; i +=3D T= ARGET_PAGE_SIZE) { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ptr =3D rom_ptr(KERNEL_LOAD_ADDR + i); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ptr =3D rom_ptr(*kernel_addr + i); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ldl_p(ptr + 8) =3D=3D 0x48647253) { /= * HdrS */ > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0stl_p(ptr + 24, INITRD_LOAD_ADDR= + > KERNEL_LOAD_ADDR - 0x4000); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0stl_p(ptr + 24, *initrd_addr + *= kernel_addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 stl_p(ptr + 28, *initrd_size); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > @@ -788,7 +796,7 @@ static void sun4uv_init(MemoryRegion *address_space_m= em, > =A0 =A0 CPUSPARCState *env; > =A0 =A0 M48t59State *nvram; > =A0 =A0 unsigned int i; > - =A0 =A0long initrd_size, kernel_size; > + =A0 =A0uint64_t initrd_addr, initrd_size, kernel_addr, kernel_size, ker= nel_entry; > =A0 =A0 PCIBus *pci_bus, *pci_bus2, *pci_bus3; > =A0 =A0 ISABus *isa_bus; > =A0 =A0 qemu_irq *ivec_irqs, *pbm_irqs; > @@ -845,13 +853,15 @@ static void sun4uv_init(MemoryRegion *address_space= _mem, > =A0 =A0 nvram =3D m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59); > > =A0 =A0 initrd_size =3D 0; > + =A0 =A0initrd_addr =3D 0; > =A0 =A0 kernel_size =3D sun4u_load_kernel(kernel_filename, initrd_filenam= e, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= ram_size, &initrd_size); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= ram_size, &initrd_size, &initrd_addr, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= &kernel_addr, &kernel_entry); > > =A0 =A0 sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", RAM_size, boot= _devices, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 KERNEL_LOAD_ADDR, k= ernel_size, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 kernel_addr, kernel= _size, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0kernel_cmdline, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 INITRD_LOAD_ADDR, i= nitrd_size, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 initrd_addr, initrd= _size, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* XXX: need an op= tion to load a NVRAM image */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A00, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0graphic_width, gra= phic_height, graphic_depth, > @@ -861,8 +871,8 @@ static void sun4uv_init(MemoryRegion *address_space_m= em, > =A0 =A0 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1); > =A0 =A0 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); > =A0 =A0 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id); > - =A0 =A0fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR); > - =A0 =A0fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size); > + =A0 =A0fw_cfg_add_i64(fw_cfg, FW_CFG_KERNEL_ADDR, kernel_entry); > + =A0 =A0fw_cfg_add_i64(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size); > =A0 =A0 if (kernel_cmdline) { > =A0 =A0 =A0 =A0 fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0strlen(kernel_cmdline) + 1= ); > @@ -872,8 +882,8 @@ static void sun4uv_init(MemoryRegion *address_space_m= em, > =A0 =A0 } else { > =A0 =A0 =A0 =A0 fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, 0); > =A0 =A0 } > - =A0 =A0fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR); > - =A0 =A0fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size); > + =A0 =A0fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr); > + =A0 =A0fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size); > =A0 =A0 fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_devices[0]); > > =A0 =A0 fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_WIDTH, graphic_width); > -- > 1.7.10 --=20 Regards, Artyom Tarasenko solaris/sparc under qemu blog: http://tyom.blogspot.com/search/label/qemu