13cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 23cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * v1.0 33cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 43cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Disk I/O include file for the ext2fs/DOS library. 53cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 63cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Copyright (c) 1997 Mark Habersack 73cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header% 9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library 10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2. 11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header% 123cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 13543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o 143cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifndef __diskio_h 153cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define __diskio_h 163cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __TURBOC__ 173cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifndef __LARGE__ 183cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o# error "ext2fs/DOS library requires LARGE model!" 193cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif 203cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif 213cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 223cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __TURBOC__ 233cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#include "msdos.h" 243cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif 253cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 263cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 273cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * A helper structure used in LBA => CHS conversion 283cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 293cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct 303cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{ 313cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short cyl; /* Cylinder (or track) */ 323cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short head; 333cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short sector; 343cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short offset; /* Offset of byte within the sector */ 353cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} CHS; 363cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 373cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 383cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * All partition data we need is here 393cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 403cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct 413cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{ 423cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o char *dev; /* _Linux_ device name (like "/dev/hda1") */ 433cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char phys; /* Physical DOS drive number */ 443cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned long start; /* LBA address of partition start */ 453cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned long len; /* length of partition in sectors */ 463cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char pno; /* Partition number (read from *dev) */ 473cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 483cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o /* This partition's drive geometry */ 493cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short cyls; 503cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short heads; 513cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned short sects; 523cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} PARTITION; 533cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 543cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 553cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * PC partition table entry format 563cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 573cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __DJGPP__ 583cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#pragma pack(1) 593cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif 603cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct 613cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{ 623cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char active; 633cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char start_head; 643cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char start_sec; 653cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char start_cyl; 663cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char type; 673cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char end_head; 683cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char end_sec; 693cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned char end_cyl; 703cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned long first_sec_rel; 713cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o unsigned long size; 723cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} PTABLE_ENTRY; 733cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __DJGPP__ 743cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#pragma pack() 753cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif 763cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 773cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 783cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * INT 0x13 operation codes 793cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 803cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_READ 0x02 813cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_WRITE 0x03 823cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_GET_GEOMETRY 0x08 833cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_READY 0x10 843cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 853cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 863cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Errors to put in _dio_error 873cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 883cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_BADDEV 0x00000001L 893cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_HARDWARE 0x00000002L 903cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_NOTSUPP 0x00000003L 913cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_NOTEXT2FS 0x00000004L 923cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_EMPTYPART 0x00000005L 933cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_LINUXSWAP 0x00000006L 943cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 953cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 963cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Functions in diskio.c 973cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 983cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 993cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 1003cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Variable contains last module's error 1013cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 1023cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oextern unsigned long _dio_error; 1033cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 1043cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 1053cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * This one contains last hardware error (if _dio_error == ERR_HARDWARE) 1063cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 1073cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oextern unsigned long _dio_hw_error; 1083cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 1093cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 1103cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Macros to check for disk hardware errors 1113cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 1123cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_OK() ((unsigned char)_dio_hw_error == 0x00) 1133cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_CMD() ((unsigned char)_dio_hw_error == 0x01) 1143cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_NO_ADDR_MARK() ((unsigned char)_dio_hw_error == 0x02) 1153cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_WRITE_PROT() ((unsigned char)_dio_hw_error == 0x03) 1163cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_NO_SECTOR() ((unsigned char)_dio_hw_error == 0x04) 1173cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_RESET_FAIL() ((unsigned char)_dio_hw_error == 0x05) 1183cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DISK_CHANGED() ((unsigned char)_dio_hw_error == 0x06) 1193cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DRIVE_FAIL() ((unsigned char)_dio_hw_error == 0x07) 1203cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DMA_OVERRUN() ((unsigned char)_dio_hw_error == 0x08) 1213cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DMA_BOUNDARY() ((unsigned char)_dio_hw_error == 0x09) 1223cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_SECTOR() ((unsigned char)_dio_hw_error == 0x0A) 1233cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_TRACK() ((unsigned char)_dio_hw_error == 0x0B) 1243cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_UNSUPP_TRACK() ((unsigned char)_dio_hw_error == 0x0C) 1253cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_CRC_ECC() ((unsigned char)_dio_hw_error == 0x10) 1263cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_CRC_ECC_CORR() ((unsigned char)_dio_hw_error == 0x11) 1273cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_CONTR_FAIL() ((unsigned char)_dio_hw_error == 0x20) 1283cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_SEEK_FAIL() ((unsigned char)_dio_hw_error == 0x40) 1293cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_ATTACH_FAIL() ((unsigned char)_dio_hw_error == 0x80) 1303cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DRIVE_NREADY() ((unsigned char)_dio_hw_error == 0xAA) 1313cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_UNDEF_ERROR() ((unsigned char)_dio_hw_error == 0xBB) 1323cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_WRITE_FAULT() ((unsigned char)_dio_hw_error == 0xCC) 1333cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_STATUS_ERROR() ((unsigned char)_dio_hw_error == 0xE0) 1343cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_SENSE_FAIL() ((unsigned char)_dio_hw_error == 0xFF) 1353cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 1363cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 1373cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/* 1383cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Open the specified partition. 1393cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * String 'dev' must have a format: 1403cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 1413cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * /dev/{sd|hd|fd}[X] 1423cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 1433cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * where, 1443cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 1453cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * only one of the option in curly braces can be used and X is an optional 1463cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * partition number for the given device. If X is not specified, function 1473cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * scans the drive's partition table in search for the first Linux ext2fs 1483cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * partition (signature 0x83). Along the way it dives into every extended 1493cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * partition encountered. 1503cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Scan ends if either (a) there are no more used partition entries, or 1513cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * (b) there is no Xth partition. 1523cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * 1533cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Routine returns 0 on success and !=0 otherwise. 1543cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */ 1553cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oint open_partition(char *dev); 1563cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o 1573cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif /* __diskio_h */ 158