|
|
1.1 ! root 1: // Definitions for X86 bios disks. ! 2: // ! 3: // Copyright (C) 2008 Kevin O'Connor <[email protected]> ! 4: // ! 5: // This file may be distributed under the terms of the GNU LGPLv3 license. ! 6: #ifndef __DISK_H ! 7: #define __DISK_H ! 8: ! 9: #include "types.h" // u8 ! 10: #include "config.h" // CONFIG_* ! 11: #include "farptr.h" // struct segoff_s ! 12: ! 13: #define DISK_RET_SUCCESS 0x00 ! 14: #define DISK_RET_EPARAM 0x01 ! 15: #define DISK_RET_EADDRNOTFOUND 0x02 ! 16: #define DISK_RET_EWRITEPROTECT 0x03 ! 17: #define DISK_RET_ECHANGED 0x06 ! 18: #define DISK_RET_EBOUNDARY 0x09 ! 19: #define DISK_RET_EBADTRACK 0x0c ! 20: #define DISK_RET_ECONTROLLER 0x20 ! 21: #define DISK_RET_ETIMEOUT 0x80 ! 22: #define DISK_RET_ENOTLOCKED 0xb0 ! 23: #define DISK_RET_ELOCKED 0xb1 ! 24: #define DISK_RET_ENOTREMOVABLE 0xb2 ! 25: #define DISK_RET_ETOOMANYLOCKS 0xb4 ! 26: #define DISK_RET_EMEDIA 0xC0 ! 27: #define DISK_RET_ENOTREADY 0xAA ! 28: ! 29: ! 30: /**************************************************************** ! 31: * Interface structs ! 32: ****************************************************************/ ! 33: ! 34: // Bios disk structures. ! 35: struct int13ext_s { ! 36: u8 size; ! 37: u8 reserved; ! 38: u16 count; ! 39: struct segoff_s data; ! 40: u64 lba; ! 41: } PACKED; ! 42: ! 43: #define GET_INT13EXT(regs,var) \ ! 44: GET_FARVAR((regs)->ds, ((struct int13ext_s*)((regs)->si+0))->var) ! 45: #define SET_INT13EXT(regs,var,val) \ ! 46: SET_FARVAR((regs)->ds, ((struct int13ext_s*)((regs)->si+0))->var, (val)) ! 47: ! 48: // Disk Physical Table definition ! 49: struct int13dpt_s { ! 50: u16 size; ! 51: u16 infos; ! 52: u32 cylinders; ! 53: u32 heads; ! 54: u32 spt; ! 55: u64 sector_count; ! 56: u16 blksize; ! 57: u16 dpte_offset; ! 58: u16 dpte_segment; ! 59: u16 key; ! 60: u8 dpi_length; ! 61: u8 reserved1; ! 62: u16 reserved2; ! 63: u8 host_bus[4]; ! 64: u8 iface_type[8]; ! 65: u64 iface_path; ! 66: u64 device_path; ! 67: u8 reserved3; ! 68: u8 checksum; ! 69: } PACKED; ! 70: ! 71: #define GET_INT13DPT(regs,var) \ ! 72: GET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var) ! 73: #define SET_INT13DPT(regs,var,val) \ ! 74: SET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var, (val)) ! 75: ! 76: // Floppy "Disk Base Table" ! 77: struct floppy_dbt_s { ! 78: u8 specify1; ! 79: u8 specify2; ! 80: u8 shutoff_ticks; ! 81: u8 bps_code; ! 82: u8 sectors; ! 83: u8 interblock_len; ! 84: u8 data_len; ! 85: u8 gap_len; ! 86: u8 fill_byte; ! 87: u8 settle_time; ! 88: u8 startup_time; ! 89: } PACKED; ! 90: ! 91: struct floppy_ext_dbt_s { ! 92: struct floppy_dbt_s dbt; ! 93: // Extra fields ! 94: u8 max_track; ! 95: u8 data_rate; ! 96: u8 drive_type; ! 97: } PACKED; ! 98: ! 99: // Helper function for setting up a return code. ! 100: struct bregs; ! 101: void __disk_ret(struct bregs *regs, u32 linecode, const char *fname); ! 102: #define disk_ret(regs, code) \ ! 103: __disk_ret((regs), (code) | (__LINE__ << 8), __func__) ! 104: void __disk_ret_unimplemented(struct bregs *regs, u32 linecode ! 105: , const char *fname); ! 106: #define disk_ret_unimplemented(regs, code) \ ! 107: __disk_ret_unimplemented((regs), (code) | (__LINE__ << 8), __func__) ! 108: ! 109: ! 110: /**************************************************************** ! 111: * Master boot record ! 112: ****************************************************************/ ! 113: ! 114: struct packed_chs_s { ! 115: u8 heads; ! 116: u8 sptcyl; ! 117: u8 cyllow; ! 118: }; ! 119: ! 120: struct partition_s { ! 121: u8 status; ! 122: struct packed_chs_s first; ! 123: u8 type; ! 124: struct packed_chs_s last; ! 125: u32 lba; ! 126: u32 count; ! 127: } PACKED; ! 128: ! 129: struct mbr_s { ! 130: u8 code[440]; ! 131: // 0x01b8 ! 132: u32 diskseg; ! 133: // 0x01bc ! 134: u16 null; ! 135: // 0x01be ! 136: struct partition_s partitions[4]; ! 137: // 0x01fe ! 138: u16 signature; ! 139: } PACKED; ! 140: ! 141: #define MBR_SIGNATURE 0xaa55 ! 142: ! 143: ! 144: /**************************************************************** ! 145: * Disk command request ! 146: ****************************************************************/ ! 147: ! 148: struct disk_op_s { ! 149: u64 lba; ! 150: void *buf_fl; ! 151: struct drive_s *drive_g; ! 152: u16 count; ! 153: u8 command; ! 154: }; ! 155: ! 156: #define CMD_RESET 0x00 ! 157: #define CMD_READ 0x02 ! 158: #define CMD_WRITE 0x03 ! 159: #define CMD_VERIFY 0x04 ! 160: #define CMD_FORMAT 0x05 ! 161: #define CMD_SEEK 0x07 ! 162: #define CMD_ISREADY 0x10 ! 163: ! 164: ! 165: /**************************************************************** ! 166: * Global storage ! 167: ****************************************************************/ ! 168: ! 169: struct chs_s { ! 170: u16 heads; // # heads ! 171: u16 cylinders; // # cylinders ! 172: u16 spt; // # sectors / track ! 173: }; ! 174: ! 175: struct drive_s { ! 176: u8 type; // Detected type of drive (ata/atapi/none) ! 177: u8 removable; // Removable device flag ! 178: u16 blksize; // block size ! 179: u32 cntl_id; ! 180: u32 cntl_info; ! 181: u8 floppy_type; // Type of floppy (only for floppy drives). ! 182: ! 183: char model[41]; ! 184: ! 185: u8 translation; // type of translation ! 186: struct chs_s lchs; // Logical CHS ! 187: struct chs_s pchs; // Physical CHS ! 188: ! 189: u64 sectors; // Total sectors count ! 190: }; ! 191: ! 192: #define DISK_SECTOR_SIZE 512 ! 193: #define CDROM_SECTOR_SIZE 2048 ! 194: ! 195: #define DTYPE_NONE 0x00 ! 196: #define DTYPE_FLOPPY 0x01 ! 197: #define DTYPE_ATA 0x02 ! 198: #define DTYPE_ATAPI 0x03 ! 199: #define DTYPE_RAMDISK 0x04 ! 200: #define DTYPE_CDEMU 0x05 ! 201: ! 202: #define TRANSLATION_NONE 0 ! 203: #define TRANSLATION_LBA 1 ! 204: #define TRANSLATION_LARGE 2 ! 205: #define TRANSLATION_RECHS 3 ! 206: ! 207: struct drives_s { ! 208: // info on each internally handled drive ! 209: struct drive_s drives[CONFIG_MAX_DRIVES]; ! 210: u8 drivecount; ! 211: // ! 212: // map between bios floppy/hd/cd id and driveid index into drives[] ! 213: u8 floppycount; ! 214: u8 cdcount; ! 215: u8 idmap[3][CONFIG_MAX_EXTDRIVE]; ! 216: }; ! 217: ! 218: #define EXTTYPE_FLOPPY 0 ! 219: #define EXTTYPE_HD 1 ! 220: #define EXTTYPE_CD 2 ! 221: ! 222: #define EXTSTART_HD 0x80 ! 223: #define EXTSTART_CD 0xE0 ! 224: ! 225: ! 226: /**************************************************************** ! 227: * Function defs ! 228: ****************************************************************/ ! 229: ! 230: // block.c ! 231: extern struct drives_s Drives; ! 232: struct drive_s *getDrive(u8 exttype, u8 extdriveoffset); ! 233: struct drive_s *allocDrive(); ! 234: void setup_translation(struct drive_s *drive_g); ! 235: void map_floppy_drive(struct drive_s *drive_g); ! 236: void map_hd_drive(struct drive_s *drive_g); ! 237: void map_cd_drive(struct drive_s *drive_g); ! 238: void describe_drive(struct drive_s *drive_g); ! 239: int process_op(struct disk_op_s *op); ! 240: int send_disk_op(struct disk_op_s *op); ! 241: void drive_setup(); ! 242: ! 243: // floppy.c ! 244: extern struct floppy_ext_dbt_s diskette_param_table2; ! 245: void floppy_setup(); ! 246: struct drive_s *addFloppy(int floppyid, int ftype, int driver); ! 247: void describe_floppy(struct drive_s *drive_g); ! 248: int find_floppy_type(u32 size); ! 249: int process_floppy_op(struct disk_op_s *op); ! 250: void floppy_tick(); ! 251: ! 252: // cdrom.c ! 253: extern struct drive_s *cdemu_drive; ! 254: int process_cdemu_op(struct disk_op_s *op); ! 255: void cdemu_setup(); ! 256: void cdemu_134b(struct bregs *regs); ! 257: int cdrom_boot(int cdid); ! 258: ! 259: // ramdisk.c ! 260: void describe_ramdisk(struct drive_s *drive_g); ! 261: void ramdisk_setup(); ! 262: int process_ramdisk_op(struct disk_op_s *op); ! 263: ! 264: #endif // disk.h
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.