[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bugs #9984] Run DiskEMU1x.bin from Grub

From: anonymous
Subject: [bugs #9984] Run DiskEMU1x.bin from Grub
Date: Mon, 17 Jan 2005 14:52:24 +0000
User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

This is an automated notification sent by Savannah.
It relates to:
                bugs #9984, project GNU GRUB

 OVERVIEW of bugs #9984:


                 Summary: Run DiskEMU1x.bin from Grub
                 Project: GNU GRUB
            Submitted by: f22_storm
            Submitted on: Wed 08/11/04 at 21:15
                Category: Booting
                Severity: Major
                Priority: 5 - Normal
              Item Group: None
                  Status: None
                 Privacy: Public
             Assigned to: None
         Originator Name: 
        Originator Email: address@hidden
             Open/Closed: Open
                 Release: 0.95
         Reproducibility: Every Time
         Planned Release: 


* For MultiBoot Support *

Since Grub can be loaded from CD, we may want it load some binary boot file
from system, such as DiskEMU.bin, xpboot.bin, or bootsect.dat, and so on.

Yes, here are functions for this:

1). builtins.c

static int run_func(char *arg, int flags) {

 int ret;

 unsigned long run_drv;

 struct term_entry *prev_term = current_term;


 run_drv = saved_drive;

 if(run_drv == cdrom_drive)


  if (cdrom_drive != 0xe0) 


   grub_printf("\n Please init CD-ROM 1st. \n");

   return 1;



 if (! grub_open (arg))


   grub_printf("\n incorect parameter. \n");

   return 1;



 /* Read whole file.  */

 ret = grub_read ((char *) RAW_ADDR (0x60000), -1); 



 if (current_term->shutdown) 



   current_term = term_table; /* assumption: console is first */


 gateA20 (0);

 run_jump(0x7c0, 0, run_drv);

 /* if we get back here, we should go back to what our term was before */

 current_term = prev_term;

 if (current_term->startup)

      /* if our terminal fails to initialize, fall back to console since

       * it should always work */

  if ((*current_term->startup)() == 0)

 current_term = term_table; /* we know that console is first */ 

 return 0;


static struct builtin builtin_run=





        "run FILE",

        "Run a NO-Emul Boot Sector file for CD-ROM Boot",


struct builtin *builtin_table[] =


   ... ...


   ... ...



Follow-up Comments:

Date: Wed 08/11/04 at 21:26         By: Gandalf <f22_storm>
something comments for codes in asm.S


Because Grub's stage2 lays on 0000:8000, we have to read file to 6000:0000;

In asm.S, we have 2 thing to do, one is move boot codes from 6000:0000 to
7c0:0000;  and another one is move the 1st one from Grub's body to 0000:6000,
and run it. ;-)

Date: Wed 08/11/04 at 21:21         By: Gandalf <f22_storm>
4). asm.S

/* void run_jump (segment, offset, drv_num)

 *  Jump to 0:7c00.  by Gandalf



        movl    0xc(%esp), %eax

        mov     %ax, drv_num

        pushw   %es

        pushw   %ds


        call    EXT_C(prot_to_real)


        /* copy stub to 0:6000*/

        movw    $0x6000, %di

        xorw    %ax, %ax

        push    %ax

        pop     %es

        movw    $(RUN_MAIN), %si                

        movw    $(END_OF_RUN_MAIN - RUN_MAIN), %cx


        rep     movsb           /* OK, transfer Done! */

        movw    drv_num, %dx

        mov             $(run_address_off), %di

        lcall   *(%di)          /* run 0:6000 */


        /* copy stub to 07c0:0000*/

        pushw   %dx                                             /* Boot Drv Num 

        movw    $0x0, %di

        movw    $0x7c0, %ax

        pushw   %ax

        popw    %es

        movw    $0x0, %si

        movw    $0x6000, %ax

        pushw   %ax

        popw    %ds             

        movw    $0x8000, %cx    /* only support 32kb */


        rep     movsb           /* OK, transfer Done! */

        xorw    %ax, %ax

        pushw   %ax

        popw    %ds

        popw    %dx                                             /* Boot Drv Num 

        movw    $0x7c0, %ax

        movw    %ax, (0x5002)

        xorw    %bx, %bx

        movw    %bx, (0x5000)                   /* 0x07c0:0 */

        movw    $0x5000, %di

        lcall   *(%di)  



        DATA32  call    EXT_C(real_to_prot)



        popw    %ds

        popw    %es




run_address_off:        .word   0x6000

run_address_seg:        .word   0x0000

drv_num:                .word   0x0000

Date: Wed 08/11/04 at 21:19         By: Gandalf <f22_storm>
2). shared.h

void run_jump (unsigned long segment, unsigned long offset,

              int drv_num)

     __attribute__ ((noreturn));

3). asmstub.c


run_jump (unsigned long segment, unsigned long offset,

              int drv_num)





This item URL is:

  Message sent via/by Savannah

reply via email to

[Prev in Thread] Current Thread [Next in Thread]