Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Avoid physical/virtual contiguity assumptions using new guest memory access functions
[palacios.git] / bios / seabios / src / disk.h
1 // Definitions for X86 bios disks.
2 //
3 // Copyright (C) 2008  Kevin O'Connor <kevin@koconnor.net>
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     union {
67         struct {
68             u64 device_path;
69             u8  reserved3;
70             u8  checksum;
71         } phoenix;
72         struct {
73             u64 device_path[2];
74             u8  reserved3;
75             u8  checksum;
76         } t13;
77     };
78 } PACKED;
79
80 #define GET_INT13DPT(regs,var)                                          \
81     GET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var)
82 #define SET_INT13DPT(regs,var,val)                                      \
83     SET_FARVAR((regs)->ds, ((struct int13dpt_s*)((regs)->si+0))->var, (val))
84
85 // Floppy "Disk Base Table"
86 struct floppy_dbt_s {
87     u8 specify1;
88     u8 specify2;
89     u8 shutoff_ticks;
90     u8 bps_code;
91     u8 sectors;
92     u8 interblock_len;
93     u8 data_len;
94     u8 gap_len;
95     u8 fill_byte;
96     u8 settle_time;
97     u8 startup_time;
98 } PACKED;
99
100 struct floppy_ext_dbt_s {
101     struct floppy_dbt_s dbt;
102     // Extra fields
103     u8 max_track;
104     u8 data_rate;
105     u8 drive_type;
106 } PACKED;
107
108 // Helper function for setting up a return code.
109 struct bregs;
110 void __disk_ret(struct bregs *regs, u32 linecode, const char *fname);
111 #define disk_ret(regs, code) \
112     __disk_ret((regs), (code) | (__LINE__ << 8), __func__)
113 void __disk_ret_unimplemented(struct bregs *regs, u32 linecode
114                               , const char *fname);
115 #define disk_ret_unimplemented(regs, code) \
116     __disk_ret_unimplemented((regs), (code) | (__LINE__ << 8), __func__)
117
118
119 /****************************************************************
120  * Master boot record
121  ****************************************************************/
122
123 struct packed_chs_s {
124     u8 heads;
125     u8 sptcyl;
126     u8 cyllow;
127 };
128
129 struct partition_s {
130     u8 status;
131     struct packed_chs_s first;
132     u8 type;
133     struct packed_chs_s last;
134     u32 lba;
135     u32 count;
136 } PACKED;
137
138 struct mbr_s {
139     u8 code[440];
140     // 0x01b8
141     u32 diskseg;
142     // 0x01bc
143     u16 null;
144     // 0x01be
145     struct partition_s partitions[4];
146     // 0x01fe
147     u16 signature;
148 } PACKED;
149
150 #define MBR_SIGNATURE 0xaa55
151
152
153 /****************************************************************
154  * Disk command request
155  ****************************************************************/
156
157 struct disk_op_s {
158     u64 lba;
159     void *buf_fl;
160     struct drive_s *drive_g;
161     u16 count;
162     u8 command;
163 };
164
165 #define CMD_RESET   0x00
166 #define CMD_READ    0x02
167 #define CMD_WRITE   0x03
168 #define CMD_VERIFY  0x04
169 #define CMD_FORMAT  0x05
170 #define CMD_SEEK    0x07
171 #define CMD_ISREADY 0x10
172
173
174 /****************************************************************
175  * Global storage
176  ****************************************************************/
177
178 struct chs_s {
179     u16 heads;      // # heads
180     u16 cylinders;  // # cylinders
181     u16 spt;        // # sectors / track
182 };
183
184 struct drive_s {
185     u8 type;            // Driver type (DTYPE_*)
186     u8 floppy_type;     // Type of floppy (only for floppy drives).
187     struct chs_s lchs;  // Logical CHS
188     u64 sectors;        // Total sectors count
189     u32 cntl_id;        // Unique id for a given driver type.
190     u8 removable;       // Is media removable (currently unused)
191
192     // Info for EDD calls
193     u8 translation;     // type of translation
194     u16 blksize;        // block size
195     struct chs_s pchs;  // Physical CHS
196 };
197
198 #define DISK_SECTOR_SIZE  512
199 #define CDROM_SECTOR_SIZE 2048
200
201 #define DTYPE_NONE     0x00
202 #define DTYPE_FLOPPY   0x01
203 #define DTYPE_ATA      0x02
204 #define DTYPE_ATAPI    0x03
205 #define DTYPE_RAMDISK  0x04
206 #define DTYPE_CDEMU    0x05
207 #define DTYPE_USB      0x06
208 #define DTYPE_VIRTIO   0x07
209 #define DTYPE_AHCI     0x08
210
211 #define MAXDESCSIZE 80
212
213 #define TRANSLATION_NONE  0
214 #define TRANSLATION_LBA   1
215 #define TRANSLATION_LARGE 2
216 #define TRANSLATION_RECHS 3
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 u8 FloppyCount, CDCount;
232 extern u8 *bounce_buf_fl;
233 struct drive_s *getDrive(u8 exttype, u8 extdriveoffset);
234 int getDriveId(u8 exttype, 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 int process_op(struct disk_op_s *op);
239 int send_disk_op(struct disk_op_s *op);
240 int bounce_buf_init(void);
241
242 // floppy.c
243 extern struct floppy_ext_dbt_s diskette_param_table2;
244 void floppy_setup(void);
245 struct drive_s *init_floppy(int floppyid, int ftype);
246 int find_floppy_type(u32 size);
247 int process_floppy_op(struct disk_op_s *op);
248 void floppy_tick(void);
249
250 // cdrom.c
251 extern struct drive_s *cdemu_drive_gf;
252 int process_cdemu_op(struct disk_op_s *op);
253 void cdemu_setup(void);
254 void cdemu_134b(struct bregs *regs);
255 int cdrom_boot(struct drive_s *drive_g);
256
257 // ramdisk.c
258 void ramdisk_setup(void);
259 int process_ramdisk_op(struct disk_op_s *op);
260
261 #endif // disk.h