Re: [Qemu-devel] [PATCH] multiboot: Fix module loading and setting of mmap
Adam Lackorzynski wrote: Hi, I need to following to fix multiboot booting for me. Should linuxboot.bin and multiboot.bin end up in pc-bios instead of pc-bios/optionrom? Signed-off-by: Adam Lackorzynski a...@os.inf.tu-dresden.de --- hw/pc.c |4 ++-- pc-bios/optionrom/multiboot.S |5 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 7c791c4..1c8f95c 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -661,7 +661,7 @@ static int load_multiboot(void *fw_cfg, /* append module data at the end of last module */ mb_kernel_data = qemu_realloc(mb_kernel_data, - mh_load_addr - mb_mod_end); + mb_mod_end - mh_load_addr); Right. I wonder why it worked for me before? load_image(initrd_filename, mb_kernel_data + mb_mod_start - mh_load_addr); @@ -720,7 +720,7 @@ static int load_multiboot(void *fw_cfg, fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data, sizeof(bootinfo)); -option_rom[nb_option_roms] = multiboot.bin; +option_rom[nb_option_roms] = optionrom/multiboot.bin; This is wrong. The .bin file should be in pc-bios. It just doesn't get copied over as part of the build process, but instead relies on the committer to make sure the binary is updated on every source change. nb_option_roms++; return 1; /* yes, we are multiboot */ diff --git a/pc-bios/optionrom/multiboot.S b/pc-bios/optionrom/multiboot.S index be5c9fc..9131837 100644 --- a/pc-bios/optionrom/multiboot.S +++ b/pc-bios/optionrom/multiboot.S @@ -62,6 +62,9 @@ run_multiboot: add %eax, %ebx movl%ebx, %gs:GS_GDT_DESC + 2 + xor %eax, %eax + mov %eax, %es + Ack. %es could be in any state here. /* Read the bootinfo struct into RAM */ read_fw_blob(FW_CFG_INITRD) @@ -71,7 +74,7 @@ run_multiboot: mov %ax, %fs /* ES = mmap_addr */ - mov %eax, %fs:0x48 + mov %fs:48, %eax Right... Thanks for catching those! Alex
Re: [Qemu-devel] [PATCH] multiboot: Fix module loading and setting of mmap
Adam Lackorzynski wrote: Hi, I need to following to fix multiboot booting for me. Should linuxboot.bin and multiboot.bin end up in pc-bios instead of pc-bios/optionrom? Signed-off-by: Adam Lackorzynski a...@os.inf.tu-dresden.de --- hw/pc.c |4 ++-- pc-bios/optionrom/multiboot.S |5 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 7c791c4..1c8f95c 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -661,7 +661,7 @@ static int load_multiboot(void *fw_cfg, /* append module data at the end of last module */ mb_kernel_data = qemu_realloc(mb_kernel_data, - mh_load_addr - mb_mod_end); + mb_mod_end - mh_load_addr); That bit looks right. load_image(initrd_filename, mb_kernel_data + mb_mod_start - mh_load_addr); @@ -720,7 +720,7 @@ static int load_multiboot(void *fw_cfg, fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data, sizeof(bootinfo)); -option_rom[nb_option_roms] = multiboot.bin; +option_rom[nb_option_roms] = optionrom/multiboot.bin; nb_option_roms++; This bit doesn't. multiboot.bin gets installed in ${prefix}/share/. There is a blob shipped in pc-bios/ so if you do -L $srcdir/pc-bios it should work. However, if you did -L $objdir/pc-bios where $objdir != $srcdir, it would not work without your patch. The same is true for seabios and the other roms. Your patch would break the first two though. I'm not sure we have a great solution. return 1; /* yes, we are multiboot */ diff --git a/pc-bios/optionrom/multiboot.S b/pc-bios/optionrom/multiboot.S index be5c9fc..9131837 100644 --- a/pc-bios/optionrom/multiboot.S +++ b/pc-bios/optionrom/multiboot.S @@ -62,6 +62,9 @@ run_multiboot: add %eax, %ebx movl%ebx, %gs:GS_GDT_DESC + 2 + xor %eax, %eax + mov %eax, %es + /* Read the bootinfo struct into RAM */ read_fw_blob(FW_CFG_INITRD) @@ -71,7 +74,7 @@ run_multiboot: mov %ax, %fs /* ES = mmap_addr */ - mov %eax, %fs:0x48 + mov %fs:48, %eax shr $4, %eax mov %ax, %es This bit needs to be reviewed/acked by Alex. Regards, Anthony Liguori
Re: [Qemu-devel] [PATCH] multiboot: Fix module loading and setting of mmap
On Wed Nov 18, 2009 at 15:33:10 +0100, Alexander Graf wrote: Adam Lackorzynski wrote: I need to following to fix multiboot booting for me. Should linuxboot.bin and multiboot.bin end up in pc-bios instead of pc-bios/optionrom? load_image(initrd_filename, mb_kernel_data + mb_mod_start - mh_load_addr); @@ -720,7 +720,7 @@ static int load_multiboot(void *fw_cfg, fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data, sizeof(bootinfo)); -option_rom[nb_option_roms] = multiboot.bin; +option_rom[nb_option_roms] = optionrom/multiboot.bin; This is wrong. The .bin file should be in pc-bios. It just doesn't get copied over as part of the build process, but instead relies on the committer to make sure the binary is updated on every source change. Ok, didn't know. Thank you both for clarifying! New patch attached. Signed-off-by: Adam Lackorzynski a...@os.inf.tu-dresden.de --- hw/pc.c |2 +- pc-bios/multiboot.bin | Bin 512 - 1024 bytes pc-bios/optionrom/multiboot.S |5 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index 7c791c4..6bcfe1b 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -661,7 +661,7 @@ static int load_multiboot(void *fw_cfg, /* append module data at the end of last module */ mb_kernel_data = qemu_realloc(mb_kernel_data, - mh_load_addr - mb_mod_end); + mb_mod_end - mh_load_addr); load_image(initrd_filename, mb_kernel_data + mb_mod_start - mh_load_addr); diff --git a/pc-bios/multiboot.bin b/pc-bios/multiboot.bin index 59737c3c6798f83c1b35534d7865c79ba9ca3bc8..d7da6e04ad6d71d26f577d9d6a019719bcce8766 100644 GIT binary patch delta 261 zcmXZVu}Z^G6vpv$F1I0cu#I9V4%gzY#MMa$cNeJ-(0mTo!A)Em=wfIHT=E32KEb6f z...@wzaa%fxELrj`k=OK!*b#{NR6lDzrSAiannbhAQS4*9nc|err{)-{caFW zkS-*`52Rlb!8dr0Vcx-T=_1W#lw+iR82s)bP(*Jwd4ZBNQf*NVi%LEaTeb=1pTyK@ z+^ns}PHl-)KRP1F^qtxdQnO1ag{ZR4?YeL3`o3c=dU$b3KcBZeG`LkZ4HHr0DDm)j sLZm;BWdvGLhU(Kng}aYiFF^Qsf$Z-!SNZpqTu*}quA%c_PYG^4_6golh($ delta 120 zcmZqRXkd{DUB#FdAZK`??3f6b8Mt#U_l$*-{u3C-RF+cFSckrZFB)jcr=au!gI z1?ls...@bcmvop_`zccfo8p3eq2v^2o|Rm1HaM%y|n*7L1b}8FeS`W7J{=3f^Ow r{ee?...@dqbgy6MgYdxBLx5e diff --git a/pc-bios/optionrom/multiboot.S b/pc-bios/optionrom/multiboot.S index be5c9fc..9131837 100644 --- a/pc-bios/optionrom/multiboot.S +++ b/pc-bios/optionrom/multiboot.S @@ -62,6 +62,9 @@ run_multiboot: add %eax, %ebx movl%ebx, %gs:GS_GDT_DESC + 2 + xor %eax, %eax + mov %eax, %es + /* Read the bootinfo struct into RAM */ read_fw_blob(FW_CFG_INITRD) @@ -71,7 +74,7 @@ run_multiboot: mov %ax, %fs /* ES = mmap_addr */ - mov %eax, %fs:0x48 + mov %fs:48, %eax shr $4, %eax mov %ax, %es -- 1.6.5.2 Adam -- Adam a...@os.inf.tu-dresden.de Lackorzynski http://os.inf.tu-dresden.de/~adam/
Re: [Qemu-devel] [PATCH] multiboot: Fix module loading and setting of mmap
Adam Lackorzynski wrote: On Wed Nov 18, 2009 at 15:33:10 +0100, Alexander Graf wrote: Adam Lackorzynski wrote: I need to following to fix multiboot booting for me. Should linuxboot.bin and multiboot.bin end up in pc-bios instead of pc-bios/optionrom? load_image(initrd_filename, mb_kernel_data + mb_mod_start - mh_load_addr); @@ -720,7 +720,7 @@ static int load_multiboot(void *fw_cfg, fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data, sizeof(bootinfo)); -option_rom[nb_option_roms] = multiboot.bin; +option_rom[nb_option_roms] = optionrom/multiboot.bin; This is wrong. The .bin file should be in pc-bios. It just doesn't get copied over as part of the build process, but instead relies on the committer to make sure the binary is updated on every source change. Ok, didn't know. Thank you both for clarifying! New patch attached. Signed-off-by: Adam Lackorzynski a...@os.inf.tu-dresden.de Acked-by: Alexander Graf ag...@suse.de Alex