From 295e11b2b0a6a9b3fd08c7ba13fdf76d3c637d77 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 14 May 2006 23:46:28 +0000 Subject: [PATCH] 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. --- src/arch/i386/include/int13.h | 16 ++++++++++++++++ src/arch/i386/interface/pcbios/int13.c | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) 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 @@ -267,6 +267,27 @@ static int int13_get_parameters ( struct int13_drive *drive, return 0; } +/** + * 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 * @@ -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;