Add INT 13,41 (extensions installation check). LILO's MBR now uses
[people/xl0/gpxe.git] / src / arch / i386 / include / int13.h
1 #ifndef INT13_H
2 #define INT13_H
3
4 /** @file
5  *
6  * INT 13 emulation
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/list.h>
12
13 struct block_device;
14
15 /**
16  * @defgroup int13ops INT 13 operation codes
17  * @{
18  */
19
20 /** Reset disk system */
21 #define INT13_RESET                     0x00
22 /** Get status of last operation */
23 #define INT13_GET_LAST_STATUS           0x01
24 /** Read sectors */
25 #define INT13_READ_SECTORS              0x02
26 /** Write sectors */
27 #define INT13_WRITE_SECTORS             0x03
28 /** Get drive parameters */
29 #define INT13_GET_PARAMETERS            0x08
30 /** Extensions installation check */
31 #define INT13_EXTENSION_CHECK           0x41
32 /** Extended read */
33 #define INT13_EXTENDED_READ             0x42
34 /** Extended write */
35 #define INT13_EXTENDED_WRITE            0x43
36 /** Get extended drive parameters */
37 #define INT13_GET_EXTENDED_PARAMETERS   0x48
38
39 /** @} */
40
41 /**
42  * @defgroup int13status INT 13 status codes
43  * @{
44  */
45
46 /** Operation completed successfully */
47 #define INT13_STATUS_SUCCESS            0x00
48 /** Invalid function or parameter */
49 #define INT13_STATUS_INVALID            0x01
50 /** Read error */
51 #define INT13_STATUS_READ_ERROR         0x04
52 /** Write error */
53 #define INT13_STATUS_WRITE_ERROR        0xcc
54
55 /** @} */
56
57 /** Block size for non-extended INT 13 calls */
58 #define INT13_BLKSIZE 512
59
60 /** An INT 13 emulated drive */
61 struct int13_drive {
62         /** List of all registered drives */
63         struct list_head list;
64
65         /** Underlying block device */
66         struct block_device *blockdev;
67
68         /** BIOS drive number (0x80-0xff) */
69         unsigned int drive;
70         /** Number of cylinders
71          *
72          * The cylinder number field in an INT 13 call is ten bits
73          * wide, giving a maximum of 1024 cylinders.  Conventionally,
74          * when the 7.8GB limit of a CHS address is exceeded, it is
75          * the number of cylinders that is increased beyond the
76          * addressable limit.
77          */
78         unsigned int cylinders;
79         /** Number of heads
80          *
81          * The head number field in an INT 13 call is eight bits wide,
82          * giving a maximum of 256 heads.  However, apparently all
83          * versions of MS-DOS up to and including Win95 fail with 256
84          * heads, so the maximum encountered in practice is 255.
85          */
86         unsigned int heads;
87         /** Number of sectors per track
88          *
89          * The sector number field in an INT 13 call is six bits wide,
90          * giving a maximum of 63 sectors, since sector numbering
91          * (unlike head and cylinder numbering) starts at 1, not 0.
92          */
93         unsigned int sectors_per_track;
94
95         /** Status of last operation */
96         int last_status;
97 };
98
99 /** An INT 13 disk address packet */
100 struct int13_disk_address {
101         /** Size of the packet, in bytes */
102         uint8_t bufsize;
103         /** Reserved, must be zero */
104         uint8_t reserved;
105         /** Block count */
106         uint16_t count;
107         /** Data buffer */
108         struct segoff buffer;
109         /** Starting block number */
110         uint64_t lba;
111         /** Data buffer (EDD-3.0 only) */
112         uint64_t buffer_phys;
113 };
114
115 /** INT 13 disk parameters */
116 struct int13_disk_parameters {
117         /** Size of this structure */
118         uint16_t bufsize;
119         /** Flags */
120         uint16_t flags;
121         /** Number of cylinders */
122         uint32_t cylinders;
123         /** Number of heads */
124         uint32_t heads;
125         /** Number of sectors per track */
126         uint32_t sectors_per_track;
127         /** Total number of sectors on drive */
128         uint64_t sectors;
129         /** Bytes per sector */
130         uint16_t sector_size;
131         
132 };
133
134 /**
135  * @defgroup int13flags INT 13 disk parameter flags
136  * @{
137  */
138
139 /** DMA boundary errors handled transparently */
140 #define INT13_FL_DMA_TRANSPARENT 0x01
141 /** CHS information is valid */
142 #define INT13_FL_CHS_VALID       0x02
143 /** Removable drive */
144 #define INT13_FL_REMOVABLE       0x04
145 /** Write with verify supported */
146 #define INT13_FL_VERIFIABLE      0x08
147 /** Has change-line supported (valid only for removable drives) */
148 #define INT13_FL_CHANGE_LINE     0x10
149 /** Drive can be locked (valid only for removable drives) */
150 #define INT13_FL_LOCKABLE        0x20
151 /** CHS is max possible, not current media (valid only for removable drives) */
152 #define INT13_FL_CHS_MAX         0x40
153
154 /** @} */
155
156 /**
157  * @defgroup int13exts INT 13 extension flags
158  * @{
159  */
160
161 /** Extended disk access functions supported */
162 #define INT13_EXTENSION_LINEAR          0x01
163 /** Removable drive functions supported */
164 #define INT13_EXTENSION_REMOVABLE       0x02
165 /** EDD functions supported */
166 #define INT13_EXTENSION_EDD             0x04
167
168 /** @} */
169
170 extern void register_int13_drive ( struct int13_drive *drive );
171 extern void unregister_int13_drive ( struct int13_drive *drive );
172 extern int int13_boot ( unsigned int drive );
173
174 #endif /* INT13_H */