diff options
author | Michael Brown | 2006-05-15 01:46:28 +0200 |
---|---|---|
committer | Michael Brown | 2006-05-15 01:46:28 +0200 |
commit | 295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77 (patch) | |
tree | c23c91a5bb427dfef7d1b64477988e576700e2d2 /src | |
parent | Split "iSCSI as a SCSI device" out from "iSCSI as a TCP protocol". (diff) | |
download | ipxe-295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77.tar.gz ipxe-295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77.tar.xz ipxe-295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77.zip |
Add INT 13,41 (extensions installation check). LILO's MBR now uses
linear calls to load the MS-DOS boot sector in my test setup.
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/i386/include/int13.h | 16 | ||||
-rw-r--r-- | src/arch/i386/interface/pcbios/int13.c | 24 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/arch/i386/include/int13.h b/src/arch/i386/include/int13.h index 8f3062be..46d41dfe 100644 --- a/src/arch/i386/include/int13.h +++ b/src/arch/i386/include/int13.h @@ -27,6 +27,8 @@ struct block_device; #define INT13_WRITE_SECTORS 0x03 /** Get drive parameters */ #define INT13_GET_PARAMETERS 0x08 +/** Extensions installation check */ +#define INT13_EXTENSION_CHECK 0x41 /** Extended read */ #define INT13_EXTENDED_READ 0x42 /** Extended write */ @@ -151,6 +153,20 @@ struct int13_disk_parameters { /** @} */ +/** + * @defgroup int13exts INT 13 extension flags + * @{ + */ + +/** Extended disk access functions supported */ +#define INT13_EXTENSION_LINEAR 0x01 +/** Removable drive functions supported */ +#define INT13_EXTENSION_REMOVABLE 0x02 +/** EDD functions supported */ +#define INT13_EXTENSION_EDD 0x04 + +/** @} */ + extern void register_int13_drive ( struct int13_drive *drive ); extern void unregister_int13_drive ( struct int13_drive *drive ); extern int int13_boot ( unsigned int drive ); diff --git a/src/arch/i386/interface/pcbios/int13.c b/src/arch/i386/interface/pcbios/int13.c index 0dd96ac6..d4d15c16 100644 --- a/src/arch/i386/interface/pcbios/int13.c +++ b/src/arch/i386/interface/pcbios/int13.c @@ -268,6 +268,27 @@ static int int13_get_parameters ( struct int13_drive *drive, } /** + * INT 13, 41 - Extensions installation check + * + * @v drive Emulated drive + * @v bx 0x55aa + * @ret bx 0xaa55 + * @ret cx Extensions API support bitmap + * @ret status Status code + */ +static int int13_extension_check ( struct int13_drive *drive __unused, + struct i386_all_regs *ix86 ) { + if ( ix86->regs.bx == 0x55aa ) { + DBG ( "INT 13 extensions installation check\n" ); + ix86->regs.bx = 0xaa55; + ix86->regs.cx = INT13_EXTENSION_LINEAR; + return 0; + } else { + return INT13_STATUS_INVALID; + } +} + +/** * INT 13, 42 - Extended read * * @v drive Emulated drive @@ -357,6 +378,9 @@ static void int13 ( struct i386_all_regs *ix86 ) { case INT13_GET_PARAMETERS: status = int13_get_parameters ( drive, ix86 ); break; + case INT13_EXTENSION_CHECK: + status = int13_extension_check ( drive, ix86 ); + break; case INT13_EXTENDED_READ: status = int13_extended_read ( drive, ix86 ); break; |