All of lore.kernel.org
 help / color / mirror / Atom feed
* Loading boot image retrieved from CD-ROM
@ 2007-06-24  4:31 Alex Roman
  2007-06-24  4:51 ` Bean
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alex Roman @ 2007-06-24  4:31 UTC (permalink / raw)
  To: The development of GRUB 2

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--


-- 
Alex Roman <alex.roman@gmail.com>



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2007-06-24  7:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-06-24  4:31 Loading boot image retrieved from CD-ROM Alex Roman
2007-06-24  4:51 ` Bean
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

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.