[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Loading boot image retrieved from CD-ROM
From: |
Bean |
Subject: |
Re: Loading boot image retrieved from CD-ROM |
Date: |
Sun, 24 Jun 2007 12:51:35 +0800 |
User-agent: |
Mutt/1.5.13 (2006-08-11) |
On Sun, Jun 24, 2007 at 12:31:14AM -0400, Alex Roman wrote:
> Hello,
>
> As you may recall, I'm working on the Google Summer of Code project to
> enable GRUB2 to boot off CDs.
>
> I can now read boot images from CDs using int 13h BIOS calls :) And
> I've confirmed I'm actually reading the ISOLINUX image because I can
> perform some manual disassembly and it matches what I see in the
> ISOLINUX source code :)
>
> The problem is now booting them. From what I've gathered from the
> specs, I'm supposed to load the bootable image at address 0x7c00,
> clear the segments (-code segment) and perform a long jump (to set the
> code segment) at address 0x7c00 using segment 0x7c0 and offset 0x0.
>
> Now, I can't read the bootable image directly at 0x7c00, so what I do
> is I read it in GRUB_MEMORY_MACHINE_SCRATCH_ADDR + a small offset I
> use for some structures. Then I have a function in startup.S which
> will copy from that address, into 0x7c00 and then start executing the
> image.
>
> The problem is that QEMU freezes when I call the asm function. Was
> wondering if anyone could take a quick look at the function to see if
> I'm doing anything wrong, or if someone could suggest how to best
> debug this issue...
>
> Thanks in advance!
>
> Here is the function:
>
> --start--
> /*
> * void grub_eltorito_boot (int drive, void *buf, int size)
> *
> * This starts an eltorito boot image from 0:7c00h
> */
>
> FUNCTION(grub_eltorito_boot)
> pushl %eax
> pushl %edx
> pushl %ecx
>
> call EXT_C(grub_dl_unload_all)
>
> /* set up to pass boot drive */
> popl %edx
>
> /* address in %ebx */
> popl %ebx
>
> /* count in %ecx */
> popl %ecx
>
> /* must move image to 0x07c0:0 */
> movw $0x07c0, %ax
> movw %ax, %es
> xorw %ax, %ax
> movw %ax, %di
>
> pushl %ebx
>
> /* offset to move from in %si */
> andw $0xf, %bx
> movw %bx, %si
>
> /* segment to move from in %ds */
> popl %ebx
> shrl $4, %ebx
> movw %bx, %ds
>
> /* move image */
> rep
> movsb
>
>
> /* Turn off Gate A20 */
> xorl %eax, %eax
> call EXT_C(grub_gate_a20)
>
> call prot_to_real
> .code16
> xorw %ax, %ax
> movw %ax, %ds
> movw %ax, %es
> movw %ax, %fs
> movw %ax, %gs
> movw %ax, %ss
> ljmp $0x07c0,$0
> .code32
> --end--
Maybe the image overwrites code in statrt.S after it's copied to 0x7c00. To
verify, you can print the address of function like grub_eltorito_boot,
grub_gate_a20 and prot_to_real, see if they're within range of 0x7c00 to
0x7c00 + image length.
--
Bean <address@hidden>