Annotation of qemu/roms/ipxe/src/arch/i386/include/int13.h, revision 1.1

1.1     ! root        1: #ifndef INT13_H
        !             2: #define INT13_H
        !             3: 
        !             4: /** @file
        !             5:  *
        !             6:  * INT 13 emulation
        !             7:  *
        !             8:  */
        !             9: 
        !            10: FILE_LICENCE ( GPL2_OR_LATER );
        !            11: 
        !            12: #include <stdint.h>
        !            13: #include <ipxe/list.h>
        !            14: #include <ipxe/edd.h>
        !            15: #include <realmode.h>
        !            16: 
        !            17: /**
        !            18:  * @defgroup int13ops INT 13 operation codes
        !            19:  * @{
        !            20:  */
        !            21: 
        !            22: /** Reset disk system */
        !            23: #define INT13_RESET                    0x00
        !            24: /** Get status of last operation */
        !            25: #define INT13_GET_LAST_STATUS          0x01
        !            26: /** Read sectors */
        !            27: #define INT13_READ_SECTORS             0x02
        !            28: /** Write sectors */
        !            29: #define INT13_WRITE_SECTORS            0x03
        !            30: /** Get drive parameters */
        !            31: #define INT13_GET_PARAMETERS           0x08
        !            32: /** Get disk type */
        !            33: #define INT13_GET_DISK_TYPE            0x15
        !            34: /** Extensions installation check */
        !            35: #define INT13_EXTENSION_CHECK          0x41
        !            36: /** Extended read */
        !            37: #define INT13_EXTENDED_READ            0x42
        !            38: /** Extended write */
        !            39: #define INT13_EXTENDED_WRITE           0x43
        !            40: /** Verify sectors */
        !            41: #define INT13_EXTENDED_VERIFY          0x44
        !            42: /** Extended seek */
        !            43: #define INT13_EXTENDED_SEEK            0x47
        !            44: /** Get extended drive parameters */
        !            45: #define INT13_GET_EXTENDED_PARAMETERS  0x48
        !            46: /** Get CD-ROM status / terminate emulation */
        !            47: #define INT13_CDROM_STATUS_TERMINATE   0x4b
        !            48: 
        !            49: /** @} */
        !            50: 
        !            51: /**
        !            52:  * @defgroup int13status INT 13 status codes
        !            53:  * @{
        !            54:  */
        !            55: 
        !            56: /** Operation completed successfully */
        !            57: #define INT13_STATUS_SUCCESS           0x00
        !            58: /** Invalid function or parameter */
        !            59: #define INT13_STATUS_INVALID           0x01
        !            60: /** Read error */
        !            61: #define INT13_STATUS_READ_ERROR                0x04
        !            62: /** Reset failed */
        !            63: #define INT13_STATUS_RESET_FAILED      0x05
        !            64: /** Write error */
        !            65: #define INT13_STATUS_WRITE_ERROR       0xcc
        !            66: 
        !            67: /** @} */
        !            68: 
        !            69: /** Block size for non-extended INT 13 calls */
        !            70: #define INT13_BLKSIZE 512
        !            71: 
        !            72: /** An INT 13 disk address packet */
        !            73: struct int13_disk_address {
        !            74:        /** Size of the packet, in bytes */
        !            75:        uint8_t bufsize;
        !            76:        /** Reserved */
        !            77:        uint8_t reserved_a;
        !            78:        /** Block count */
        !            79:        uint8_t count;
        !            80:        /** Reserved */
        !            81:        uint8_t reserved_b;
        !            82:        /** Data buffer */
        !            83:        struct segoff buffer;
        !            84:        /** Starting block number */
        !            85:        uint64_t lba;
        !            86:        /** Data buffer (EDD 3.0+ only) */
        !            87:        uint64_t buffer_phys;
        !            88:        /** Block count (EDD 4.0+ only) */
        !            89:        uint32_t long_count;
        !            90:        /** Reserved */
        !            91:        uint32_t reserved_c;
        !            92: } __attribute__ (( packed ));
        !            93: 
        !            94: /** INT 13 disk parameters */
        !            95: struct int13_disk_parameters {
        !            96:        /** Size of this structure */
        !            97:        uint16_t bufsize;
        !            98:        /** Flags */
        !            99:        uint16_t flags;
        !           100:        /** Number of cylinders */
        !           101:        uint32_t cylinders;
        !           102:        /** Number of heads */
        !           103:        uint32_t heads;
        !           104:        /** Number of sectors per track */
        !           105:        uint32_t sectors_per_track;
        !           106:        /** Total number of sectors on drive */
        !           107:        uint64_t sectors;
        !           108:        /** Bytes per sector */
        !           109:        uint16_t sector_size;
        !           110:        /** Device parameter table extension */
        !           111:        struct segoff dpte;
        !           112:        /** Device path information */
        !           113:        struct edd_device_path_information dpi;
        !           114: } __attribute__ (( packed ));
        !           115: 
        !           116: /**
        !           117:  * @defgroup int13types INT 13 disk types
        !           118:  * @{
        !           119:  */
        !           120: 
        !           121: /** No such drive */
        !           122: #define INT13_DISK_TYPE_NONE   0x00
        !           123: /** Floppy without change-line support */
        !           124: #define INT13_DISK_TYPE_FDD    0x01
        !           125: /** Floppy with change-line support */
        !           126: #define INT13_DISK_TYPE_FDD_CL 0x02
        !           127: /** Hard disk */
        !           128: #define INT13_DISK_TYPE_HDD    0x03
        !           129: 
        !           130: /** @} */
        !           131: 
        !           132: /**
        !           133:  * @defgroup int13flags INT 13 disk parameter flags
        !           134:  * @{
        !           135:  */
        !           136: 
        !           137: /** DMA boundary errors handled transparently */
        !           138: #define INT13_FL_DMA_TRANSPARENT 0x01
        !           139: /** CHS information is valid */
        !           140: #define INT13_FL_CHS_VALID      0x02
        !           141: /** Removable drive */
        !           142: #define INT13_FL_REMOVABLE      0x04
        !           143: /** Write with verify supported */
        !           144: #define INT13_FL_VERIFIABLE     0x08
        !           145: /** Has change-line supported (valid only for removable drives) */
        !           146: #define INT13_FL_CHANGE_LINE    0x10
        !           147: /** Drive can be locked (valid only for removable drives) */
        !           148: #define INT13_FL_LOCKABLE       0x20
        !           149: /** CHS is max possible, not current media (valid only for removable drives) */
        !           150: #define INT13_FL_CHS_MAX        0x40
        !           151: 
        !           152: /** @} */
        !           153: 
        !           154: /**
        !           155:  * @defgroup int13exts INT 13 extension flags
        !           156:  * @{
        !           157:  */
        !           158: 
        !           159: /** Extended disk access functions supported */
        !           160: #define INT13_EXTENSION_LINEAR         0x01
        !           161: /** Removable drive functions supported */
        !           162: #define INT13_EXTENSION_REMOVABLE      0x02
        !           163: /** EDD functions supported */
        !           164: #define INT13_EXTENSION_EDD            0x04
        !           165: /** 64-bit extensions are present */
        !           166: #define INT13_EXTENSION_64BIT          0x08
        !           167: 
        !           168: /** @} */
        !           169: 
        !           170: /**
        !           171:  * @defgroup int13vers INT 13 extension versions
        !           172:  * @{
        !           173:  */
        !           174: 
        !           175: /** INT13 extensions version 1.x */
        !           176: #define INT13_EXTENSION_VER_1_X                0x01
        !           177: /** INT13 extensions version 2.0 (EDD-1.0) */
        !           178: #define INT13_EXTENSION_VER_2_0                0x20
        !           179: /** INT13 extensions version 2.1 (EDD-1.1) */
        !           180: #define INT13_EXTENSION_VER_2_1                0x21
        !           181: /** INT13 extensions version 3.0 (EDD-3.0) */
        !           182: #define INT13_EXTENSION_VER_3_0                0x30
        !           183: 
        !           184: /** @} */ 
        !           185: 
        !           186: /** Maximum number of sectors for which CHS geometry is allowed to be valid
        !           187:  *
        !           188:  * This number is taken from the EDD specification.
        !           189:  */
        !           190: #define INT13_MAX_CHS_SECTORS          15482880
        !           191: 
        !           192: /** Bootable CD-ROM specification packet */
        !           193: struct int13_cdrom_specification {
        !           194:        /** Size of packet in bytes */
        !           195:        uint8_t size;
        !           196:        /** Boot media type */
        !           197:        uint8_t media_type;
        !           198:        /** Drive number */
        !           199:        uint8_t drive;
        !           200:        /** CD-ROM controller number */
        !           201:        uint8_t controller;
        !           202:        /** LBA of disk image to emulate */
        !           203:        uint32_t lba;
        !           204:        /** Device specification */
        !           205:        uint16_t device;
        !           206:        /** Segment of 3K buffer for caching CD-ROM reads */
        !           207:        uint16_t cache_segment;
        !           208:        /** Load segment for initial boot image */
        !           209:        uint16_t load_segment;
        !           210:        /** Number of 512-byte sectors to load */
        !           211:        uint16_t load_sectors;
        !           212:        /** Low 8 bits of cylinder number */
        !           213:        uint8_t cyl;
        !           214:        /** Sector number, plus high 2 bits of cylinder number */
        !           215:        uint8_t cyl_sector;
        !           216:        /** Head number */
        !           217:        uint8_t head;
        !           218: } __attribute__ (( packed ));
        !           219: 
        !           220: /** A C/H/S address within a partition table entry */
        !           221: struct partition_chs {
        !           222:        /** Head number */
        !           223:        uint8_t head;
        !           224:        /** Sector number, plus high 2 bits of cylinder number */
        !           225:        uint8_t cyl_sector;
        !           226:        /** Low 8 bits of cylinder number */
        !           227:        uint8_t cyl;
        !           228: } __attribute__ (( packed ));
        !           229: 
        !           230: #define PART_HEAD(chs) ( (chs).head )
        !           231: #define PART_SECTOR(chs) ( (chs).cyl_sector & 0x3f )
        !           232: #define PART_CYLINDER(chs) ( (chs).cyl | ( ( (chs).cyl_sector & 0xc0 ) << 2 ) )
        !           233: 
        !           234: /** A partition table entry within the MBR */
        !           235: struct partition_table_entry {
        !           236:        /** Bootable flag */
        !           237:        uint8_t bootable;
        !           238:        /** C/H/S start address */
        !           239:        struct partition_chs chs_start;
        !           240:        /** System indicator (partition type) */
        !           241:        uint8_t type;
        !           242:        /** C/H/S end address */
        !           243:        struct partition_chs chs_end;
        !           244:        /** Linear start address */
        !           245:        uint32_t start;
        !           246:        /** Linear length */
        !           247:        uint32_t length;
        !           248: } __attribute__ (( packed ));
        !           249: 
        !           250: /** A Master Boot Record */
        !           251: struct master_boot_record {
        !           252:        /** Code area */
        !           253:        uint8_t code[440];
        !           254:        /** Disk signature */
        !           255:        uint32_t signature;
        !           256:        /** Padding */
        !           257:        uint8_t pad[2];
        !           258:        /** Partition table */
        !           259:        struct partition_table_entry partitions[4];
        !           260:        /** 0x55aa MBR signature */
        !           261:        uint16_t magic;
        !           262: } __attribute__ (( packed ));
        !           263: 
        !           264: /** Use natural BIOS drive number */
        !           265: #define INT13_USE_NATURAL_DRIVE 0xff
        !           266: 
        !           267: #endif /* INT13_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.