summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2006-05-15 01:46:28 +0200
committerMichael Brown2006-05-15 01:46:28 +0200
commit295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77 (patch)
treec23c91a5bb427dfef7d1b64477988e576700e2d2 /src
parentSplit "iSCSI as a SCSI device" out from "iSCSI as a TCP protocol". (diff)
downloadipxe-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.h16
-rw-r--r--src/arch/i386/interface/pcbios/int13.c24
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;