iPXE
Functions
bootsector.h File Reference

x86 bootsector image format More...

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int call_bootsector (unsigned int segment, unsigned int offset, unsigned int drive)
 Jump to preloaded bootsector.

Detailed Description

x86 bootsector image format

Definition in file bootsector.h.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
int call_bootsector ( unsigned int  segment,
unsigned int  offset,
unsigned int  drive 
)

Jump to preloaded bootsector.

Parameters:
segmentReal-mode segment
offsetReal-mode offset
driveDrive number to pass to boot sector
Return values:
rcReturn status code

Definition at line 64 of file bootsector.c.

References __asm__(), bootsector_exec_fail(), console_reset(), DBG, ECANCELED, hook_bios_interrupt(), int18_vector, int19_vector, REAL_CODE, and unhook_bios_interrupt().

Referenced by int13_boot().

                                           {
        int discard_b, discard_D, discard_d;

        /* Reset console, since boot sector will probably use it */
        console_reset();

        DBG ( "Booting from boot sector at %04x:%04x\n", segment, offset );

        /* Hook INTs 18 and 19 to capture failure paths */
        hook_bios_interrupt ( 0x18, ( intptr_t ) bootsector_exec_fail,
                              &int18_vector );
        hook_bios_interrupt ( 0x19, ( intptr_t ) bootsector_exec_fail,
                              &int19_vector );

        /* Boot the loaded sector
         *
         * We assume that the boot sector may completely destroy our
         * real-mode stack, so we preserve everything we need in
         * static storage.
         */
        __asm__ __volatile__ ( REAL_CODE ( /* Save return address off-stack */
                                           "popw %%cs:saved_retaddr\n\t"
                                           /* Save stack pointer */
                                           "movw %%ss, %%ax\n\t"
                                           "movw %%ax, %%cs:saved_ss\n\t"
                                           "movw %%sp, %%cs:saved_sp\n\t"
                                           /* Save frame pointer (gcc bug) */
                                           "movl %%ebp, %%cs:saved_ebp\n\t"
                                           /* Prepare jump to boot sector */
                                           "pushw %%bx\n\t"
                                           "pushw %%di\n\t"
                                           /* Clear all registers */
                                           "xorl %%eax, %%eax\n\t"
                                           "xorl %%ebx, %%ebx\n\t"
                                           "xorl %%ecx, %%ecx\n\t"
                                           /* %edx contains drive number */
                                           "xorl %%esi, %%esi\n\t"
                                           "xorl %%edi, %%edi\n\t"
                                           "xorl %%ebp, %%ebp\n\t"
                                           "movw %%ax, %%ds\n\t"
                                           "movw %%ax, %%es\n\t"
                                           "movw %%ax, %%fs\n\t"
                                           "movw %%ax, %%gs\n\t"
                                           /* Jump to boot sector */
                                           "sti\n\t"
                                           "lret\n\t"
                                           /* Preserved variables */
                                           "\nsaved_ebp: .long 0\n\t"
                                           "\nsaved_ss: .word 0\n\t"
                                           "\nsaved_sp: .word 0\n\t"
                                           "\nsaved_retaddr: .word 0\n\t"
                                           /* Boot failure return point */
                                           "\nbootsector_exec_fail:\n\t"
                                           /* Restore frame pointer (gcc bug) */
                                           "movl %%cs:saved_ebp, %%ebp\n\t"
                                           /* Restore stack pointer */
                                           "movw %%cs:saved_ss, %%ax\n\t"
                                           "movw %%ax, %%ss\n\t"
                                           "movw %%cs:saved_sp, %%sp\n\t"
                                           /* Return via saved address */
                                           "jmp *%%cs:saved_retaddr\n\t" )
                               : "=b" ( discard_b ), "=D" ( discard_D ),
                                 "=d" ( discard_d )
                               : "b" ( segment ), "D" ( offset ),
                                 "d" ( drive )
                               : "eax", "ecx", "esi" );

        DBG ( "Booted disk returned via INT 18 or 19\n" );

        /* Unhook INTs 18 and 19 */
        unhook_bios_interrupt ( 0x18, ( intptr_t ) bootsector_exec_fail,
                                &int18_vector );
        unhook_bios_interrupt ( 0x19, ( intptr_t ) bootsector_exec_fail,
                                &int19_vector );
        
        return -ECANCELED;
}