iPXE
Functions | Variables
bootsector.c File Reference

x86 bootsector image format More...

#include <errno.h>
#include <realmode.h>
#include <biosint.h>
#include <bootsector.h>
#include <ipxe/console.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
void bootsector_exec_fail (void)
 Restart point for INT 18 or 19.
int call_bootsector (unsigned int segment, unsigned int offset, unsigned int drive)
 Jump to preloaded bootsector.

Variables

static struct segoff int18_vector
 Vector for storing original INT 18 handler.
static struct segoff int19_vector
 Vector for storing original INT 19 handler.

Detailed Description

x86 bootsector image format

Definition in file bootsector.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
void bootsector_exec_fail ( void  )

Restart point for INT 18 or 19.

Referenced by call_bootsector().

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

Variable Documentation

struct segoff int18_vector [static]

Vector for storing original INT 18 handler.

We do not chain to this vector, so there is no need to place it in .text16.

Definition at line 44 of file bootsector.c.

Referenced by call_bootsector().

struct segoff int19_vector [static]

Vector for storing original INT 19 handler.

We do not chain to this vector, so there is no need to place it in .text16.

Definition at line 51 of file bootsector.c.

Referenced by call_bootsector().