bootsector.c File Reference

x86 bootsector image format More...

#include <errno.h>
#include <realmode.h>
#include <biosint.h>
#include <bootsector.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
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   ) 

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:
segment Real-mode segment
offset Real-mode offset
drive Drive number to pass to boot sector
Return values:
rc Return status code

Definition at line 58 of file bootsector.c.

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

Referenced by eltorito_exec(), and int13_boot().

00059                                            {
00060         int discard_b, discard_D, discard_d;
00061 
00062         DBG ( "Booting from boot sector at %04x:%04x\n", segment, offset );
00063 
00064         /* Hook INTs 18 and 19 to capture failure paths */
00065         hook_bios_interrupt ( 0x18, ( unsigned int ) bootsector_exec_fail,
00066                               &int18_vector );
00067         hook_bios_interrupt ( 0x19, ( unsigned int ) bootsector_exec_fail,
00068                               &int19_vector );
00069 
00070         /* Boot the loaded sector
00071          *
00072          * We assume that the boot sector may completely destroy our
00073          * real-mode stack, so we preserve everything we need in
00074          * static storage.
00075          */
00076         __asm__ __volatile__ ( REAL_CODE ( /* Save return address off-stack */
00077                                            "popw %%cs:saved_retaddr\n\t"
00078                                            /* Save stack pointer */
00079                                            "movw %%ss, %%ax\n\t"
00080                                            "movw %%ax, %%cs:saved_ss\n\t"
00081                                            "movw %%sp, %%cs:saved_sp\n\t"
00082                                            /* Jump to boot sector */
00083                                            "pushw %%bx\n\t"
00084                                            "pushw %%di\n\t"
00085                                            "sti\n\t"
00086                                            "lret\n\t"
00087                                            /* Preserved variables */
00088                                            "\nsaved_ss: .word 0\n\t"
00089                                            "\nsaved_sp: .word 0\n\t"
00090                                            "\nsaved_retaddr: .word 0\n\t"
00091                                            /* Boot failure return point */
00092                                            "\nbootsector_exec_fail:\n\t"
00093                                            /* Restore stack pointer */
00094                                            "movw %%cs:saved_ss, %%ax\n\t"
00095                                            "movw %%ax, %%ss\n\t"
00096                                            "movw %%cs:saved_sp, %%sp\n\t"
00097                                            /* Return via saved address */
00098                                            "jmp *%%cs:saved_retaddr\n\t" )
00099                                : "=b" ( discard_b ), "=D" ( discard_D ),
00100                                  "=d" ( discard_d )
00101                                : "b" ( segment ), "D" ( offset ),
00102                                  "d" ( drive )
00103                                : "eax", "ecx", "esi", "ebp" );
00104 
00105         DBG ( "Booted disk returned via INT 18 or 19\n" );
00106 
00107         /* Unhook INTs 18 and 19 */
00108         unhook_bios_interrupt ( 0x18, ( unsigned int ) bootsector_exec_fail,
00109                                 &int18_vector );
00110         unhook_bios_interrupt ( 0x19, ( unsigned int ) bootsector_exec_fail,
00111                                 &int19_vector );
00112         
00113         return -ECANCELED;
00114 }


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 38 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 45 of file bootsector.c.

Referenced by call_bootsector().


Generated on Tue Apr 6 20:01:12 2010 for gPXE by  doxygen 1.5.7.1