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.


added new identify sub command (merged from CVS)
[palacios.git] / palacios / src / devices / ramdisk.c
1 /* 
2  *
3  *   Copyright (C) 2002  MandrakeSoft S.A.
4  *
5  *     MandrakeSoft S.A.
6  *     43, rue d'Aboukir
7  *     75002 Paris - France
8  *     http://www.linux-mandrake.com/
9  *     http://www.mandrakesoft.com/
10  *
11  *   This library is free software; you can redistribute it and/or
12  *   modify it under the terms of the GNU Lesser General Public
13  *   License as published by the Free Software Foundation; either
14  *   version 2 of the License, or (at your option) any later version.
15  *
16  *   This library is distributed in the hope that it will be useful,
17  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  *   Lesser General Public License for more details.
20  *
21  *  You should have received a copy of the GNU Lesser General Public
22  *  License along with this library; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24  *
25  * Major modifications made for the V3VEE project
26  * 
27  * The V3VEE Project is a joint project between Northwestern University
28  * and the University of New Mexico.  You can find out more at 
29  * http://www.v3vee.org
30  * 
31  * Copyright (c) 2008, Zheng Cui <cuizheng@cs.unm.edu>
32  * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
33  * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
34  * All rights reserved for original changes
35  * 
36  */
37
38
39 #include <devices/ramdisk.h>
40 #include <palacios/vmm.h>
41 #include <devices/cdrom.h>
42 #include <devices/ide.h>
43
44
45 #ifndef DEBUG_RAMDISK
46 #undef PrintDebug
47 #define PrintDebug(_f, _a...)
48 #endif
49                                                  
50
51 /*
52  * Data type definitions
53  *
54  */
55 #define INDEX_PULSE_CYCLE 10
56
57
58
59
60 #define INTR_REASON_BIT_ERR           0x01
61 #define UNABLE_FIND_TAT_CHANNEL_ERR   0x02
62 #define DRQ_ERR                       0x03
63 #define READ_BUF_GT_512               0x04
64
65
66
67 #define PRI_DATA_PORT         0x1f0
68 #define PRI_FEATURES_PORT     0x1f1
69 #define PRI_SECT_CNT_PORT     0x1f2
70 #define PRI_SECT_ADDR1_PORT   0x1f3
71 #define PRI_SECT_ADDR2_PORT   0x1f4
72 #define PRI_SECT_ADDR3_PORT   0x1f5
73 #define PRI_DRV_SEL_PORT      0x1f6
74 #define PRI_CMD_PORT          0x1f7
75 #define PRI_CTRL_PORT         0x3f6
76 #define PRI_ADDR_REG_PORT     0x3f7
77
78 #define SEC_DATA_PORT         0x170
79 #define SEC_FEATURES_PORT     0x171
80 #define SEC_SECT_CNT_PORT     0x172
81 #define SEC_SECT_ADDR1_PORT   0x173
82 #define SEC_SECT_ADDR2_PORT   0x174
83 #define SEC_SECT_ADDR3_PORT   0x175
84 #define SEC_DRV_SEL_PORT      0x176
85 #define SEC_CMD_PORT          0x177
86 #define SEC_CTRL_PORT         0x376
87 #define SEC_ADDR_REG_PORT     0x377
88
89
90
91
92
93 #define PACKET_SIZE 12
94
95
96 /*
97  * Debug facilities
98  */
99
100 #define ATA_DETECT                     0xf0 //0X3E8
101 #define ATA_RESET                      0xf1 //0X3E9
102 #define ATA_CMD_DATA_IN                0xf2 //0X3EA
103 #define ATA_CMD_DATA_OUT               0xf3 //0X3EB
104 #define ATA_CMD_PACKET                 0xf4 //0X3EC
105 #define ATAPI_GET_SENSE                0xf5 //0X3ED
106 #define ATAPI_IS_READY                 0xf6 //0X3EE
107 #define ATAPI_IS_CDROM                 0xf7 //0X3EF
108
109 #define CDEMU_INIT                     0xf8 //0X2E8
110 #define CDEMU_ISACTIVE                 0xf9 //0X2E9
111 #define CDEMU_EMULATED_DRIVE           0xfa //0X2EA
112 #define CDROM_BOOT                     0xfb //0X2EB
113
114
115 #define HARD_DRIVE_POST                0xfc //0X2EC
116
117
118 #define ATA_DEVICE_NO                  0xfd //0X2ED
119 #define ATA_DEVICE_TYPE                0xfe //0X2ED
120
121 #define INT13_HARDDISK                 0xff //0x2ef
122 #define INT13_CDROM                    0xe0 //0x2f8
123 #define INT13_CDEMU                    0xe1 //0x2f9
124 #define INT13_ELTORITO                 0xe2 //0x2fa
125 #define INT13_DISKETTE_FUNCTION        0xe3 //0x2fb
126
127
128
129
130 static const char cdrom_str[] = "CD-ROM";
131 static const char harddisk_str[] = "HARDDISK";
132 static const char none_str[] = "NONE";
133
134
135 static inline const char * device_type_to_str(device_type_t type) {
136   switch (type) {
137   case IDE_DISK:
138     return harddisk_str;
139   case IDE_CDROM:
140     return cdrom_str;
141   case IDE_NONE:
142     return none_str;
143   default:
144     return NULL;
145   }
146 }
147
148
149 static inline void write_features(struct channel_t * channel, uchar_t value) {
150   channel->drives[0].controller.features = value;
151   channel->drives[1].controller.features = value;
152 }
153
154
155 static inline void write_sector_count(struct channel_t * channel, uchar_t value) {
156   channel->drives[0].controller.sector_count = value;
157   channel->drives[1].controller.sector_count = value;
158 }
159
160 static inline void write_sector_number(struct channel_t * channel, uchar_t value) {
161   channel->drives[0].controller.sector_no = value;
162   channel->drives[1].controller.sector_no = value;
163 }
164
165
166 static inline void write_cylinder_low(struct channel_t * channel, uchar_t value) {
167   channel->drives[0].controller.cylinder_no &= 0xff00;
168   channel->drives[0].controller.cylinder_no |= value;
169   channel->drives[1].controller.cylinder_no &= 0xff00;
170   channel->drives[1].controller.cylinder_no |= value;
171 }
172
173 static inline void write_cylinder_high(struct channel_t * channel, uchar_t value) {
174   ushort_t val2 = value;
175   val2 = val2 << 8;
176   channel->drives[0].controller.cylinder_no &= 0x00ff;
177   channel->drives[0].controller.cylinder_no |= (val2 & 0xff00);
178
179   channel->drives[1].controller.cylinder_no &= 0x00ff;
180   channel->drives[1].controller.cylinder_no |= (val2 & 0xff00);
181 }
182
183 static inline void write_head_no(struct channel_t * channel, uchar_t value) {
184   channel->drives[0].controller.head_no = value;
185   channel->drives[1].controller.head_no = value;
186 }
187
188 static inline void write_lba_mode(struct channel_t * channel, uchar_t value) {
189   channel->drives[0].controller.lba_mode = value;
190   channel->drives[1].controller.lba_mode = value;
191 }
192
193
194 static inline uint_t get_channel_no(struct ramdisk_t * ramdisk, struct channel_t * channel) {
195   return (((uchar_t *)channel - (uchar_t *)(ramdisk->channels)) / sizeof(struct channel_t));
196 }
197
198 static inline uint_t get_drive_no(struct channel_t * channel, struct drive_t * drive) {
199   return (((uchar_t *)drive - (uchar_t*)(channel->drives)) /  sizeof(struct drive_t));
200 }
201
202 static inline struct drive_t * get_selected_drive(struct channel_t * channel) {
203   return &(channel->drives[channel->drive_select]);
204 }
205
206
207 static inline int is_primary_port(struct ramdisk_t * ramdisk, ushort_t port) {
208   switch(port) 
209     {
210     case PRI_DATA_PORT:
211     case PRI_FEATURES_PORT:
212     case PRI_SECT_CNT_PORT:
213     case PRI_SECT_ADDR1_PORT:
214     case PRI_SECT_ADDR2_PORT:
215     case PRI_SECT_ADDR3_PORT:
216     case PRI_DRV_SEL_PORT:
217     case PRI_CMD_PORT:
218     case PRI_CTRL_PORT:
219       return 1;
220     default:
221       return 0;
222     }
223 }
224
225
226
227 static inline int is_secondary_port(struct ramdisk_t * ramdisk, ushort_t port) {
228   switch(port) 
229     {
230     case SEC_DATA_PORT:
231     case SEC_FEATURES_PORT:
232     case SEC_SECT_CNT_PORT:
233     case SEC_SECT_ADDR1_PORT:
234     case SEC_SECT_ADDR2_PORT:
235     case SEC_SECT_ADDR3_PORT:
236     case SEC_DRV_SEL_PORT:
237     case SEC_CMD_PORT:
238     case SEC_CTRL_PORT:
239       return 1;
240     default:
241       return 0;
242     }
243 }
244
245 static inline int num_drives_on_channel(struct channel_t * channel) {
246   if ((channel->drives[0].device_type == IDE_NONE) &&
247       (channel->drives[1].device_type == IDE_NONE)) {
248     return 0;
249   } else if ((channel->drives[0].device_type != IDE_NONE) &&
250              (channel->drives[1].device_type != IDE_NONE)) {
251     return 2;
252   } else {
253     return 1;
254   }
255 }
256
257
258
259 static inline uchar_t extract_bits(uchar_t * buf, uint_t buf_offset, uint_t bit_offset, uint_t num_bits) {
260   uchar_t val = buf[buf_offset];
261   val = val >> bit_offset;
262   val &= ((1 << num_bits) -1);
263   return val;
264 }
265
266
267 static inline uchar_t get_packet_field(struct channel_t * channel, uint_t packet_offset, uint_t bit_offset, uint_t num_bits) {
268   struct drive_t * drive = get_selected_drive(channel);
269   return extract_bits(drive->controller.buffer, packet_offset, bit_offset, num_bits);
270 }
271
272
273 static inline uchar_t get_packet_byte(struct channel_t * channel, uint_t offset) {
274   struct drive_t * drive = get_selected_drive(channel);
275   return drive->controller.buffer[offset];
276 }
277
278 static inline uint16_t get_packet_word(struct channel_t * channel, uint_t offset) {
279   struct drive_t * drive = get_selected_drive(channel);
280   uint16_t val = drive->controller.buffer[offset];
281   val = val << 8;
282   val |= drive->controller.buffer[offset + 1];
283   return val;
284 }
285
286
287 static inline uint16_t rd_read_16bit(const uint8_t* buf) {
288   return (buf[0] << 8) | buf[1];
289 }
290
291
292
293 static inline uint32_t rd_read_32bit(const uint8_t* buf) {
294   return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
295 }
296
297 ////////////////////////////////////////////////////////////////////////////
298
299
300 /*
301  * ATAPI routines
302  */
303
304
305 static void rd_init_mode_sense_single(struct vm_device * dev, struct channel_t * channel, const void * src, int size);
306
307 static void rd_command_aborted(struct vm_device * dev, struct channel_t * channel, unsigned value);
308
309
310
311
312 static int handle_atapi_packet_command(struct vm_device * dev, 
313                                        struct channel_t * channel, 
314                                        ushort_t val);
315
316 static int rd_init_send_atapi_command(struct vm_device * dev, 
317                                       struct channel_t * channel, 
318                                       Bit8u command, int req_length, 
319                                       int alloc_length, bool lazy);
320
321 static void rd_ready_to_send_atapi(struct vm_device * dev, 
322                                    struct channel_t * channel);
323
324 static void rd_atapi_cmd_error(struct vm_device * dev, 
325                                struct channel_t * channel, 
326                                sense_t sense_key, asc_t asc);
327
328 static void rd_atapi_cmd_nop(struct vm_device * dev, struct channel_t * channel);
329 static void rd_identify_ATAPI_drive(struct vm_device * dev, struct channel_t * channel);
330
331
332
333 /*
334  * Interrupt handling
335  */
336 static void rd_raise_interrupt(struct vm_device * dev, struct channel_t * channel);
337 static void rd_lower_irq(struct vm_device *dev, Bit32u irq);
338
339
340
341 /*
342  * Helper routines
343  */
344
345
346
347 #ifdef DEBUG_RAMDISK
348 static void rd_print_state(struct ramdisk_t *ramdisk);
349 static int check_bit_fields(struct controller_t * controller);
350 #endif
351 ////////////////////////////////////////////////////////////////////
352
353
354
355
356
357 int v3_ramdisk_register_cdrom(struct vm_device * dev, uint_t busID, uint_t driveID, struct cdrom_ops* cd, void * private_data) {
358   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
359   struct channel_t * channel = &(ramdisk->channels[busID]);
360   struct drive_t * drive = &(channel->drives[driveID]);
361   struct controller_t * controller = &(drive->controller);
362
363
364   
365   if (drive->device_type != IDE_NONE) {
366     PrintError("Device already registered at this location\n");
367     return -1;
368   }
369
370
371   channel->irq =  15;
372
373   // Make model string
374   strncpy((char*)(drive->model_no), "V3VEE Ramdisk", 40);
375
376   while (strlen((char *)(drive->model_no)) < 40) {
377     strcat ((char*)(drive->model_no), " ");
378   }
379   
380   PrintDebug("CDROM on target %d/%d\n", busID, driveID);
381   
382   drive->device_type = IDE_CDROM;
383   drive->cdrom.locked = 0;
384   drive->sense.sense_key = SENSE_NONE;
385   drive->sense.asc = 0;
386   drive->sense.ascq = 0;
387   
388   drive->private_data = private_data;
389
390 #ifdef DEBUG_RAMDISK
391   if (check_bit_fields(controller) == INTR_REASON_BIT_ERR) {
392     PrintDebug("interrupt reason: bit field error\n");
393     return INTR_REASON_BIT_ERR;
394   }
395 #endif
396   
397   controller->sector_count = 0;
398
399   drive->cdrom.cd = cd;
400   
401   PrintDebug("\t\tCD on ata%d-%d: '%s'\n", 
402              busID, 
403              driveID, "");
404   
405   if(drive->cdrom.cd->insert_cdrom(drive->private_data)) {
406     PrintDebug("\t\tMedia present in CD-ROM drive\n");
407     drive->cdrom.ready = 1;
408     drive->cdrom.capacity = drive->cdrom.cd->capacity(drive->private_data);
409     PrintDebug("\t\tCDROM capacity is %d\n", drive->cdrom.capacity);
410   } else {                  
411     PrintDebug("\t\tCould not locate CD-ROM, continuing with media not present\n");
412     drive->cdrom.ready = 0;
413   }
414   
415   return 0;
416 }
417
418
419 static Bit32u rd_init_hardware(struct ramdisk_t *ramdisk) {
420   uint_t channel_num; 
421   uint_t device;
422   struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
423
424   PrintDebug("[rd_init_harddrive]\n");
425
426   for (channel_num = 0; channel_num < MAX_ATA_CHANNEL; channel_num++) {
427     memset((char *)(channels + channel_num), 0, sizeof(struct channel_t));
428   }
429
430   for (channel_num = 0; channel_num < MAX_ATA_CHANNEL; channel_num++){
431     struct channel_t * channel = &(channels[channel_num]);
432
433     channel->ioaddr1 = 0x0;
434     channel->ioaddr2 = 0x0;
435     channel->irq = 0;
436
437     for (device = 0; device < 2; device++){
438       struct drive_t * drive = &(channel->drives[device]);
439       struct controller_t * controller = &(drive->controller);
440
441       controller->status.busy = 0;
442       controller->status.drive_ready = 1;
443       controller->status.write_fault = 0;
444       controller->status.seek_complete = 1;
445       controller->status.drq = 0;
446       controller->status.corrected_data = 0;
447       controller->status.index_pulse = 0;
448       controller->status.index_pulse_count = 0;
449       controller->status.err = 0;
450
451       controller->error_register = 0x01; // diagnostic code: no error
452       controller->head_no = 0;
453       controller->sector_count = 1;
454       controller->sector_no = 1;
455       controller->cylinder_no = 0;
456       controller->current_command = 0x00;
457       controller->buffer_index = 0;
458
459       controller->control.reset = 0;
460       controller->control.disable_irq = 0;
461       controller->reset_in_progress = 0;
462
463       controller->sectors_per_block = 0x80;
464       controller->lba_mode = 0;
465       
466       
467       controller->features = 0;
468         
469       // If not present
470       drive->device_type = IDE_NONE;
471
472       // Make model string
473       strncpy((char*)(drive->model_no), "", 40);
474       while(strlen((char *)(drive->model_no)) < 40) {
475         strcat ((char*)(drive->model_no), " ");
476       }
477
478     }//for device
479   }//for channel
480
481 #ifdef DEBUG_RAMDISK
482   rd_print_state(ramdisk);
483 #endif
484   return 0;
485 }
486
487
488 /*
489   static void rd_reset_harddrive(struct ramdisk_t *ramdisk, unsigned type) {
490   return;
491   }
492
493 */
494 static void rd_close_harddrive(struct ramdisk_t *ramdisk) {
495   return;
496 }
497
498
499 ////////////////////////////////////////////////////////////////////
500
501
502
503 static int read_data_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
504   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
505   struct channel_t * channel = NULL;
506   struct drive_t * drive = NULL;
507   struct controller_t * controller = NULL;
508
509
510
511   if (is_primary_port(ramdisk, port)) {
512     channel = &(ramdisk->channels[0]);
513   } else if (is_secondary_port(ramdisk, port)) {
514     channel = &(ramdisk->channels[1]);
515   } else {
516     PrintError("Invalid Port: %d\n", port);
517     return -1;
518   }
519   
520   drive = get_selected_drive(channel);
521   controller = &(drive->controller);
522
523
524   PrintDebug("[read_data_handler] IO Read at 0x%x, on drive %d/%d (current_cmd = 0x%02x)\n", 
525              port, 
526              get_channel_no(ramdisk, channel),
527              get_drive_no(channel, drive),
528              controller->current_command);
529
530   switch (controller->current_command) {
531   case 0xec:    // IDENTIFY DEVICE
532   case 0xa1:
533     {
534
535
536       controller->status.busy = 0;
537       controller->status.drive_ready = 1;
538       controller->status.write_fault = 0;
539       controller->status.seek_complete = 1;
540       controller->status.corrected_data = 0;
541       controller->status.err = 0;
542       
543       /*
544         value32 = controller->buffer[index];
545         index++;
546         
547         if (io_len >= 2) {
548         value32 |= (controller->buffer[index] << 8);
549         index++;
550         }
551         
552         if (io_len == 4) {
553         value32 |= (controller->buffer[index] << 16);
554         value32 |= (controller->buffer[index+1] << 24);
555         index += 2;
556         }
557         
558         controller->buffer_index = index;
559       */
560       /* JRL */
561       memcpy(dst, controller->buffer + controller->buffer_index, length);
562       controller->buffer_index += length;
563       
564       if (controller->buffer_index >= 512) {
565         controller->status.drq = 0;
566       }
567       
568       return length;
569     }
570   case 0xa0: //send packet cmd 
571     {
572       uint_t index = controller->buffer_index;
573
574       
575       PrintDebug("\t\tatapi.command(%02x), index(%d), cdrom.remaining_blocks(%d)\n", 
576                     drive->atapi.command, 
577                     index, 
578                     drive->cdrom.remaining_blocks);
579       
580       // Load block if necessary
581       if (index >= 2048) {
582         
583         if (index > 2048) {
584           PrintError("\t\tindex > 2048 : 0x%x\n", index);
585           return -1;
586         }
587         
588         switch (drive->atapi.command) {
589         case 0x28: // read (10)
590         case 0xa8: // read (12)
591           {
592     
593             if (!(drive->cdrom.ready)) {
594               PrintError("\t\tRead with CDROM not ready\n");
595               return -1;
596             } 
597             
598             drive->cdrom.cd->read_block(drive->private_data, controller->buffer,
599                                         drive->cdrom.next_lba);
600             drive->cdrom.next_lba++;
601             drive->cdrom.remaining_blocks--;
602             
603             
604             if (!(drive->cdrom.remaining_blocks)) {
605               PrintDebug("\t\tLast READ block loaded {CDROM}\n");
606             } else {
607               PrintDebug("\t\tREAD block loaded (%d remaining) {CDROM}\n",
608                          drive->cdrom.remaining_blocks);
609             }
610             
611             // one block transfered, start at beginning
612             index = 0;
613             break;
614           }
615         default: // no need to load a new block
616           break;
617         }
618       }
619     
620
621       /*
622         increment = 0;
623         value32 = controller->buffer[index + increment];
624         increment++;
625         
626         if (io_len >= 2) {
627         value32 |= (controller->buffer[index + increment] << 8);
628         increment++;
629         }
630         
631         if (io_len == 4) {
632         value32 |= (controller->buffer[index + increment] << 16);
633         value32 |= (controller->buffer[index + increment + 1] << 24);
634         increment += 2;
635         }
636
637         controller->buffer_index = index + increment;
638         controller->drq_index += increment;
639
640       */
641       /* JRL: CHECK THAT there is enough data in the buffer to copy.... */
642       {      
643         memcpy(dst, controller->buffer + index, length);
644         
645         controller->buffer_index  = index + length;
646         controller->drq_index += length;
647       }
648       
649       /* *** */
650       
651       if (controller->drq_index >= (unsigned)drive->atapi.drq_bytes) {
652         controller->status.drq = 0;
653         controller->drq_index = 0;
654         
655         drive->atapi.total_bytes_remaining -= drive->atapi.drq_bytes;
656         
657         if (drive->atapi.total_bytes_remaining > 0) {
658           // one or more blocks remaining (works only for single block commands)
659           
660           PrintDebug("\t\tPACKET drq bytes read\n");
661           controller->interrupt_reason.i_o = 1;
662           controller->status.busy = 0;
663           controller->status.drq = 1;
664           controller->interrupt_reason.c_d = 0;
665           
666           // set new byte count if last block
667           if (drive->atapi.total_bytes_remaining < controller->byte_count) {
668             controller->byte_count = drive->atapi.total_bytes_remaining;
669           }
670           drive->atapi.drq_bytes = controller->byte_count;
671           
672           rd_raise_interrupt(dev, channel);
673         } else {
674           // all bytes read
675           PrintDebug("\t\tPACKET all bytes read\n");
676           
677           controller->interrupt_reason.i_o = 1;
678           controller->interrupt_reason.c_d = 1;
679           controller->status.drive_ready = 1;
680           controller->interrupt_reason.rel = 0;
681           controller->status.busy = 0;
682           controller->status.drq = 0;
683           controller->status.err = 0;
684           
685           rd_raise_interrupt(dev, channel);
686         }
687       }
688       return length;
689       break;
690     }
691
692   default:
693     PrintDebug("\t\tread need support more command: %02x\n", controller->current_command);
694     break;
695   }
696
697   return -1;
698 }
699
700
701
702
703 static int write_data_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
704   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
705   struct channel_t * channel = NULL;
706   struct drive_t * drive = NULL;
707   struct controller_t * controller = NULL;
708
709   if (is_primary_port(ramdisk, port)) {
710     channel = &(ramdisk->channels[0]);
711   } else if (is_secondary_port(ramdisk, port)) {
712     channel = &(ramdisk->channels[1]);
713   } else {
714     PrintError("Invalid Port: %d\n", port);
715     return -1;
716   }
717   
718   drive = get_selected_drive(channel);
719   controller = &(drive->controller);
720
721   PrintDebug("[write_data_handler] IO write at 0x%x, current_cmd = 0x%02x\n", 
722              port, controller->current_command);
723   
724   switch (controller->current_command) {
725   case 0x30: // WRITE SECTORS
726     PrintError("\t\tneed to implement 0x30(write sector) to port 0x%x\n", port);
727     return -1;
728     
729   case 0xa0: // PACKET
730     
731     if (handle_atapi_packet_command(dev, channel, *(ushort_t *)src) == -1) {
732       return -1;
733     }
734
735     return length;
736     
737   default:
738     PrintError("\t\tIO write(0x%x): current command is %02xh\n", 
739                port, controller->current_command);
740
741     return -1;
742   }
743 }
744
745
746
747
748
749
750
751 static int read_status_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
752   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
753   struct channel_t * channel = NULL;
754   struct drive_t * drive = NULL;
755   struct controller_t * controller = NULL;
756
757
758   if (length != 1) {
759     PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
760     return -1;
761   }
762
763   if (is_primary_port(ramdisk, port)) {
764     channel = &(ramdisk->channels[0]);
765   } else if (is_secondary_port(ramdisk, port)) {
766     channel = &(ramdisk->channels[1]);
767   } else {
768     PrintError("Invalid Port: %d\n", port);
769     return -1;
770   }
771   
772   drive = get_selected_drive(channel);
773   controller = &(drive->controller);
774
775   PrintDebug("[read_status_handler] IO read at 0x%x, on drive %d/%d\n", 
776              port, get_channel_no(ramdisk, channel), 
777              channel->drive_select);
778
779
780   if (num_drives_on_channel(channel) == 0) {
781     // (mch) Just return zero for these registers
782     memset(dst, 0, length);
783
784   } else {
785     uchar_t val = (
786                    (controller->status.busy << 7)            |
787                    (controller->status.drive_ready << 6)     |
788                    (controller->status.write_fault << 5)     |
789                    (controller->status.seek_complete << 4)   |
790                    (controller->status.drq << 3)             |
791                    (controller->status.corrected_data << 2)  |
792                    (controller->status.index_pulse << 1)     |
793                    (controller->status.err) );
794    
795     memcpy(dst, &val, length);
796
797     controller->status.index_pulse_count++;
798     controller->status.index_pulse = 0;
799     
800     if (controller->status.index_pulse_count >= INDEX_PULSE_CYCLE) {
801       controller->status.index_pulse = 1;
802       controller->status.index_pulse_count = 0;
803     }
804   }
805   
806   if ((port == SEC_CMD_PORT) || (port == PRI_CMD_PORT)) {
807     rd_lower_irq(dev, channel->irq);
808   }
809   
810   return length;
811   
812 }
813
814
815 static int write_cmd_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
816   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
817   struct channel_t * channel = NULL;
818   struct drive_t * drive = NULL;
819   struct controller_t * controller = NULL;
820   uchar_t value = *(uchar_t *)src;
821
822   if (length != 1) {
823     PrintError("Invalid Command port write length: %d (port=%d)\n", length, port);
824     return -1;
825   }
826
827   if (is_primary_port(ramdisk, port)) {
828     channel = &(ramdisk->channels[0]);
829   } else if (is_secondary_port(ramdisk, port)) {
830     channel = &(ramdisk->channels[1]);
831   } else {
832     PrintError("Invalid Port: %d\n", port);
833     return -1;
834   }
835   
836   drive = get_selected_drive(channel);
837   controller = &(drive->controller);
838
839
840   PrintDebug("[write_command_handler] IO write at 0x%x, on drive %d/%d (val = 0x%x)\n", 
841              port, get_channel_no(ramdisk, channel), 
842              channel->drive_select, 
843              value);
844
845   switch (value) {
846   case 0xec: // IDENTIFY DEVICE
847     {
848       if (drive->device_type == IDE_NONE) {
849         PrintError("\t\tError: disk ata%d-%d not present, aborting\n", 
850                    get_channel_no(ramdisk, channel), 
851                    get_drive_no(channel, drive));
852         rd_command_aborted(dev, channel, value);
853         break;
854       } else if (drive->device_type == IDE_CDROM) {
855         controller->head_no        = 0;
856         controller->sector_count   = 1;
857         controller->sector_no      = 1;
858         controller->cylinder_no    = 0xeb14;
859         rd_command_aborted(dev, channel, 0xec);
860       } else {
861         PrintError("\t\tError: Want to identify HDD!!\n");
862         /*
863           SELECTED_CONTROLLER(channel).current_command = value;
864           SELECTED_CONTROLLER(channel).error_register = 0;
865           
866           // See ATA/ATAPI-4, 8.12
867           SELECTED_CONTROLLER(channel).status.busy  = 0;
868           SELECTED_CONTROLLER(channel).status.drive_ready = 1;
869           SELECTED_CONTROLLER(channel).status.write_fault = 0;
870           SELECTED_CONTROLLER(channel).status.drq   = 1;
871           SELECTED_CONTROLLER(channel).status.err   = 0;
872           
873           SELECTED_CONTROLLER(channel).status.seek_complete = 1;
874           SELECTED_CONTROLLER(channel).status.corrected_data = 0;
875           
876           SELECTED_CONTROLLER(channel).buffer_index = 0;
877           raise_interrupt(channel);
878           identify_drive(channel);
879         */
880       }
881
882     break;
883     }
884     // ATAPI commands
885   case 0xa1: // IDENTIFY PACKET DEVICE
886     {
887       if (drive->device_type == IDE_CDROM) {
888         controller->current_command = value;
889         controller->error_register = 0;
890         
891         controller->status.busy = 0;
892         controller->status.drive_ready = 1;
893         controller->status.write_fault = 0;
894         controller->status.drq   = 1;
895         controller->status.err   = 0;
896         
897         controller->status.seek_complete = 1;
898         controller->status.corrected_data = 0;
899         
900         controller->buffer_index = 0;
901         rd_raise_interrupt(dev, channel);
902         rd_identify_ATAPI_drive(dev, channel);
903       } else {
904         rd_command_aborted(dev, channel, 0xa1);
905       }
906       break;
907     }
908   case 0xa0: // SEND PACKET (atapi)
909     {
910       if (drive->device_type == IDE_CDROM) {
911         // PACKET
912         
913         if (controller->features & (1 << 0)) {
914           PrintError("\t\tPACKET-DMA not supported");
915           return -1;
916         }
917         
918         if (controller->features & (1 << 1)) {
919           PrintError("\t\tPACKET-overlapped not supported");
920           return -1;
921         }
922         
923         // We're already ready!
924         controller->sector_count = 1;
925         controller->status.busy = 0;
926         controller->status.write_fault = 0;
927
928         // serv bit??
929         controller->status.drq = 1;
930         controller->status.err = 0;
931         
932         // NOTE: no interrupt here
933         controller->current_command = value;
934         controller->buffer_index = 0;
935       } else {
936         rd_command_aborted (dev, channel, 0xa0);
937       }
938       break;
939     }
940   default:
941     PrintError("\t\tneed translate command %2x\n", value);
942     //return -1;
943     /* JRL THIS NEEDS TO CHANGE */
944     return length;
945
946   }
947   return length;
948 }
949
950
951 static int write_ctrl_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
952   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
953   struct channel_t * channel = NULL;
954   struct drive_t * master_drive = NULL;
955   struct drive_t * slave_drive = NULL;
956   struct controller_t * controller = NULL;
957   uchar_t value = *(uchar_t *)src;
958   rd_bool prev_control_reset;
959
960   if (length != 1) {
961     PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
962     return -1;
963   }
964
965   if (is_primary_port(ramdisk, port)) {
966     channel = &(ramdisk->channels[0]);
967   } else if (is_secondary_port(ramdisk, port)) {
968     channel = &(ramdisk->channels[1]);
969   } else {
970     PrintError("Invalid Port: %d\n", port);
971     return -1;
972   }
973
974   master_drive = &(channel->drives[0]);
975   slave_drive = &(channel->drives[1]);
976
977   controller = &(get_selected_drive(channel)->controller);
978
979
980   PrintDebug("[write_control_handler] IO write at 0x%x, on drive %d/%d (val = 0x%x)\n", 
981              port, get_channel_no(ramdisk, channel), 
982              channel->drive_select, 
983              value);
984
985   // (mch) Even if device 1 was selected, a write to this register
986   // goes to device 0 (if device 1 is absent)
987   
988   prev_control_reset = controller->control.reset;
989
990   master_drive->controller.control.reset         = value & 0x04;
991   slave_drive->controller.control.reset         = value & 0x04;
992
993   // CGS: was: SELECTED_CONTROLLER(channel).control.disable_irq    = value & 0x02;
994   master_drive->controller.control.disable_irq = value & 0x02;
995   slave_drive->controller.control.disable_irq = value & 0x02;
996   
997   PrintDebug("\t\tadpater control reg: reset controller = %d\n",
998                 (unsigned) (controller->control.reset) ? 1 : 0);
999   PrintDebug("\t\tadpater control reg: disable_irq(X) = %d\n",
1000                 (unsigned) (controller->control.disable_irq) ? 1 : 0);
1001   
1002   if ((!prev_control_reset) && (controller->control.reset)) {
1003     uint_t id = 0;
1004
1005     // transition from 0 to 1 causes all drives to reset
1006     PrintDebug("\t\thard drive: RESET\n");
1007     
1008     // (mch) Set BSY, drive not ready
1009     for (id = 0; id < 2; id++) {
1010       struct controller_t * ctrl = NULL;
1011
1012       if (id == 0) {
1013         ctrl = &(master_drive->controller);
1014       } else if (id == 1) {
1015         ctrl = &(slave_drive->controller);
1016       }
1017
1018       ctrl->status.busy           = 1;
1019       ctrl->status.drive_ready    = 0;
1020       ctrl->reset_in_progress     = 1;
1021       
1022       ctrl->status.write_fault    = 0;
1023       ctrl->status.seek_complete  = 1;
1024       ctrl->status.drq            = 0;
1025       ctrl->status.corrected_data = 0;
1026       ctrl->status.err            = 0;
1027       
1028       ctrl->error_register = 0x01; // diagnostic code: no error
1029       
1030       ctrl->current_command = 0x00;
1031       ctrl->buffer_index = 0;
1032       
1033       ctrl->sectors_per_block = 0x80;
1034       ctrl->lba_mode          = 0;
1035       
1036       ctrl->control.disable_irq = 0;
1037     }
1038
1039     rd_lower_irq(dev, channel->irq);
1040
1041   } else if ((controller->reset_in_progress) &&
1042              (!controller->control.reset)) {
1043     uint_t id;
1044     // Clear BSY and DRDY
1045     PrintDebug("\t\tReset complete {%s}\n", device_type_to_str(get_selected_drive(channel)->device_type));
1046
1047     for (id = 0; id < 2; id++) {
1048       struct controller_t * ctrl = NULL;
1049       struct drive_t * drv = NULL;
1050
1051       if (id == 0) {
1052         ctrl = &(master_drive->controller);
1053         drv = master_drive;
1054       } else if (id == 1) {
1055         ctrl = &(slave_drive->controller);
1056         drv = slave_drive;
1057       }
1058
1059       ctrl->status.busy           = 0;
1060       ctrl->status.drive_ready    = 1;
1061       ctrl->reset_in_progress     = 0;
1062       
1063       // Device signature
1064       if (drv->device_type == IDE_DISK) {
1065         PrintDebug("\t\tdrive %d/%d is harddrive\n", get_channel_no(ramdisk, channel), id);
1066         ctrl->head_no        = 0;
1067         ctrl->sector_count   = 1;
1068         ctrl->sector_no      = 1;
1069         ctrl->cylinder_no    = 0;
1070       } else {
1071         ctrl->head_no        = 0;
1072         ctrl->sector_count   = 1;
1073         ctrl->sector_no      = 1;
1074         ctrl->cylinder_no    = 0xeb14;
1075       }
1076     }
1077   }
1078
1079   PrintDebug("\t\ts[0].controller.control.disable_irq = %02x\n", 
1080              master_drive->controller.control.disable_irq);
1081   PrintDebug("\t\ts[1].controller.control.disable_irq = %02x\n", 
1082              slave_drive->controller.control.disable_irq);
1083   return length;
1084 }
1085
1086
1087 static int read_general_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
1088   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
1089   struct channel_t * channel = NULL;
1090   struct drive_t * drive = NULL;
1091   struct controller_t * controller = NULL;
1092
1093
1094   if (length != 1) {
1095     PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
1096     return -1;
1097   }
1098
1099   if (is_primary_port(ramdisk, port)) {
1100     channel = &(ramdisk->channels[0]);
1101   } else if (is_secondary_port(ramdisk, port)) {
1102     channel = &(ramdisk->channels[1]);
1103   } else {
1104     PrintError("Invalid Port: %d\n", port);
1105     return -1;
1106   }
1107   
1108   drive = get_selected_drive(channel);
1109   controller = &(drive->controller);
1110
1111
1112   PrintDebug("[read_general_handler] IO read addr at %x, on drive %d/%d, curcmd = %02x\n", 
1113              port, get_channel_no(ramdisk, channel), 
1114              channel->drive_select, 
1115              controller->current_command);
1116   
1117
1118   switch (port) {
1119   case PRI_FEATURES_PORT:
1120   case SEC_FEATURES_PORT: // hard disk error register 0x1f1
1121     {    
1122       uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->error_register;
1123       
1124       controller->status.err = 0;
1125       
1126       *(uchar_t *)dst = val;
1127       return length;
1128       
1129       break;
1130     }
1131
1132   case PRI_SECT_CNT_PORT:
1133   case SEC_SECT_CNT_PORT:  // hard disk sector count / interrupt reason 0x1f2
1134     {
1135       uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_count;
1136
1137       *(uchar_t *)dst = val;
1138       return length;
1139
1140       break;
1141     }
1142   case PRI_SECT_ADDR1_PORT:
1143   case SEC_SECT_ADDR1_PORT: // sector number 0x1f3
1144     {
1145       uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_no;
1146
1147       *(uchar_t *)dst = val;
1148       return length;
1149
1150       break;
1151     }
1152
1153   case PRI_SECT_ADDR2_PORT:
1154   case SEC_SECT_ADDR2_PORT:  // cylinder low 0x1f4  
1155     {
1156       // -- WARNING : On real hardware the controller registers are shared between drives. 
1157       // So we must respond even if the select device is not present. Some OS uses this fact 
1158       // to detect the disks.... minix2 for example
1159       uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no & 0x00ff);
1160
1161       *(uchar_t *)dst = val;
1162       return length;
1163
1164       break;      
1165   }
1166
1167   case PRI_SECT_ADDR3_PORT:
1168   case SEC_SECT_ADDR3_PORT: // cylinder high 0x1f5
1169     {
1170       // -- WARNING : On real hardware the controller registers are shared between drives. 
1171       // So we must respond even if the select device is not present. Some OS uses this fact 
1172       // to detect the disks.... minix2 for example
1173       uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no >> 8);
1174
1175       *(uchar_t *)dst = val;
1176       return length;
1177
1178       break;    
1179     }
1180   case PRI_DRV_SEL_PORT:
1181   case SEC_DRV_SEL_PORT:  // hard disk drive and head register 0x1f6
1182     {
1183       // b7 Extended data field for ECC
1184       // b6/b5: Used to be sector size.  00=256,01=512,10=1024,11=128
1185       //   Since 512 was always used, bit 6 was taken to mean LBA mode:
1186       //     b6 1=LBA mode, 0=CHS mode
1187       //     b5 1
1188       // b4: DRV
1189       // b3..0 HD3..HD0
1190       uchar_t val = ((1 << 7)                          |
1191                      ((controller->lba_mode > 0) << 6) |
1192                      (1 << 5)                          |            // 01b = 512 sector size
1193                      (channel->drive_select << 4)      |
1194                      (controller->head_no << 0));
1195       
1196       *(uchar_t *)dst = val;
1197       return length;
1198
1199       break;
1200     }
1201  case PRI_ADDR_REG_PORT:
1202  case SEC_ADDR_REG_PORT: // Hard Disk Address Register 0x3f7
1203    {
1204      // Obsolete and unsupported register.  Not driven by hard
1205      // disk controller.  Report all 1's.  If floppy controller
1206      // is handling this address, it will call this function
1207      // set/clear D7 (the only bit it handles), then return
1208      // the combined value
1209      *(uchar_t *)dst = 0xff;
1210      return length;
1211     }
1212
1213   default:
1214     PrintError("Invalid Port: %d\n", port);
1215     return -1;
1216   }
1217 }
1218
1219
1220
1221
1222 static int write_general_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
1223   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
1224   struct channel_t * channel = NULL;
1225   struct drive_t * drive = NULL;
1226   struct controller_t * controller = NULL;
1227   uchar_t value = *(uchar_t *)src;
1228
1229   if (length != 1) {
1230     PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
1231     return -1;
1232   }
1233
1234   if (is_primary_port(ramdisk, port)) {
1235     channel = &(ramdisk->channels[0]);
1236   } else if (is_secondary_port(ramdisk, port)) {
1237     channel = &(ramdisk->channels[1]);
1238   } else {
1239     PrintError("Invalid Port: %d\n", port);
1240     return -1;
1241   }
1242   
1243   drive = get_selected_drive(channel);
1244   controller = &(drive->controller);
1245
1246
1247   PrintDebug("[write_general_handler] IO write to port %x (val=0x%02x), channel = %d\n", 
1248              port,  value, get_channel_no(ramdisk, channel));
1249
1250   switch (port) {
1251
1252   case PRI_FEATURES_PORT:
1253   case SEC_FEATURES_PORT: // hard disk write precompensation 0x1f1
1254     {
1255       write_features(channel, value);
1256       break;
1257     }
1258   case PRI_SECT_CNT_PORT:
1259   case SEC_SECT_CNT_PORT: // hard disk sector count 0x1f2
1260     {
1261       write_sector_count(channel, value);
1262       break;
1263     }
1264   case PRI_SECT_ADDR1_PORT:
1265   case SEC_SECT_ADDR1_PORT: // hard disk sector number 0x1f3
1266     {
1267       write_sector_number(channel, value);
1268       break;
1269     }
1270   case PRI_SECT_ADDR2_PORT:
1271   case SEC_SECT_ADDR2_PORT: // hard disk cylinder low 0x1f4
1272     {
1273       write_cylinder_low(channel, value);
1274       break;
1275     }
1276   case PRI_SECT_ADDR3_PORT:
1277   case SEC_SECT_ADDR3_PORT: // hard disk cylinder high 0x1f5
1278     {
1279       write_cylinder_high(channel, value);
1280       break;
1281     }
1282   case PRI_DRV_SEL_PORT:
1283   case SEC_DRV_SEL_PORT: // hard disk drive and head register 0x1f6
1284     {
1285       // b7 Extended data field for ECC
1286       // b6/b5: Used to be sector size.  00=256,01=512,10=1024,11=128
1287       //   Since 512 was always used, bit 6 was taken to mean LBA mode:
1288       //     b6 1=LBA mode, 0=CHS mode
1289       //     b5 1
1290       // b4: DRV
1291       // b3..0 HD3..HD0
1292
1293       // 1x1xxxxx
1294
1295       PrintDebug("\tDrive Select value=%x\n", value);
1296
1297       if ((value & 0xa0) != 0xa0) { 
1298         PrintDebug("\t\tIO write 0x%x (%02x): not 1x1xxxxxb\n", port, (unsigned) value);
1299       }
1300       
1301       write_head_no(channel, value & 0xf);
1302       if ((controller->lba_mode == 0) && (((value >> 6) & 1) == 1)) {
1303         PrintDebug("\t\tenabling LBA mode\n");
1304       }
1305
1306       write_lba_mode(channel, (value >> 6) & 1);
1307
1308
1309
1310       if (drive->cdrom.cd) {
1311         PrintDebug("\t\tSetting LBA on CDROM: %d\n", (value >> 6) & 1);
1312         drive->cdrom.cd->set_LBA(drive->private_data, (value >> 6) & 1);
1313       }
1314       
1315
1316       channel->drive_select = (value >> 4) & 0x01;
1317       drive = get_selected_drive(channel);
1318
1319       if (drive->device_type == IDE_NONE) {
1320         PrintDebug("\t\tError: device set to %d which does not exist! channel = 0x%x\n",
1321                    channel->drive_select, get_channel_no(ramdisk, channel));
1322
1323         controller->error_register = 0x04; // aborted
1324         controller->status.err = 1;
1325       }
1326       
1327       break;
1328     }
1329   default:
1330     PrintError("\t\thard drive: io write to unhandled port 0x%x  (value = %c)\n", port, value);
1331     //return -1;
1332   }
1333
1334   return length;
1335 }
1336
1337
1338  
1339
1340
1341 static void rd_raise_interrupt(struct vm_device * dev, struct channel_t * channel) {
1342   Bit32u irq;
1343   //  struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
1344   struct drive_t * drive = get_selected_drive(channel);
1345   struct controller_t * controller = &(drive->controller);
1346
1347   PrintDebug("[raise_interrupt] disable_irq = %02x\n", controller->control.disable_irq);
1348
1349   if (!(controller->control.disable_irq)) {
1350     irq = channel->irq; 
1351  
1352     PrintDebug("\t\tRaising interrupt %d {%s}\n\n", irq, device_type_to_str(drive->device_type));
1353
1354     dev->vm->vm_ops.raise_irq(dev->vm, irq);
1355   } else {
1356     PrintDebug("\t\tirq is disabled\n");
1357   }
1358   
1359   return;
1360 }
1361
1362 static void rd_lower_irq(struct vm_device *dev, Bit32u irq)  // __attribute__(regparm(1))
1363 {
1364   PrintDebug("[lower_irq] irq = %d\n", irq);
1365   dev->vm->vm_ops.lower_irq(dev->vm, irq);
1366 }
1367
1368
1369
1370
1371
1372
1373
1374 //////////////////////////////////////////////////////////////////////////
1375
1376 /*
1377  * ATAPI subroutines
1378  */
1379
1380
1381
1382 int handle_atapi_packet_command(struct vm_device * dev, struct channel_t * channel, ushort_t value) {
1383   struct ramdisk_t * ramdisk  = (struct ramdisk_t *)(dev->private_data);
1384   struct drive_t * drive = get_selected_drive(channel);
1385   struct controller_t * controller = &(drive->controller);
1386
1387   if (controller->buffer_index >= PACKET_SIZE) {
1388     PrintError("ATAPI packet exceeded maximum length: buffer_index (%d) >= PACKET_SIZE\n", 
1389                controller->buffer_index);
1390     return -1;
1391   }
1392
1393   controller->buffer[controller->buffer_index] = value;
1394   controller->buffer[controller->buffer_index + 1] = (value >> 8);
1395   controller->buffer_index += 2;
1396   
1397   
1398   /* if packet completely writtten */
1399   if (controller->buffer_index >= PACKET_SIZE) {
1400     // complete command received
1401     Bit8u atapi_command = controller->buffer[0];
1402     
1403     PrintDebug("\t\tcdrom: ATAPI command 0x%x started\n", atapi_command);
1404     
1405     switch (atapi_command) {
1406     case 0x00: // test unit ready
1407       {
1408         if (drive->cdrom.ready) {
1409           rd_atapi_cmd_nop(dev, channel);
1410         } else {
1411           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1412         }
1413         
1414         rd_raise_interrupt(dev, channel);
1415         
1416         break;
1417       }
1418     case 0x03:  // request sense
1419       {
1420         int alloc_length = controller->buffer[4];
1421
1422         if (rd_init_send_atapi_command(dev, channel, atapi_command, 18, alloc_length, false) == -1) {
1423           return -1;
1424         }
1425         
1426         // sense data
1427         controller->buffer[0] = 0x70 | (1 << 7);
1428         controller->buffer[1] = 0;
1429         controller->buffer[2] = drive->sense.sense_key;
1430         controller->buffer[3] = drive->sense.information.arr[0];
1431         controller->buffer[4] = drive->sense.information.arr[1];
1432         controller->buffer[5] = drive->sense.information.arr[2];
1433         controller->buffer[6] = drive->sense.information.arr[3];
1434         controller->buffer[7] = 17 - 7;
1435         controller->buffer[8] = drive->sense.specific_inf.arr[0];
1436         controller->buffer[9] = drive->sense.specific_inf.arr[1];
1437         controller->buffer[10] = drive->sense.specific_inf.arr[2];
1438         controller->buffer[11] = drive->sense.specific_inf.arr[3];
1439         controller->buffer[12] = drive->sense.asc;
1440         controller->buffer[13] = drive->sense.ascq;
1441         controller->buffer[14] = drive->sense.fruc;
1442         controller->buffer[15] = drive->sense.key_spec.arr[0];
1443         controller->buffer[16] = drive->sense.key_spec.arr[1];
1444         controller->buffer[17] = drive->sense.key_spec.arr[2];
1445         
1446         rd_ready_to_send_atapi(dev, channel);
1447         break;
1448       }
1449     case 0x1b:  // start stop unit
1450       {
1451         //bx_bool Immed = (controller->buffer[1] >> 0) & 1;
1452         rd_bool LoEj = (controller->buffer[4] >> 1) & 1;
1453         rd_bool Start = (controller->buffer[4] >> 0) & 1;
1454
1455         // stop the disc
1456         if ((!LoEj) && (!Start)) { 
1457           PrintError("FIXME: Stop disc not implemented\n");
1458
1459           rd_atapi_cmd_nop(dev, channel);
1460           rd_raise_interrupt(dev, channel);
1461         } else if (!LoEj && Start) { // start (spin up) the disc
1462           
1463           drive->cdrom.cd->start_cdrom(drive->private_data);
1464           
1465           PrintError("FIXME: ATAPI start disc not reading TOC\n");
1466           rd_atapi_cmd_nop(dev, channel);
1467           rd_raise_interrupt(dev, channel);
1468         } else if (LoEj && !Start) { // Eject the disc
1469           rd_atapi_cmd_nop(dev, channel);
1470           
1471           if (drive->cdrom.ready) {
1472             
1473             drive->cdrom.cd->eject_cdrom(drive->private_data);
1474             
1475             drive->cdrom.ready = 0;
1476             //bx_options.atadevice[channel][SLAVE_SELECTED(channel)].Ostatus->set(EJECTED);
1477             //bx_gui->update_drive_status_buttons();
1478           }
1479           rd_raise_interrupt(dev, channel);
1480         } else { // Load the disc
1481           // My guess is that this command only closes the tray, that's a no-op for us
1482           rd_atapi_cmd_nop(dev, channel);
1483           rd_raise_interrupt(dev, channel);
1484         }
1485         break;
1486       }
1487     case 0xbd: // mechanism status
1488       {
1489         uint16_t alloc_length = rd_read_16bit(controller->buffer + 8);
1490         
1491         if (alloc_length == 0) {
1492           PrintError("Zero allocation length to MECHANISM STATUS not impl.\n");
1493           return -1;
1494         }
1495         
1496         if (rd_init_send_atapi_command(dev, channel, atapi_command, 8, alloc_length, false) == -1) {
1497           return -1;
1498         }
1499         
1500         controller->buffer[0] = 0; // reserved for non changers
1501         controller->buffer[1] = 0; // reserved for non changers
1502         
1503         controller->buffer[2] = 0; // Current LBA (TODO!)
1504         controller->buffer[3] = 0; // Current LBA (TODO!)
1505         controller->buffer[4] = 0; // Current LBA (TODO!)
1506         
1507         controller->buffer[5] = 1; // one slot
1508         
1509         controller->buffer[6] = 0; // slot table length
1510         controller->buffer[7] = 0; // slot table length
1511         
1512         rd_ready_to_send_atapi(dev, channel);
1513         break;
1514       }
1515     case 0x5a:  // mode sense
1516       {
1517         uint16_t alloc_length = rd_read_16bit(controller->buffer + 7);
1518         
1519         Bit8u PC = controller->buffer[2] >> 6;
1520         Bit8u PageCode = controller->buffer[2] & 0x3f;
1521         
1522         switch (PC) {
1523         case 0x0: // current values
1524           {
1525             switch (PageCode) {
1526             case 0x01: // error recovery
1527               {
1528                 
1529                 if (rd_init_send_atapi_command(dev, channel, atapi_command, sizeof(struct error_recovery_t) + 8, alloc_length, false) == -1) {
1530                   return -1;
1531                 }
1532                 
1533                 rd_init_mode_sense_single(dev, channel, &(drive->cdrom.current.error_recovery),
1534                                           sizeof(struct error_recovery_t));
1535                 rd_ready_to_send_atapi(dev, channel);
1536                 break;
1537               }
1538             case 0x2a: // CD-ROM capabilities & mech. status
1539               {
1540
1541                 if (rd_init_send_atapi_command(dev, channel, atapi_command, 28, alloc_length, false) == -1) {
1542                   return -1;
1543                 }
1544
1545                 rd_init_mode_sense_single(dev, channel, &(controller->buffer[8]), 28);
1546                 
1547                 controller->buffer[8] = 0x2a;
1548                 controller->buffer[9] = 0x12;
1549                 controller->buffer[10] = 0x00;
1550                 controller->buffer[11] = 0x00;
1551                 // Multisession, Mode 2 Form 2, Mode 2 Form 1
1552                 controller->buffer[12] = 0x70; 
1553                 controller->buffer[13] = (3 << 5);
1554                 controller->buffer[14] = (unsigned char) (1 |
1555                                                           (drive->cdrom.locked ? (1 << 1) : 0) |
1556                                                           (1 << 3) |
1557                                                           (1 << 5));
1558                 controller->buffer[15] = 0x00;
1559                 controller->buffer[16] = (706 >> 8) & 0xff;
1560                 controller->buffer[17] = 706 & 0xff;
1561                 controller->buffer[18] = 0;
1562                 controller->buffer[19] = 2;
1563                 controller->buffer[20] = (512 >> 8) & 0xff;
1564                 controller->buffer[21] = 512 & 0xff;
1565                 controller->buffer[22] = (706 >> 8) & 0xff;
1566                 controller->buffer[23] = 706 & 0xff;
1567                 controller->buffer[24] = 0;
1568                 controller->buffer[25] = 0;
1569                 controller->buffer[26] = 0;
1570                 controller->buffer[27] = 0;
1571                 rd_ready_to_send_atapi(dev, channel);
1572                 break;
1573               }
1574             case 0x0d: // CD-ROM
1575             case 0x0e: // CD-ROM audio control
1576             case 0x3f: // all
1577               {
1578                 PrintError("Ramdisk: cdrom: MODE SENSE (curr), code=%x not implemented yet\n",
1579                          PageCode);
1580                 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1581                                    ASC_INV_FIELD_IN_CMD_PACKET);
1582                 rd_raise_interrupt(dev, channel);
1583                 break;
1584               }
1585             default:
1586               {
1587                 // not implemeted by this device
1588                 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1589                               PC, PageCode);
1590                 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1591                                    ASC_INV_FIELD_IN_CMD_PACKET);
1592                 rd_raise_interrupt(dev, channel);
1593                 break;
1594               }
1595             }
1596             break;
1597           }
1598         case 0x1: // changeable values
1599           {
1600             switch (PageCode) {
1601             case 0x01: // error recovery
1602             case 0x0d: // CD-ROM
1603             case 0x0e: // CD-ROM audio control
1604             case 0x2a: // CD-ROM capabilities & mech. status
1605             case 0x3f: // all
1606               {
1607                 PrintError("cdrom: MODE SENSE (chg), code=%x not implemented yet\n",
1608                            PageCode);
1609                 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1610                                    ASC_INV_FIELD_IN_CMD_PACKET);
1611                 rd_raise_interrupt(dev, channel);
1612                 break;
1613               }
1614             default:
1615               {
1616                 // not implemeted by this device
1617                 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1618                            PC, PageCode);
1619                 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1620                                    ASC_INV_FIELD_IN_CMD_PACKET);
1621                 rd_raise_interrupt(dev, channel);
1622                 break;
1623               }
1624             }
1625             break;
1626           }
1627         case 0x2: // default values
1628           {
1629             switch (PageCode) {
1630             case 0x01: // error recovery
1631             case 0x0d: // CD-ROM
1632             case 0x0e: // CD-ROM audio control
1633             case 0x2a: // CD-ROM capabilities & mech. status
1634             case 0x3f: // all
1635               PrintError("cdrom: MODE SENSE (dflt), code=%x\n",
1636                        PageCode);
1637               return -1;
1638               
1639             default:
1640               {
1641                 // not implemeted by this device
1642                 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1643                               PC, PageCode);
1644                 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1645                                    ASC_INV_FIELD_IN_CMD_PACKET);
1646                 rd_raise_interrupt(dev, channel);
1647                 break;
1648               }
1649             }
1650             break;
1651           }
1652         case 0x3: // saved values not implemented
1653           {
1654             rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1655             rd_raise_interrupt(dev, channel);
1656             break;
1657           }
1658         default:
1659           {
1660             PrintError("Should not get here!\n");
1661             return -1;
1662             break;
1663           }
1664         }
1665         break;
1666       }
1667     case 0x12: // inquiry
1668       { 
1669         uint8_t alloc_length = controller->buffer[4];
1670         
1671         if (rd_init_send_atapi_command(dev, channel, atapi_command, 36, alloc_length, false) == -1) {
1672           return -1;
1673         }
1674         
1675         controller->buffer[0] = 0x05; // CD-ROM
1676         controller->buffer[1] = 0x80; // Removable
1677         controller->buffer[2] = 0x00; // ISO, ECMA, ANSI version
1678         controller->buffer[3] = 0x21; // ATAPI-2, as specified
1679         controller->buffer[4] = 31; // additional length (total 36)
1680         controller->buffer[5] = 0x00; // reserved
1681         controller->buffer[6] = 0x00; // reserved
1682         controller->buffer[7] = 0x00; // reserved
1683         
1684         // Vendor ID
1685         const char* vendor_id = "VTAB    ";
1686         int i;
1687         for (i = 0; i < 8; i++) {
1688           controller->buffer[8+i] = vendor_id[i];
1689         }
1690
1691         // Product ID
1692         const char* product_id = "Turbo CD-ROM    ";
1693         for (i = 0; i < 16; i++) {
1694           controller->buffer[16+i] = product_id[i];
1695         }
1696
1697         // Product Revision level
1698         const char* rev_level = "1.0 "; 
1699         for (i = 0; i < 4; i++) {
1700           controller->buffer[32 + i] = rev_level[i];
1701         }
1702
1703         rd_ready_to_send_atapi(dev, channel);
1704         break;
1705       }
1706     case 0x25:  // read cd-rom capacity
1707       {
1708         // no allocation length???
1709         if (rd_init_send_atapi_command(dev, channel, atapi_command, 8, 8, false) == -1) {
1710           return -1;
1711         }
1712         
1713         if (drive->cdrom.ready) {
1714           uint32_t capacity = drive->cdrom.capacity;
1715
1716           PrintDebug("\t\tCapacity is %d sectors (%d bytes)\n", capacity, capacity * 2048);
1717
1718           controller->buffer[0] = (capacity >> 24) & 0xff;
1719           controller->buffer[1] = (capacity >> 16) & 0xff;
1720           controller->buffer[2] = (capacity >> 8) & 0xff;
1721           controller->buffer[3] = (capacity >> 0) & 0xff;
1722           controller->buffer[4] = (2048 >> 24) & 0xff;
1723           controller->buffer[5] = (2048 >> 16) & 0xff;
1724           controller->buffer[6] = (2048 >> 8) & 0xff;
1725           controller->buffer[7] = (2048 >> 0) & 0xff;
1726
1727           rd_ready_to_send_atapi(dev, channel);
1728         } else {
1729           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1730           rd_raise_interrupt(dev, channel);
1731         }
1732         break;
1733       }
1734       
1735       
1736     case 0xbe:  // read cd
1737       {
1738         if (drive->cdrom.ready) {
1739           PrintError("Read CD with CD present not implemented\n");
1740           rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1741           rd_raise_interrupt(dev, channel);
1742         } else {
1743           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1744           rd_raise_interrupt(dev, channel);
1745         }
1746         break;
1747       }
1748     case 0x43: // read toc
1749       { 
1750         if (drive->cdrom.ready) {
1751           int toc_length;  
1752           bool msf = (controller->buffer[1] >> 1) & 1;
1753           uint8_t starting_track = controller->buffer[6];
1754           
1755           uint16_t alloc_length = rd_read_16bit(controller->buffer + 7);
1756           
1757           uint8_t format = (controller->buffer[9] >> 6);
1758           int i;
1759           switch (format) {
1760           case 0:
1761             
1762             if (!(drive->cdrom.cd->read_toc(drive->private_data, controller->buffer,
1763                                             &toc_length, msf, starting_track))) {
1764               PrintDebug("CDROM: Reading Table of Contents Failed\n");
1765               rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1766                                  ASC_INV_FIELD_IN_CMD_PACKET);
1767               rd_raise_interrupt(dev, channel);
1768             } else {
1769               if (rd_init_send_atapi_command(dev, channel, atapi_command, toc_length, alloc_length, false) == -1) {
1770                 return -1;
1771               }
1772               rd_ready_to_send_atapi(dev, channel);
1773             }
1774             break;
1775             
1776           case 1:
1777             // multi session stuff. we ignore this and emulate a single session only
1778             if (rd_init_send_atapi_command(dev, channel, atapi_command, 12, alloc_length, false) == -1) {
1779               return -1;
1780             }
1781             
1782             controller->buffer[0] = 0;
1783             controller->buffer[1] = 0x0a;
1784             controller->buffer[2] = 1;
1785             controller->buffer[3] = 1;
1786
1787             for (i = 0; i < 8; i++) {
1788               controller->buffer[4 + i] = 0;
1789             }
1790
1791             rd_ready_to_send_atapi(dev, channel);
1792             break;
1793             
1794           case 2:
1795           default:
1796             PrintError("(READ TOC) Format %d not supported\n", format);
1797             return -1;
1798           }
1799         } else {
1800           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1801           rd_raise_interrupt(dev, channel);
1802         }
1803         break;
1804       }  
1805     case 0x28: // read (10)
1806     case 0xa8: // read (12)
1807       { 
1808         
1809         uint32_t transfer_length;
1810         if (atapi_command == 0x28) {
1811           transfer_length = rd_read_16bit(controller->buffer + 7);
1812         } else {
1813           transfer_length = rd_read_32bit(controller->buffer + 6);
1814         }
1815
1816         uint32_t lba = rd_read_32bit(controller->buffer + 2);
1817         
1818         if (!(drive->cdrom.ready)) {
1819           PrintError("CDROM Error: Not Ready (ATA%d/%d)\n", 
1820                      get_channel_no(ramdisk, channel), get_drive_no(channel, drive));
1821           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1822           rd_raise_interrupt(dev, channel);
1823           break;
1824         }
1825         
1826         if (transfer_length == 0) {
1827           rd_atapi_cmd_nop(dev, channel);
1828           rd_raise_interrupt(dev, channel);
1829           PrintError("READ(%d) with transfer length 0, ok\n", 
1830                      (atapi_command == 0x28) ? 10 : 12);
1831           break;
1832         }
1833         
1834         if (lba + transfer_length > drive->cdrom.capacity) {
1835           PrintError("CDROM Error: Capacity exceeded [capacity=%d] (ATA%d/%d)\n",
1836                      drive->cdrom.capacity,
1837                      get_channel_no(ramdisk, channel), get_drive_no(channel, drive));
1838           rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1839           rd_raise_interrupt(dev, channel);
1840           break;
1841         }
1842         
1843         PrintDebug("\t\tcdrom: READ (%d) LBA=%d LEN=%d\n", 
1844                    (atapi_command == 0x28) ? 10 : 12, 
1845                    lba, transfer_length);
1846         
1847         // handle command
1848         if (rd_init_send_atapi_command(dev, channel, atapi_command, transfer_length * 2048,
1849                                        transfer_length * 2048, true) == -1) {
1850           PrintError("CDROM Error: Atapi command send error\n");
1851           return -1;
1852         }
1853
1854         drive->cdrom.remaining_blocks = transfer_length;
1855         drive->cdrom.next_lba = lba;
1856         rd_ready_to_send_atapi(dev, channel);
1857         break;
1858       }
1859     case 0x2b:  // seek
1860       {
1861         uint32_t lba = rd_read_32bit(controller->buffer + 2);
1862
1863         if (!(drive->cdrom.ready)) {
1864           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1865           rd_raise_interrupt(dev, channel);
1866           break;
1867         }
1868         
1869         if (lba > drive->cdrom.capacity) {
1870           rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1871           rd_raise_interrupt(dev, channel);
1872           break;
1873         }
1874         
1875         PrintDebug("\t\tcdrom: SEEK (ignored)\n");
1876
1877         rd_atapi_cmd_nop(dev, channel);
1878         rd_raise_interrupt(dev, channel);
1879
1880         break;
1881       }
1882     case 0x1e:  // prevent/allow medium removal
1883       {
1884
1885         if (drive->cdrom.ready) {
1886           drive->cdrom.locked = controller->buffer[4] & 1;
1887           rd_atapi_cmd_nop(dev, channel);
1888         } else {
1889           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1890         }
1891
1892         rd_raise_interrupt(dev, channel);
1893
1894         break;
1895       }
1896     case 0x42:  // read sub-channel
1897       {
1898         //bool msf = get_packet_field(channel,1, 1, 1);
1899         bool sub_q = get_packet_field(channel,2, 6, 1);
1900         //uint8_t data_format = get_packet_byte(channel,3);
1901         //uint8_t track_number = get_packet_byte(channel,6);
1902         uint16_t alloc_length = get_packet_word(channel,7);
1903         
1904
1905         /*
1906           UNUSED(msf);
1907           UNUSED(data_format);
1908           UNUSED(track_number);
1909         */
1910         if (!(drive->cdrom.ready)) {
1911           rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1912           rd_raise_interrupt(dev, channel);
1913         } else {
1914           controller->buffer[0] = 0;
1915           controller->buffer[1] = 0; // audio not supported
1916           controller->buffer[2] = 0;
1917           controller->buffer[3] = 0;
1918           
1919           int ret_len = 4; // header size
1920           
1921           if (sub_q) { // !sub_q == header only
1922             PrintError("Read sub-channel with SubQ not implemented\n");
1923             rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1924                                ASC_INV_FIELD_IN_CMD_PACKET);
1925             rd_raise_interrupt(dev, channel);
1926           }
1927           
1928           if (rd_init_send_atapi_command(dev, channel, atapi_command, ret_len, alloc_length, false) == -1) {
1929             return -1;
1930           }
1931           rd_ready_to_send_atapi(dev, channel);
1932         }
1933         break;
1934       }
1935     case 0x51:  // read disc info
1936       {
1937         // no-op to keep the Linux CD-ROM driver happy
1938         rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1939         rd_raise_interrupt(dev, channel);
1940         break;
1941       }
1942     case 0x55: // mode select
1943     case 0xa6: // load/unload cd
1944     case 0x4b: // pause/resume
1945     case 0x45: // play audio
1946     case 0x47: // play audio msf
1947     case 0xbc: // play cd
1948     case 0xb9: // read cd msf
1949     case 0x44: // read header
1950     case 0xba: // scan
1951     case 0xbb: // set cd speed
1952     case 0x4e: // stop play/scan
1953     case 0x46: // ???
1954     case 0x4a: // ???
1955       PrintError("ATAPI command 0x%x not implemented yet\n",
1956                atapi_command);
1957       rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1958       rd_raise_interrupt(dev, channel);
1959       break;
1960     default:
1961       PrintError("Unknown ATAPI command 0x%x (%d)\n",
1962                  atapi_command, atapi_command);
1963       // We'd better signal the error if the user chose to continue
1964       rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1965       rd_raise_interrupt(dev, channel);
1966       break;
1967     }
1968   }
1969   return 0;
1970 }
1971
1972
1973
1974
1975 int rd_init_send_atapi_command(struct vm_device * dev, struct channel_t * channel, Bit8u command, int req_length, int alloc_length, bool lazy)
1976 {
1977   struct drive_t * drive = &(channel->drives[channel->drive_select]);
1978   struct controller_t * controller = &(drive->controller);
1979
1980   // controller->byte_count is a union of controller->cylinder_no;
1981   // lazy is used to force a data read in the buffer at the next read.
1982   
1983   PrintDebug("[rd_init_send_atapi_cmd]\n");
1984
1985   if (controller->byte_count == 0xffff) {
1986     controller->byte_count = 0xfffe;
1987   }
1988
1989   if ((controller->byte_count & 1) && 
1990       !(alloc_length <= controller->byte_count)) {
1991       
1992     PrintDebug("\t\tOdd byte count (0x%04x) to ATAPI command 0x%02x, using 0x%x\n", 
1993                   controller->byte_count, 
1994                   command, 
1995                   controller->byte_count - 1);
1996     
1997     controller->byte_count -= 1;
1998   }
1999   
2000   if (controller->byte_count == 0) {
2001     PrintError("\t\tATAPI command with zero byte count\n");
2002     return -1;
2003   }
2004
2005   if (alloc_length < 0) {
2006     PrintError("\t\tAllocation length < 0\n");
2007     return -1;
2008   }
2009
2010   if (alloc_length == 0) {
2011     alloc_length = controller->byte_count;
2012   }
2013   
2014   controller->interrupt_reason.i_o = 1;
2015   controller->interrupt_reason.c_d = 0;
2016   controller->status.busy = 0;
2017   controller->status.drq = 1;
2018   controller->status.err = 0;
2019   
2020   // no bytes transfered yet
2021   if (lazy) {
2022     controller->buffer_index = 2048;
2023   } else {
2024     controller->buffer_index = 0;
2025   }
2026
2027   controller->drq_index = 0;
2028   
2029   if (controller->byte_count > req_length) {
2030     controller->byte_count = req_length;
2031   }
2032
2033   if (controller->byte_count > alloc_length) {
2034     controller->byte_count = alloc_length;
2035   }  
2036
2037   drive->atapi.command = command;
2038   drive->atapi.drq_bytes = controller->byte_count;
2039   drive->atapi.total_bytes_remaining = (req_length < alloc_length) ? req_length : alloc_length;
2040   
2041   // if (lazy) {
2042   // // bias drq_bytes and total_bytes_remaining
2043   // SELECTED_DRIVE(channel).atapi.drq_bytes += 2048;
2044   // SELECTED_DRIVE(channel).atapi.total_bytes_remaining += 2048;
2045   // }
2046
2047   return 0;
2048 }
2049
2050
2051
2052  void rd_ready_to_send_atapi(struct vm_device * dev, struct channel_t * channel) {
2053   PrintDebug("[rd_ready_to_send_atapi]\n");
2054
2055   rd_raise_interrupt(dev, channel);
2056 }
2057
2058
2059
2060
2061
2062 void rd_atapi_cmd_error(struct vm_device * dev, struct channel_t * channel, sense_t sense_key, asc_t asc)
2063 {
2064   struct drive_t * drive = &(channel->drives[channel->drive_select]);
2065   struct controller_t * controller = &(drive->controller);
2066
2067 #ifdef DEBUG_RAMDISK
2068   {
2069     struct ramdisk_t *ramdisk = (struct ramdisk_t *)(dev->private_data);
2070     PrintDebug("[rd_atapi_cmd_error]\n");
2071     PrintDebug("Error: atapi_cmd_error channel=%02x key=%02x asc=%02x\n", 
2072                get_channel_no(ramdisk, channel), sense_key, asc);
2073   }
2074 #endif
2075
2076   controller->error_register = sense_key << 4;
2077   controller->interrupt_reason.i_o = 1;
2078   controller->interrupt_reason.c_d = 1;
2079   controller->interrupt_reason.rel = 0;
2080   controller->status.busy = 0;
2081   controller->status.drive_ready = 1;
2082   controller->status.write_fault = 0;
2083   controller->status.drq = 0;
2084   controller->status.err = 1;
2085   
2086   drive->sense.sense_key = sense_key;
2087   drive->sense.asc = asc;
2088   drive->sense.ascq = 0;
2089 }
2090
2091
2092
2093 void rd_atapi_cmd_nop(struct vm_device * dev, struct channel_t * channel)
2094 {
2095   struct drive_t * drive = &(channel->drives[channel->drive_select]);
2096   struct controller_t * controller = &(drive->controller);
2097
2098   PrintDebug("[rd_atapi_cmd_nop]\n");
2099   controller->interrupt_reason.i_o = 1;
2100   controller->interrupt_reason.c_d = 1;
2101   controller->interrupt_reason.rel = 0;
2102   controller->status.busy = 0;
2103   controller->status.drive_ready = 1;
2104   controller->status.drq = 0;
2105   controller->status.err = 0;
2106 }
2107
2108
2109
2110
2111 void rd_identify_ATAPI_drive(struct vm_device * dev, struct channel_t * channel)
2112 {
2113   struct drive_t * drive = &(channel->drives[channel->drive_select]);
2114   struct controller_t * controller = &(drive->controller);
2115
2116
2117   uint_t i;
2118   const char* serial_number = " VT00001\0\0\0\0\0\0\0\0\0\0\0\0";
2119   const char* firmware = "ALPHA1  ";
2120
2121   drive->id_drive[0] = (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0); // Removable CDROM, 50us response, 12 byte packets
2122
2123   for (i = 1; i <= 9; i++) {
2124     drive->id_drive[i] = 0;
2125   }
2126
2127   for (i = 0; i < 10; i++) {
2128     drive->id_drive[10 + i] = ((serial_number[i * 2] << 8) |
2129                                (serial_number[(i * 2) + 1]));
2130   }
2131
2132   for (i = 20; i <= 22; i++) {
2133     drive->id_drive[i] = 0;
2134   }
2135
2136   for (i = 0; i < strlen(firmware)/2; i++) {
2137     drive->id_drive[23 + i] = ((firmware[i * 2] << 8) |
2138                                (firmware[(i * 2) + 1]));
2139   }
2140   V3_ASSERT((23 + i) == 27);
2141   
2142   for (i = 0; i < strlen((char *)(drive->model_no)) / 2; i++) {
2143     drive->id_drive[27 + i] = ((drive->model_no[i * 2] << 8) |
2144                                (drive->model_no[(i * 2) + 1]));
2145   }
2146   V3_ASSERT((27 + i) == 47);
2147
2148   drive->id_drive[47] = 0;
2149   drive->id_drive[48] = 1; // 32 bits access
2150
2151   drive->id_drive[49] = (1 << 9); // LBA supported
2152
2153   drive->id_drive[50] = 0;
2154   drive->id_drive[51] = 0;
2155   drive->id_drive[52] = 0;
2156
2157   drive->id_drive[53] = 3; // words 64-70, 54-58 valid
2158
2159   for (i = 54; i <= 62; i++) {
2160     drive->id_drive[i] = 0;
2161   }
2162
2163   // copied from CFA540A
2164   drive->id_drive[63] = 0x0103; // variable (DMA stuff)
2165   drive->id_drive[64] = 0x0001; // PIO
2166   drive->id_drive[65] = 0x00b4;
2167   drive->id_drive[66] = 0x00b4;
2168   drive->id_drive[67] = 0x012c;
2169   drive->id_drive[68] = 0x00b4;
2170
2171   drive->id_drive[69] = 0;
2172   drive->id_drive[70] = 0;
2173   drive->id_drive[71] = 30; // faked
2174   drive->id_drive[72] = 30; // faked
2175   drive->id_drive[73] = 0;
2176   drive->id_drive[74] = 0;
2177
2178   drive->id_drive[75] = 0;
2179
2180   for (i = 76; i <= 79; i++) {
2181     drive->id_drive[i] = 0;
2182   }
2183
2184   drive->id_drive[80] = 0x1e; // supports up to ATA/ATAPI-4
2185   drive->id_drive[81] = 0;
2186   drive->id_drive[82] = 0;
2187   drive->id_drive[83] = 0;
2188   drive->id_drive[84] = 0;
2189   drive->id_drive[85] = 0;
2190   drive->id_drive[86] = 0;
2191   drive->id_drive[87] = 0;
2192   drive->id_drive[88] = 0;
2193
2194   for (i = 89; i <= 126; i++) {
2195     drive->id_drive[i] = 0;
2196   }
2197
2198   drive->id_drive[127] = 0;
2199   drive->id_drive[128] = 0;
2200
2201   for (i = 129; i <= 159; i++) {
2202     drive->id_drive[i] = 0;
2203   }
2204
2205   for (i = 160; i <= 255; i++) {
2206     drive->id_drive[i] = 0;
2207   }
2208
2209   // now convert the id_drive array (native 256 word format) to
2210   // the controller buffer (512 bytes)
2211   Bit16u temp16;
2212   for (i = 0; i <= 255; i++) {
2213     temp16 = drive->id_drive[i];
2214     controller->buffer[i * 2] = temp16 & 0x00ff;
2215     controller->buffer[i * 2 + 1] = temp16 >> 8;
2216   }
2217
2218   return;
2219 }
2220
2221
2222
2223
2224
2225
2226
2227 static 
2228 void rd_init_mode_sense_single(struct vm_device * dev, 
2229                                struct channel_t * channel, const void* src, int size)
2230 {
2231   struct drive_t * drive = &(channel->drives[channel->drive_select]);
2232   struct controller_t * controller = &(drive->controller);
2233
2234   PrintDebug("[rd_init_mode_sense_single]\n");
2235
2236   // Header
2237   controller->buffer[0] = (size + 6) >> 8;
2238   controller->buffer[1] = (size + 6) & 0xff;
2239   controller->buffer[2] = 0x70; // no media present
2240   controller->buffer[3] = 0; // reserved
2241   controller->buffer[4] = 0; // reserved
2242   controller->buffer[5] = 0; // reserved
2243   controller->buffer[6] = 0; // reserved
2244   controller->buffer[7] = 0; // reserved
2245   
2246   // Data
2247   memcpy(controller->buffer + 8, src, size);
2248 }
2249
2250
2251
2252 static void rd_command_aborted(struct vm_device * dev, 
2253                                struct channel_t * channel, unsigned value) {
2254   struct drive_t * drive = &(channel->drives[channel->drive_select]);
2255   struct controller_t * controller = &(drive->controller);
2256
2257   PrintDebug("[rd_command_aborted]\n");
2258   PrintDebug("\t\taborting on command 0x%02x {%s}\n", value, device_type_to_str(drive->device_type));
2259
2260   controller->current_command = 0;
2261   controller->status.busy = 0;
2262   controller->status.drive_ready = 1;
2263   controller->status.err = 1;
2264   controller->error_register = 0x04; // command ABORTED
2265   controller->status.drq = 0;
2266   controller->status.seek_complete = 0;
2267   controller->status.corrected_data = 0;
2268   controller->buffer_index = 0;
2269
2270   rd_raise_interrupt(dev, channel);
2271 }
2272
2273
2274 static int ramdisk_init_device(struct vm_device *dev) {
2275   struct ramdisk_t *ramdisk= (struct ramdisk_t *)dev->private_data;
2276
2277   PrintDebug("Initializing Ramdisk\n");
2278
2279
2280   rd_init_hardware(ramdisk);
2281
2282
2283   dev_hook_io(dev, PRI_CTRL_PORT, 
2284               &read_status_port, &write_ctrl_port);
2285
2286   dev_hook_io(dev, PRI_DATA_PORT, 
2287               &read_data_port, &write_data_port);
2288   dev_hook_io(dev, PRI_FEATURES_PORT, 
2289               &read_general_port, &write_general_port);
2290   dev_hook_io(dev, PRI_SECT_CNT_PORT, 
2291               &read_general_port, &write_general_port);
2292   dev_hook_io(dev, PRI_SECT_ADDR1_PORT, 
2293               &read_general_port, &write_general_port);
2294   dev_hook_io(dev, PRI_SECT_ADDR2_PORT, 
2295               &read_general_port, &write_general_port);
2296   dev_hook_io(dev, PRI_SECT_ADDR3_PORT, 
2297               &read_general_port, &write_general_port);
2298   dev_hook_io(dev, PRI_DRV_SEL_PORT, 
2299               &read_general_port, &write_general_port);
2300   dev_hook_io(dev, PRI_CMD_PORT, 
2301               &read_status_port, &write_cmd_port);
2302
2303
2304   dev_hook_io(dev, SEC_CTRL_PORT, 
2305               &read_status_port, &write_ctrl_port);
2306
2307   dev_hook_io(dev, SEC_DATA_PORT, 
2308               &read_data_port, &write_data_port);
2309   dev_hook_io(dev, SEC_FEATURES_PORT, 
2310               &read_general_port, &write_general_port);
2311   dev_hook_io(dev, SEC_SECT_CNT_PORT, 
2312               &read_general_port, &write_general_port);
2313   dev_hook_io(dev, SEC_SECT_ADDR1_PORT, 
2314               &read_general_port, &write_general_port);
2315   dev_hook_io(dev, SEC_SECT_ADDR2_PORT, 
2316               &read_general_port, &write_general_port);
2317   dev_hook_io(dev, SEC_SECT_ADDR3_PORT, 
2318               &read_general_port, &write_general_port);
2319   dev_hook_io(dev, SEC_DRV_SEL_PORT, 
2320               &read_general_port, &write_general_port);
2321   dev_hook_io(dev, SEC_CMD_PORT, 
2322               &read_status_port, &write_cmd_port);
2323
2324   
2325
2326   dev_hook_io(dev, SEC_ADDR_REG_PORT, 
2327               &read_general_port, &write_general_port);
2328
2329   dev_hook_io(dev, PRI_ADDR_REG_PORT, 
2330               &read_general_port, &write_general_port);
2331
2332
2333
2334   return 0;
2335
2336 }
2337
2338
2339 static int ramdisk_deinit_device(struct vm_device *dev) {
2340   struct ramdisk_t *ramdisk = (struct ramdisk_t *)(dev->private_data);
2341   rd_close_harddrive(ramdisk);
2342   return 0;
2343 }
2344
2345 static struct vm_device_ops dev_ops = {
2346   .init = ramdisk_init_device,
2347   .deinit = ramdisk_deinit_device,
2348   .reset = NULL,
2349   .start = NULL,
2350   .stop = NULL,
2351 };
2352
2353
2354
2355
2356 struct vm_device *create_ramdisk()
2357 {
2358
2359   struct ramdisk_t *ramdisk;
2360   ramdisk = (struct ramdisk_t *)V3_Malloc(sizeof(struct ramdisk_t));  
2361   V3_ASSERT(ramdisk != NULL);  
2362
2363   PrintDebug("[create_ramdisk]\n");
2364
2365   struct vm_device *device = create_device("RAMDISK", &dev_ops, ramdisk);
2366
2367   return device;
2368 }
2369
2370
2371
2372
2373 #ifdef DEBUG_RAMDISK
2374
2375 static void rd_print_state(struct ramdisk_t * ramdisk) {
2376   uchar_t channel; 
2377   uchar_t device;
2378   struct channel_t * channels = (struct channel_t *)(&(ramdisk->channels));
2379
2380   /*
2381   for (channel = 0; channel < MAX_ATA_CHANNEL; channel++) {
2382     memset((char *)(channels + channel), 0, sizeof(struct channel_t));
2383   }
2384   */
2385   PrintDebug("sizeof(*channels) = %d\n", sizeof(*channels));
2386   PrintDebug("sizeof(channles->drives[0].controller) = %d\n", sizeof((channels->drives[0].controller)));
2387   PrintDebug("sizeof(channles->drives[0].cdrom) = %d\n", sizeof((channels->drives[0].cdrom)));
2388   PrintDebug("sizeof(channles->drives[0].sense) = %d\n", sizeof((channels->drives[0].sense)));
2389   PrintDebug("sizeof(channles->drives[0].atapi) = %d\n", sizeof((channels->drives[0].atapi)));
2390
2391
2392   PrintDebug("sizeof(channles->drives[0].controller.status) = %d\n", 
2393                 sizeof((channels->drives[0].controller.status)));
2394   PrintDebug("sizeof(channles->drives[0].controller.sector_count) = %d\n", 
2395                 sizeof((channels->drives[0].controller.sector_count)));
2396   PrintDebug("sizeof(channles->drives[0].controller.interrupt_reason) = %d\n", 
2397                 sizeof((channels->drives[0].controller.interrupt_reason)));
2398
2399   PrintDebug("sizeof(channles->drives[0].controller.cylinder_no) = %d\n", 
2400                 sizeof((channels->drives[0].controller.cylinder_no)));
2401   PrintDebug("sizeof(channles->drives[0].controller.byte_count) = %d\n", 
2402                 sizeof((channels->drives[0].controller.byte_count)));
2403
2404
2405   PrintDebug("sizeof(channles->drives[0].controller.control) = %d\n", 
2406                 sizeof((channels->drives[0].controller.control)));
2407
2408
2409   for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
2410   
2411     for (device = 0; device < 2; device++){
2412                   
2413       // Initialize controller state, even if device is not present
2414       PrintDebug("channels[%d].drives[%d].controller.status.busy = %d\n",
2415                     channel, device, 
2416                     channels[channel].drives[device].controller.status.busy);
2417       PrintDebug("channels[%d].drives[%d].controller.status.drive_ready = %d\n", 
2418                     channel, device, 
2419                     channels[channel].drives[device].controller.status.drive_ready);
2420       PrintDebug("channels[%d].drives[%d].controller.status.write_fault = %d\n", 
2421                     channel, device, 
2422                     channels[channel].drives[device].controller.status.write_fault);
2423       PrintDebug("channels[%d].drives[%d].controller.status.seek_complete = %d\n", 
2424                     channel, device, 
2425                     channels[channel].drives[device].controller.status.seek_complete);
2426       PrintDebug("channels[%d].drives[%d].controller.status.drq = %d\n", 
2427                     channel, device, 
2428                     channels[channel].drives[device].controller.status.drq);
2429       PrintDebug("channels[%d].drives[%d].controller.status.corrected_data = %d\n", 
2430                     channel, device, 
2431                     channels[channel].drives[device].controller.status.corrected_data);
2432       PrintDebug("channels[%d].drives[%d].controller.status.index_pulse = %d\n", 
2433                     channel, device, 
2434                     channels[channel].drives[device].controller.status.index_pulse);
2435       PrintDebug("channels[%d].drives[%d].controller.status.index_pulse_count = %d\n", 
2436                     channel, device, 
2437                     channels[channel].drives[device].controller.status.index_pulse_count);
2438       PrintDebug("channels[%d].drives[%d].controller.status.err = %d\n", 
2439                     channel, device, 
2440                     channels[channel].drives[device].controller.status.err);
2441
2442
2443       PrintDebug("channels[%d].drives[%d].controller.error_register = %d\n", 
2444                     channel, device, 
2445                     channels[channel].drives[device].controller.error_register);
2446       PrintDebug("channels[%d].drives[%d].controller.head_no = %d\n", 
2447                     channel, device, 
2448                     channels[channel].drives[device].controller.head_no);
2449       PrintDebug("channels[%d].drives[%d].controller.sector_count = %d\n", 
2450                     channel, device, 
2451                     channels[channel].drives[device].controller.sector_count);
2452       PrintDebug("channels[%d].drives[%d].controller.sector_no = %d\n", 
2453                     channel, device, 
2454                     channels[channel].drives[device].controller.sector_no);
2455       PrintDebug("channels[%d].drives[%d].controller.cylinder_no = %d\n", 
2456                     channel, device, 
2457                     channels[channel].drives[device].controller.cylinder_no);
2458       PrintDebug("channels[%d].drives[%d].controller.current_command = %02x\n", 
2459                     channel, device, 
2460                     channels[channel].drives[device].controller.current_command);
2461       PrintDebug("channels[%d].drives[%d].controller.buffer_index = %d\n", 
2462                     channel, device, 
2463                     channels[channel].drives[device].controller.buffer_index);
2464
2465
2466       PrintDebug("channels[%d].drives[%d].controller.control.reset = %d\n", 
2467                     channel, device, 
2468                     channels[channel].drives[device].controller.control.reset);
2469       PrintDebug("channels[%d].drives[%d].controller.control.disable_irq = %d\n", 
2470                     channel, device, 
2471                     channels[channel].drives[device].controller.control.disable_irq);
2472
2473
2474       PrintDebug("channels[%d].drives[%d].controller.reset_in_progress = %d\n", 
2475                     channel, device, 
2476                     channels[channel].drives[device].controller.reset_in_progress);
2477       PrintDebug("channels[%d].drives[%d].controller.sectors_per_block = %02x\n", 
2478                     channel, device, 
2479                     channels[channel].drives[device].controller.sectors_per_block); 
2480       PrintDebug("channels[%d].drives[%d].controller.lba_mode = %d\n", 
2481                     channel, device, 
2482                     channels[channel].drives[device].controller.lba_mode); 
2483       PrintDebug("channels[%d].drives[%d].controller.features = %d\n", 
2484                     channel, device, 
2485                     channels[channel].drives[device].controller.features); 
2486
2487
2488       PrintDebug("channels[%d].drives[%d].model_no = %s\n", 
2489                     channel, device, 
2490                     channels[channel].drives[device].model_no); 
2491       PrintDebug("channels[%d].drives[%d].device_type = %d\n", 
2492                     channel, device, 
2493                     channels[channel].drives[device].device_type); 
2494       PrintDebug("channels[%d].drives[%d].cdrom.locked = %d\n", 
2495                     channel, device, 
2496                     channels[channel].drives[device].cdrom.locked); 
2497       PrintDebug("channels[%d].drives[%d].sense.sense_key = %d\n", 
2498                     channel, device, 
2499                     channels[channel].drives[device].sense.sense_key); 
2500       PrintDebug("channels[%d].drives[%d].sense.asc = %d\n", 
2501                     channel, device, 
2502                     channels[channel].drives[device].sense.asc); 
2503       PrintDebug("channels[%d].drives[%d].sense.ascq = %d\n", 
2504                     channel, device, 
2505                     channels[channel].drives[device].sense.ascq); 
2506
2507
2508
2509       PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n", 
2510                     channel, device, 
2511                     channels[channel].drives[device].controller.interrupt_reason.c_d);
2512
2513       PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n", 
2514                     channel, device, 
2515                     channels[channel].drives[device].controller.interrupt_reason.i_o);
2516
2517       PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n", 
2518                     channel, device, 
2519                     channels[channel].drives[device].controller.interrupt_reason.rel);
2520
2521       PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n", 
2522                     channel, device, 
2523                     channels[channel].drives[device].controller.interrupt_reason.tag);
2524
2525       PrintDebug("channels[%d].drives[%d].cdrom.ready = %d\n", 
2526                     channel, device, 
2527                     channels[channel].drives[device].cdrom.ready);
2528       
2529     }  //for device
2530   }  //for channel
2531   
2532   return;
2533 }
2534
2535 #if 0
2536 static void trace_info(ushort_t port, void *src, uint_t length) {
2537
2538   switch(port){
2539
2540   case 0x3e8:
2541     if (length == 1 && *((uchar_t*) src) == ATA_DETECT)
2542       PrintDebug("ata_detect()\n");
2543     break;
2544
2545   case 0x3e9:
2546     if (length == 1 && *((uchar_t*) src) == ATA_RESET)
2547       PrintDebug("ata_reset()\n");
2548     break;
2549
2550   case 0x3ea:
2551     if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_IN)
2552       PrintDebug("ata_cmd_data_in()\n");
2553     break;
2554
2555   case 0x3eb:
2556     if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_OUT)
2557       PrintDebug("ata_cmd_data_out()\n");
2558     break;
2559
2560   case 0x3ec:
2561     if (length == 1 && *((uchar_t*) src) == ATA_CMD_PACKET)
2562       PrintDebug("ata_cmd_packet()\n");
2563     break;
2564
2565   case 0x3ed:
2566     if (length == 1 && *((uchar_t*) src) == ATAPI_GET_SENSE)
2567       PrintDebug("atapi_get_sense()\n");
2568     break;
2569
2570   case 0x3ee:
2571     if (length == 1 && *((uchar_t*) src) == ATAPI_IS_READY)
2572       PrintDebug("atapi_is_ready()\n");
2573     break;
2574
2575   case 0x3ef:
2576     if (length == 1 && *((uchar_t*) src) == ATAPI_IS_CDROM)
2577       PrintDebug("atapi_is_cdrom()\n");
2578     break;
2579
2580
2581   case 0x2e8:
2582     if (length == 1 && *((uchar_t*) src) == CDEMU_INIT)
2583       PrintDebug("cdemu_init()\n");
2584     break;
2585
2586   case 0x2e9:
2587     if (length == 1 && *((uchar_t*) src) == CDEMU_ISACTIVE)
2588       PrintDebug("cdemu_isactive()\n");
2589     break;
2590
2591   case 0x2ea:
2592     if (length == 1 && *((uchar_t*) src) == CDEMU_EMULATED_DRIVE)
2593       PrintDebug("cdemu_emulated_drive()\n");
2594     break;
2595
2596   case 0x2eb:
2597     if (length == 1 && *((uchar_t*) src) == CDROM_BOOT)
2598       PrintDebug("cdrom_boot()\n");
2599     break;
2600
2601   case 0x2ec:
2602     if (length == 1 && *((uchar_t*) src) == HARD_DRIVE_POST)
2603       PrintDebug("ata_hard_drive_post()\n");
2604     break;
2605
2606   case 0x2ed:
2607     if (length == 1)
2608       PrintDebug("ata_device_no(%d)\n", *((uchar_t*) src));
2609     break;
2610
2611   case 0x2ee:
2612     if (length == 1)
2613       PrintDebug("ata_device_type(%d)\n", *((uchar_t*) src));
2614     break;
2615
2616   case 0x2ef:
2617     if (length == 1 && *((uchar_t*) src) == INT13_HARDDISK)
2618       PrintDebug("int13_harddrive()\n");
2619     break;
2620
2621   case 0x2f8:
2622     if (length == 1 && *((uchar_t*) src) == INT13_CDROM)
2623       PrintDebug("int13_cdrom()\n");
2624     break;
2625
2626   case 0x2f9:
2627     if (length == 1 && *((uchar_t*) src) == INT13_CDEMU)
2628       PrintDebug("int13_cdemu()\n");
2629     break;
2630
2631   case 0x2fa:
2632     if (length == 1 && *((uchar_t*) src) == INT13_ELTORITO)
2633       PrintDebug("int13_eltorito()\n");
2634     break;
2635
2636   case 0x2fb:
2637     if (length == 1 && *((uchar_t*) src) == INT13_DISKETTE_FUNCTION)
2638       PrintDebug("int13_diskette_function()\n");
2639     break;
2640
2641
2642   default:
2643     break;
2644   }
2645 }
2646
2647 #endif
2648
2649 static int check_bit_fields(struct controller_t * controller) {
2650   //Check bit fields
2651   controller->sector_count = 0;
2652   controller->interrupt_reason.c_d = 1;
2653   if (controller->sector_count != 0x01) {
2654     return INTR_REASON_BIT_ERR;
2655   }
2656   
2657   controller->sector_count = 0;
2658   controller->interrupt_reason.i_o = 1;
2659   if (controller->sector_count != 0x02) {
2660     return INTR_REASON_BIT_ERR;
2661   }
2662   
2663   controller->sector_count = 0;
2664   controller->interrupt_reason.rel = 1;
2665   if (controller->sector_count != 0x04) {
2666     return INTR_REASON_BIT_ERR;
2667   }
2668   
2669   controller->sector_count = 0;
2670   controller->interrupt_reason.tag = 3;
2671   if (controller->sector_count != 0x18) {
2672     return INTR_REASON_BIT_ERR;
2673   }
2674   
2675   return 0;
2676 }
2677 #endif