From: Bean <bean123@126.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: Loading boot image retrieved from CD-ROM
Date: Sun, 24 Jun 2007 12:51:35 +0800 [thread overview]
Message-ID: <20070624045135.GA8487@ws3.vdp.com> (raw)
In-Reply-To: <8c0c43de0706232131t48e63e45jf99963529a2f2304@mail.gmail.com>
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 <bean123@126.com>
next prev parent reply other threads:[~2007-06-24 4:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-24 4:31 Loading boot image retrieved from CD-ROM Alex Roman
2007-06-24 4:51 ` Bean [this message]
2007-06-24 5:00 ` Alex Roman
2007-06-24 5:26 ` Bean
2007-06-24 4:55 ` Alex Roman
2007-06-24 7:53 ` Vesa Jääskeläinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070624045135.GA8487@ws3.vdp.com \
--to=bean123@126.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.