3 * Copyright (C) 2002 MandrakeSoft S.A.
8 * http://www.linux-mandrake.com/
9 * http://www.mandrakesoft.com/
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.
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.
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
25 * Major modifications made for the V3VEE project
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
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
39 #include <devices/ramdisk.h>
40 #include <palacios/vmm.h>
41 #include <devices/cdrom.h>
42 #include <devices/ide.h>
47 #define PrintDebug(_f, _a...)
52 * Data type definitions
55 #define INDEX_PULSE_CYCLE 10
60 #define INTR_REASON_BIT_ERR 0x01
61 #define UNABLE_FIND_TAT_CHANNEL_ERR 0x02
63 #define READ_BUF_GT_512 0x04
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
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
93 #define PACKET_SIZE 12
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
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
115 #define HARD_DRIVE_POST 0xfc //0X2EC
118 #define ATA_DEVICE_NO 0xfd //0X2ED
119 #define ATA_DEVICE_TYPE 0xfe //0X2ED
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
130 static const char cdrom_str[] = "CD-ROM";
131 static const char harddisk_str[] = "HARDDISK";
132 static const char none_str[] = "NONE";
135 static inline const char * device_type_to_str(device_type_t type) {
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;
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;
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;
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;
173 static inline void write_cylinder_high(struct channel_t * channel, uchar_t value) {
174 ushort_t val2 = value;
176 channel->drives[0].controller.cylinder_no &= 0x00ff;
177 channel->drives[0].controller.cylinder_no |= (val2 & 0xff00);
179 channel->drives[1].controller.cylinder_no &= 0x00ff;
180 channel->drives[1].controller.cylinder_no |= (val2 & 0xff00);
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;
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;
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));
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));
202 static inline struct drive_t * get_selected_drive(struct channel_t * channel) {
203 return &(channel->drives[channel->drive_select]);
207 static inline int is_primary_port(struct ramdisk_t * ramdisk, ushort_t 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:
227 static inline int is_secondary_port(struct ramdisk_t * ramdisk, ushort_t 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:
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)) {
249 } else if ((channel->drives[0].device_type != IDE_NONE) &&
250 (channel->drives[1].device_type != IDE_NONE)) {
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);
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);
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];
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];
282 val |= drive->controller.buffer[offset + 1];
287 static inline uint16_t rd_read_16bit(const uint8_t* buf) {
288 return (buf[0] << 8) | buf[1];
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];
297 ////////////////////////////////////////////////////////////////////////////
305 static void rd_init_mode_sense_single(struct vm_device * dev, struct channel_t * channel, const void * src, int size);
307 static void rd_command_aborted(struct vm_device * dev, struct channel_t * channel, unsigned value);
312 static int handle_atapi_packet_command(struct vm_device * dev,
313 struct channel_t * channel,
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);
321 static void rd_ready_to_send_atapi(struct vm_device * dev,
322 struct channel_t * channel);
324 static void rd_atapi_cmd_error(struct vm_device * dev,
325 struct channel_t * channel,
326 sense_t sense_key, asc_t asc);
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);
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);
348 static void rd_print_state(struct ramdisk_t *ramdisk);
349 static int check_bit_fields(struct controller_t * controller);
351 ////////////////////////////////////////////////////////////////////
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);
365 if (drive->device_type != IDE_NONE) {
366 PrintError("Device already registered at this location\n");
374 strncpy((char*)(drive->model_no), "V3VEE Ramdisk", 40);
376 while (strlen((char *)(drive->model_no)) < 40) {
377 strcat ((char*)(drive->model_no), " ");
380 PrintDebug("CDROM on target %d/%d\n", busID, driveID);
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;
388 drive->private_data = private_data;
391 if (check_bit_fields(controller) == INTR_REASON_BIT_ERR) {
392 PrintDebug("interrupt reason: bit field error\n");
393 return INTR_REASON_BIT_ERR;
397 controller->sector_count = 0;
399 drive->cdrom.cd = cd;
401 PrintDebug("\t\tCD on ata%d-%d: '%s'\n",
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);
411 PrintDebug("\t\tCould not locate CD-ROM, continuing with media not present\n");
412 drive->cdrom.ready = 0;
419 static Bit32u rd_init_hardware(struct ramdisk_t *ramdisk) {
422 struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
424 PrintDebug("[rd_init_harddrive]\n");
426 for (channel_num = 0; channel_num < MAX_ATA_CHANNEL; channel_num++) {
427 memset((char *)(channels + channel_num), 0, sizeof(struct channel_t));
430 for (channel_num = 0; channel_num < MAX_ATA_CHANNEL; channel_num++){
431 struct channel_t * channel = &(channels[channel_num]);
433 channel->ioaddr1 = 0x0;
434 channel->ioaddr2 = 0x0;
437 for (device = 0; device < 2; device++){
438 struct drive_t * drive = &(channel->drives[device]);
439 struct controller_t * controller = &(drive->controller);
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;
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;
459 controller->control.reset = 0;
460 controller->control.disable_irq = 0;
461 controller->reset_in_progress = 0;
463 controller->sectors_per_block = 0x80;
464 controller->lba_mode = 0;
467 controller->features = 0;
470 drive->device_type = IDE_NONE;
473 strncpy((char*)(drive->model_no), "", 40);
474 while(strlen((char *)(drive->model_no)) < 40) {
475 strcat ((char*)(drive->model_no), " ");
482 rd_print_state(ramdisk);
489 static void rd_reset_harddrive(struct ramdisk_t *ramdisk, unsigned type) {
494 static void rd_close_harddrive(struct ramdisk_t *ramdisk) {
499 ////////////////////////////////////////////////////////////////////
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;
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]);
516 PrintError("Invalid Port: %d\n", port);
520 drive = get_selected_drive(channel);
521 controller = &(drive->controller);
524 PrintDebug("[read_data_handler] IO Read at 0x%x, on drive %d/%d (current_cmd = 0x%02x)\n",
526 get_channel_no(ramdisk, channel),
527 get_drive_no(channel, drive),
528 controller->current_command);
530 switch (controller->current_command) {
531 case 0xec: // IDENTIFY DEVICE
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;
544 value32 = controller->buffer[index];
548 value32 |= (controller->buffer[index] << 8);
553 value32 |= (controller->buffer[index] << 16);
554 value32 |= (controller->buffer[index+1] << 24);
558 controller->buffer_index = index;
561 memcpy(dst, controller->buffer + controller->buffer_index, length);
562 controller->buffer_index += length;
564 if (controller->buffer_index >= 512) {
565 controller->status.drq = 0;
570 case 0xa0: //send packet cmd
572 uint_t index = controller->buffer_index;
575 PrintDebug("\t\tatapi.command(%02x), index(%d), cdrom.remaining_blocks(%d)\n",
576 drive->atapi.command,
578 drive->cdrom.remaining_blocks);
580 // Load block if necessary
584 PrintError("\t\tindex > 2048 : 0x%x\n", index);
588 switch (drive->atapi.command) {
589 case 0x28: // read (10)
590 case 0xa8: // read (12)
593 if (!(drive->cdrom.ready)) {
594 PrintError("\t\tRead with CDROM not ready\n");
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--;
604 if (!(drive->cdrom.remaining_blocks)) {
605 PrintDebug("\t\tLast READ block loaded {CDROM}\n");
607 PrintDebug("\t\tREAD block loaded (%d remaining) {CDROM}\n",
608 drive->cdrom.remaining_blocks);
611 // one block transfered, start at beginning
615 default: // no need to load a new block
623 value32 = controller->buffer[index + increment];
627 value32 |= (controller->buffer[index + increment] << 8);
632 value32 |= (controller->buffer[index + increment] << 16);
633 value32 |= (controller->buffer[index + increment + 1] << 24);
637 controller->buffer_index = index + increment;
638 controller->drq_index += increment;
641 /* JRL: CHECK THAT there is enough data in the buffer to copy.... */
643 memcpy(dst, controller->buffer + index, length);
645 controller->buffer_index = index + length;
646 controller->drq_index += length;
651 if (controller->drq_index >= (unsigned)drive->atapi.drq_bytes) {
652 controller->status.drq = 0;
653 controller->drq_index = 0;
655 drive->atapi.total_bytes_remaining -= drive->atapi.drq_bytes;
657 if (drive->atapi.total_bytes_remaining > 0) {
658 // one or more blocks remaining (works only for single block commands)
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;
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;
670 drive->atapi.drq_bytes = controller->byte_count;
672 rd_raise_interrupt(dev, channel);
675 PrintDebug("\t\tPACKET all bytes read\n");
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;
685 rd_raise_interrupt(dev, channel);
693 PrintDebug("\t\tread need support more command: %02x\n", controller->current_command);
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;
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]);
714 PrintError("Invalid Port: %d\n", port);
718 drive = get_selected_drive(channel);
719 controller = &(drive->controller);
721 PrintDebug("[write_data_handler] IO write at 0x%x, current_cmd = 0x%02x\n",
722 port, controller->current_command);
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);
731 if (handle_atapi_packet_command(dev, channel, *(ushort_t *)src) == -1) {
738 PrintError("\t\tIO write(0x%x): current command is %02xh\n",
739 port, controller->current_command);
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;
759 PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
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]);
768 PrintError("Invalid Port: %d\n", port);
772 drive = get_selected_drive(channel);
773 controller = &(drive->controller);
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);
780 if (num_drives_on_channel(channel) == 0) {
781 // (mch) Just return zero for these registers
782 memset(dst, 0, length);
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) );
795 memcpy(dst, &val, length);
797 controller->status.index_pulse_count++;
798 controller->status.index_pulse = 0;
800 if (controller->status.index_pulse_count >= INDEX_PULSE_CYCLE) {
801 controller->status.index_pulse = 1;
802 controller->status.index_pulse_count = 0;
806 if ((port == SEC_CMD_PORT) || (port == PRI_CMD_PORT)) {
807 rd_lower_irq(dev, channel->irq);
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;
823 PrintError("Invalid Command port write length: %d (port=%d)\n", length, port);
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]);
832 PrintError("Invalid Port: %d\n", port);
836 drive = get_selected_drive(channel);
837 controller = &(drive->controller);
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,
847 case 0xec: // IDENTIFY DEVICE
850 if (drive->device_type == IDE_NONE) {
851 PrintError("\t\tError: disk ata%d-%d not present, aborting\n",
852 get_channel_no(ramdisk, channel),
853 get_drive_no(channel, drive));
854 rd_command_aborted(dev, channel, value);
856 } else if (drive->device_type == IDE_CDROM) {
857 PrintDebug("Identifying CDROM...Going to abort????\n");
858 controller->head_no = 0;
859 controller->sector_count = 1;
860 controller->sector_no = 1;
861 controller->cylinder_no = 0xeb14;
862 rd_command_aborted(dev, channel, 0xec);
864 PrintError("\t\tError: Want to identify HDD!!\n");
866 SELECTED_CONTROLLER(channel).current_command = value;
867 SELECTED_CONTROLLER(channel).error_register = 0;
869 // See ATA/ATAPI-4, 8.12
870 SELECTED_CONTROLLER(channel).status.busy = 0;
871 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
872 SELECTED_CONTROLLER(channel).status.write_fault = 0;
873 SELECTED_CONTROLLER(channel).status.drq = 1;
874 SELECTED_CONTROLLER(channel).status.err = 0;
876 SELECTED_CONTROLLER(channel).status.seek_complete = 1;
877 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
879 SELECTED_CONTROLLER(channel).buffer_index = 0;
880 raise_interrupt(channel);
881 identify_drive(channel);
889 case 0xa1: // IDENTIFY PACKET DEVICE
891 if (drive->device_type == IDE_CDROM) {
892 controller->current_command = value;
893 controller->error_register = 0;
895 controller->status.busy = 0;
896 controller->status.drive_ready = 1;
897 controller->status.write_fault = 0;
898 controller->status.drq = 1;
899 controller->status.err = 0;
901 controller->status.seek_complete = 1;
902 controller->status.corrected_data = 0;
904 controller->buffer_index = 0;
905 rd_raise_interrupt(dev, channel);
906 rd_identify_ATAPI_drive(dev, channel);
908 rd_command_aborted(dev, channel, 0xa1);
912 case 0xa0: // SEND PACKET (atapi)
914 if (drive->device_type == IDE_CDROM) {
917 if (controller->features & (1 << 0)) {
918 PrintError("\t\tPACKET-DMA not supported");
922 if (controller->features & (1 << 1)) {
923 PrintError("\t\tPACKET-overlapped not supported");
927 // We're already ready!
928 controller->sector_count = 1;
929 controller->status.busy = 0;
930 controller->status.write_fault = 0;
933 controller->status.drq = 1;
934 controller->status.err = 0;
936 // NOTE: no interrupt here
937 controller->current_command = value;
938 controller->buffer_index = 0;
940 rd_command_aborted (dev, channel, 0xa0);
945 PrintError("\t\tneed translate command %2x\n", value);
947 /* JRL THIS NEEDS TO CHANGE */
955 static int write_ctrl_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
956 struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
957 struct channel_t * channel = NULL;
958 struct drive_t * master_drive = NULL;
959 struct drive_t * slave_drive = NULL;
960 struct controller_t * controller = NULL;
961 uchar_t value = *(uchar_t *)src;
962 rd_bool prev_control_reset;
965 PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
969 if (is_primary_port(ramdisk, port)) {
970 channel = &(ramdisk->channels[0]);
971 } else if (is_secondary_port(ramdisk, port)) {
972 channel = &(ramdisk->channels[1]);
974 PrintError("Invalid Port: %d\n", port);
978 master_drive = &(channel->drives[0]);
979 slave_drive = &(channel->drives[1]);
981 controller = &(get_selected_drive(channel)->controller);
984 PrintDebug("[write_control_handler] IO write at 0x%x, on drive %d/%d (val = 0x%x)\n",
985 port, get_channel_no(ramdisk, channel),
986 channel->drive_select,
989 // (mch) Even if device 1 was selected, a write to this register
990 // goes to device 0 (if device 1 is absent)
992 prev_control_reset = controller->control.reset;
994 master_drive->controller.control.reset = value & 0x04;
995 slave_drive->controller.control.reset = value & 0x04;
997 // CGS: was: SELECTED_CONTROLLER(channel).control.disable_irq = value & 0x02;
998 master_drive->controller.control.disable_irq = value & 0x02;
999 slave_drive->controller.control.disable_irq = value & 0x02;
1001 PrintDebug("\t\tadpater control reg: reset controller = %d\n",
1002 (unsigned) (controller->control.reset) ? 1 : 0);
1003 PrintDebug("\t\tadpater control reg: disable_irq(X) = %d\n",
1004 (unsigned) (controller->control.disable_irq) ? 1 : 0);
1006 if ((!prev_control_reset) && (controller->control.reset)) {
1009 // transition from 0 to 1 causes all drives to reset
1010 PrintDebug("\t\thard drive: RESET\n");
1012 // (mch) Set BSY, drive not ready
1013 for (id = 0; id < 2; id++) {
1014 struct controller_t * ctrl = NULL;
1017 ctrl = &(master_drive->controller);
1018 } else if (id == 1) {
1019 ctrl = &(slave_drive->controller);
1022 ctrl->status.busy = 1;
1023 ctrl->status.drive_ready = 0;
1024 ctrl->reset_in_progress = 1;
1026 ctrl->status.write_fault = 0;
1027 ctrl->status.seek_complete = 1;
1028 ctrl->status.drq = 0;
1029 ctrl->status.corrected_data = 0;
1030 ctrl->status.err = 0;
1032 ctrl->error_register = 0x01; // diagnostic code: no error
1034 ctrl->current_command = 0x00;
1035 ctrl->buffer_index = 0;
1037 ctrl->sectors_per_block = 0x80;
1040 ctrl->control.disable_irq = 0;
1043 rd_lower_irq(dev, channel->irq);
1045 } else if ((controller->reset_in_progress) &&
1046 (!controller->control.reset)) {
1048 // Clear BSY and DRDY
1049 PrintDebug("\t\tReset complete {%s}\n", device_type_to_str(get_selected_drive(channel)->device_type));
1051 for (id = 0; id < 2; id++) {
1052 struct controller_t * ctrl = NULL;
1053 struct drive_t * drv = NULL;
1056 ctrl = &(master_drive->controller);
1058 } else if (id == 1) {
1059 ctrl = &(slave_drive->controller);
1063 ctrl->status.busy = 0;
1064 ctrl->status.drive_ready = 1;
1065 ctrl->reset_in_progress = 0;
1068 if (drv->device_type == IDE_DISK) {
1069 PrintDebug("\t\tdrive %d/%d is harddrive\n", get_channel_no(ramdisk, channel), id);
1071 ctrl->sector_count = 1;
1072 ctrl->sector_no = 1;
1073 ctrl->cylinder_no = 0;
1076 ctrl->sector_count = 1;
1077 ctrl->sector_no = 1;
1078 ctrl->cylinder_no = 0xeb14;
1083 PrintDebug("\t\ts[0].controller.control.disable_irq = %02x\n",
1084 master_drive->controller.control.disable_irq);
1085 PrintDebug("\t\ts[1].controller.control.disable_irq = %02x\n",
1086 slave_drive->controller.control.disable_irq);
1091 static int read_general_port(ushort_t port, void * dst, uint_t length, struct vm_device * dev) {
1092 struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
1093 struct channel_t * channel = NULL;
1094 struct drive_t * drive = NULL;
1095 struct controller_t * controller = NULL;
1099 PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
1103 if (is_primary_port(ramdisk, port)) {
1104 channel = &(ramdisk->channels[0]);
1105 } else if (is_secondary_port(ramdisk, port)) {
1106 channel = &(ramdisk->channels[1]);
1108 PrintError("Invalid Port: %d\n", port);
1112 drive = get_selected_drive(channel);
1113 controller = &(drive->controller);
1116 PrintDebug("[read_general_handler] IO read addr at %x, on drive %d/%d, curcmd = %02x\n",
1117 port, get_channel_no(ramdisk, channel),
1118 channel->drive_select,
1119 controller->current_command);
1123 case PRI_FEATURES_PORT:
1124 case SEC_FEATURES_PORT: // hard disk error register 0x1f1
1126 uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->error_register;
1128 controller->status.err = 0;
1130 *(uchar_t *)dst = val;
1136 case PRI_SECT_CNT_PORT:
1137 case SEC_SECT_CNT_PORT: // hard disk sector count / interrupt reason 0x1f2
1139 uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_count;
1141 *(uchar_t *)dst = val;
1146 case PRI_SECT_ADDR1_PORT:
1147 case SEC_SECT_ADDR1_PORT: // sector number 0x1f3
1149 uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_no;
1151 *(uchar_t *)dst = val;
1157 case PRI_SECT_ADDR2_PORT:
1158 case SEC_SECT_ADDR2_PORT: // cylinder low 0x1f4
1160 // -- WARNING : On real hardware the controller registers are shared between drives.
1161 // So we must respond even if the select device is not present. Some OS uses this fact
1162 // to detect the disks.... minix2 for example
1163 uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no & 0x00ff);
1165 *(uchar_t *)dst = val;
1171 case PRI_SECT_ADDR3_PORT:
1172 case SEC_SECT_ADDR3_PORT: // cylinder high 0x1f5
1174 // -- WARNING : On real hardware the controller registers are shared between drives.
1175 // So we must respond even if the select device is not present. Some OS uses this fact
1176 // to detect the disks.... minix2 for example
1177 uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no >> 8);
1179 *(uchar_t *)dst = val;
1184 case PRI_DRV_SEL_PORT:
1185 case SEC_DRV_SEL_PORT: // hard disk drive and head register 0x1f6
1187 // b7 Extended data field for ECC
1188 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
1189 // Since 512 was always used, bit 6 was taken to mean LBA mode:
1190 // b6 1=LBA mode, 0=CHS mode
1194 uchar_t val = ((1 << 7) |
1195 ((controller->lba_mode > 0) << 6) |
1196 (1 << 5) | // 01b = 512 sector size
1197 (channel->drive_select << 4) |
1198 (controller->head_no << 0));
1200 *(uchar_t *)dst = val;
1205 case PRI_ADDR_REG_PORT:
1206 case SEC_ADDR_REG_PORT: // Hard Disk Address Register 0x3f7
1208 // Obsolete and unsupported register. Not driven by hard
1209 // disk controller. Report all 1's. If floppy controller
1210 // is handling this address, it will call this function
1211 // set/clear D7 (the only bit it handles), then return
1212 // the combined value
1213 *(uchar_t *)dst = 0xff;
1218 PrintError("Invalid Port: %d\n", port);
1226 static int write_general_port(ushort_t port, void * src, uint_t length, struct vm_device * dev) {
1227 struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
1228 struct channel_t * channel = NULL;
1229 struct drive_t * drive = NULL;
1230 struct controller_t * controller = NULL;
1231 uchar_t value = *(uchar_t *)src;
1234 PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
1238 if (is_primary_port(ramdisk, port)) {
1239 channel = &(ramdisk->channels[0]);
1240 } else if (is_secondary_port(ramdisk, port)) {
1241 channel = &(ramdisk->channels[1]);
1243 PrintError("Invalid Port: %d\n", port);
1247 drive = get_selected_drive(channel);
1248 controller = &(drive->controller);
1251 PrintDebug("[write_general_handler] IO write to port %x (val=0x%02x), channel = %d\n",
1252 port, value, get_channel_no(ramdisk, channel));
1256 case PRI_FEATURES_PORT:
1257 case SEC_FEATURES_PORT: // hard disk write precompensation 0x1f1
1259 write_features(channel, value);
1262 case PRI_SECT_CNT_PORT:
1263 case SEC_SECT_CNT_PORT: // hard disk sector count 0x1f2
1265 write_sector_count(channel, value);
1268 case PRI_SECT_ADDR1_PORT:
1269 case SEC_SECT_ADDR1_PORT: // hard disk sector number 0x1f3
1271 write_sector_number(channel, value);
1274 case PRI_SECT_ADDR2_PORT:
1275 case SEC_SECT_ADDR2_PORT: // hard disk cylinder low 0x1f4
1277 write_cylinder_low(channel, value);
1280 case PRI_SECT_ADDR3_PORT:
1281 case SEC_SECT_ADDR3_PORT: // hard disk cylinder high 0x1f5
1283 write_cylinder_high(channel, value);
1286 case PRI_DRV_SEL_PORT:
1287 case SEC_DRV_SEL_PORT: // hard disk drive and head register 0x1f6
1289 // b7 Extended data field for ECC
1290 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
1291 // Since 512 was always used, bit 6 was taken to mean LBA mode:
1292 // b6 1=LBA mode, 0=CHS mode
1299 PrintDebug("\tDrive Select value=%x\n", value);
1301 if ((value & 0xa0) != 0xa0) {
1302 PrintDebug("\t\tIO write 0x%x (%02x): not 1x1xxxxxb\n", port, (unsigned) value);
1305 write_head_no(channel, value & 0xf);
1306 if ((controller->lba_mode == 0) && (((value >> 6) & 1) == 1)) {
1307 PrintDebug("\t\tenabling LBA mode\n");
1310 write_lba_mode(channel, (value >> 6) & 1);
1314 if (drive->cdrom.cd) {
1315 PrintDebug("\t\tSetting LBA on CDROM: %d\n", (value >> 6) & 1);
1316 drive->cdrom.cd->set_LBA(drive->private_data, (value >> 6) & 1);
1320 channel->drive_select = (value >> 4) & 0x01;
1321 drive = get_selected_drive(channel);
1323 if (drive->device_type == IDE_NONE) {
1324 PrintDebug("\t\tError: device set to %d which does not exist! channel = 0x%x\n",
1325 channel->drive_select, get_channel_no(ramdisk, channel));
1327 controller->error_register = 0x04; // aborted
1328 controller->status.err = 1;
1334 PrintError("\t\thard drive: io write to unhandled port 0x%x (value = %c)\n", port, value);
1345 static void rd_raise_interrupt(struct vm_device * dev, struct channel_t * channel) {
1347 // struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
1348 struct drive_t * drive = get_selected_drive(channel);
1349 struct controller_t * controller = &(drive->controller);
1351 PrintDebug("[raise_interrupt] disable_irq = %02x\n", controller->control.disable_irq);
1353 if (!(controller->control.disable_irq)) {
1356 PrintDebug("\t\tRaising interrupt %d {%s}\n\n", irq, device_type_to_str(drive->device_type));
1358 dev->vm->vm_ops.raise_irq(dev->vm, irq);
1360 PrintDebug("\t\tirq is disabled\n");
1366 static void rd_lower_irq(struct vm_device *dev, Bit32u irq) // __attribute__(regparm(1))
1368 PrintDebug("[lower_irq] irq = %d\n", irq);
1369 dev->vm->vm_ops.lower_irq(dev->vm, irq);
1378 //////////////////////////////////////////////////////////////////////////
1386 int handle_atapi_packet_command(struct vm_device * dev, struct channel_t * channel, ushort_t value) {
1387 struct ramdisk_t * ramdisk = (struct ramdisk_t *)(dev->private_data);
1388 struct drive_t * drive = get_selected_drive(channel);
1389 struct controller_t * controller = &(drive->controller);
1391 if (controller->buffer_index >= PACKET_SIZE) {
1392 PrintError("ATAPI packet exceeded maximum length: buffer_index (%d) >= PACKET_SIZE\n",
1393 controller->buffer_index);
1397 controller->buffer[controller->buffer_index] = value;
1398 controller->buffer[controller->buffer_index + 1] = (value >> 8);
1399 controller->buffer_index += 2;
1402 /* if packet completely writtten */
1403 if (controller->buffer_index >= PACKET_SIZE) {
1404 // complete command received
1405 Bit8u atapi_command = controller->buffer[0];
1407 PrintDebug("\t\tcdrom: ATAPI command 0x%x started\n", atapi_command);
1409 switch (atapi_command) {
1410 case 0x00: // test unit ready
1412 if (drive->cdrom.ready) {
1413 rd_atapi_cmd_nop(dev, channel);
1415 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1418 rd_raise_interrupt(dev, channel);
1422 case 0x03: // request sense
1424 int alloc_length = controller->buffer[4];
1426 if (rd_init_send_atapi_command(dev, channel, atapi_command, 18, alloc_length, false) == -1) {
1431 controller->buffer[0] = 0x70 | (1 << 7);
1432 controller->buffer[1] = 0;
1433 controller->buffer[2] = drive->sense.sense_key;
1434 controller->buffer[3] = drive->sense.information.arr[0];
1435 controller->buffer[4] = drive->sense.information.arr[1];
1436 controller->buffer[5] = drive->sense.information.arr[2];
1437 controller->buffer[6] = drive->sense.information.arr[3];
1438 controller->buffer[7] = 17 - 7;
1439 controller->buffer[8] = drive->sense.specific_inf.arr[0];
1440 controller->buffer[9] = drive->sense.specific_inf.arr[1];
1441 controller->buffer[10] = drive->sense.specific_inf.arr[2];
1442 controller->buffer[11] = drive->sense.specific_inf.arr[3];
1443 controller->buffer[12] = drive->sense.asc;
1444 controller->buffer[13] = drive->sense.ascq;
1445 controller->buffer[14] = drive->sense.fruc;
1446 controller->buffer[15] = drive->sense.key_spec.arr[0];
1447 controller->buffer[16] = drive->sense.key_spec.arr[1];
1448 controller->buffer[17] = drive->sense.key_spec.arr[2];
1450 rd_ready_to_send_atapi(dev, channel);
1453 case 0x1b: // start stop unit
1455 //bx_bool Immed = (controller->buffer[1] >> 0) & 1;
1456 rd_bool LoEj = (controller->buffer[4] >> 1) & 1;
1457 rd_bool Start = (controller->buffer[4] >> 0) & 1;
1460 if ((!LoEj) && (!Start)) {
1461 PrintError("FIXME: Stop disc not implemented\n");
1463 rd_atapi_cmd_nop(dev, channel);
1464 rd_raise_interrupt(dev, channel);
1465 } else if (!LoEj && Start) { // start (spin up) the disc
1467 drive->cdrom.cd->start_cdrom(drive->private_data);
1469 PrintError("FIXME: ATAPI start disc not reading TOC\n");
1470 rd_atapi_cmd_nop(dev, channel);
1471 rd_raise_interrupt(dev, channel);
1472 } else if (LoEj && !Start) { // Eject the disc
1473 rd_atapi_cmd_nop(dev, channel);
1475 if (drive->cdrom.ready) {
1477 drive->cdrom.cd->eject_cdrom(drive->private_data);
1479 drive->cdrom.ready = 0;
1480 //bx_options.atadevice[channel][SLAVE_SELECTED(channel)].Ostatus->set(EJECTED);
1481 //bx_gui->update_drive_status_buttons();
1483 rd_raise_interrupt(dev, channel);
1484 } else { // Load the disc
1485 // My guess is that this command only closes the tray, that's a no-op for us
1486 rd_atapi_cmd_nop(dev, channel);
1487 rd_raise_interrupt(dev, channel);
1491 case 0xbd: // mechanism status
1493 uint16_t alloc_length = rd_read_16bit(controller->buffer + 8);
1495 if (alloc_length == 0) {
1496 PrintError("Zero allocation length to MECHANISM STATUS not impl.\n");
1500 if (rd_init_send_atapi_command(dev, channel, atapi_command, 8, alloc_length, false) == -1) {
1504 controller->buffer[0] = 0; // reserved for non changers
1505 controller->buffer[1] = 0; // reserved for non changers
1507 controller->buffer[2] = 0; // Current LBA (TODO!)
1508 controller->buffer[3] = 0; // Current LBA (TODO!)
1509 controller->buffer[4] = 0; // Current LBA (TODO!)
1511 controller->buffer[5] = 1; // one slot
1513 controller->buffer[6] = 0; // slot table length
1514 controller->buffer[7] = 0; // slot table length
1516 rd_ready_to_send_atapi(dev, channel);
1519 case 0x5a: // mode sense
1521 uint16_t alloc_length = rd_read_16bit(controller->buffer + 7);
1523 Bit8u PC = controller->buffer[2] >> 6;
1524 Bit8u PageCode = controller->buffer[2] & 0x3f;
1527 case 0x0: // current values
1530 case 0x01: // error recovery
1533 if (rd_init_send_atapi_command(dev, channel, atapi_command, sizeof(struct error_recovery_t) + 8, alloc_length, false) == -1) {
1537 rd_init_mode_sense_single(dev, channel, &(drive->cdrom.current.error_recovery),
1538 sizeof(struct error_recovery_t));
1539 rd_ready_to_send_atapi(dev, channel);
1542 case 0x2a: // CD-ROM capabilities & mech. status
1545 if (rd_init_send_atapi_command(dev, channel, atapi_command, 28, alloc_length, false) == -1) {
1549 rd_init_mode_sense_single(dev, channel, &(controller->buffer[8]), 28);
1551 controller->buffer[8] = 0x2a;
1552 controller->buffer[9] = 0x12;
1553 controller->buffer[10] = 0x00;
1554 controller->buffer[11] = 0x00;
1555 // Multisession, Mode 2 Form 2, Mode 2 Form 1
1556 controller->buffer[12] = 0x70;
1557 controller->buffer[13] = (3 << 5);
1558 controller->buffer[14] = (unsigned char) (1 |
1559 (drive->cdrom.locked ? (1 << 1) : 0) |
1562 controller->buffer[15] = 0x00;
1563 controller->buffer[16] = (706 >> 8) & 0xff;
1564 controller->buffer[17] = 706 & 0xff;
1565 controller->buffer[18] = 0;
1566 controller->buffer[19] = 2;
1567 controller->buffer[20] = (512 >> 8) & 0xff;
1568 controller->buffer[21] = 512 & 0xff;
1569 controller->buffer[22] = (706 >> 8) & 0xff;
1570 controller->buffer[23] = 706 & 0xff;
1571 controller->buffer[24] = 0;
1572 controller->buffer[25] = 0;
1573 controller->buffer[26] = 0;
1574 controller->buffer[27] = 0;
1575 rd_ready_to_send_atapi(dev, channel);
1578 case 0x0d: // CD-ROM
1579 case 0x0e: // CD-ROM audio control
1582 PrintError("Ramdisk: cdrom: MODE SENSE (curr), code=%x not implemented yet\n",
1584 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1585 ASC_INV_FIELD_IN_CMD_PACKET);
1586 rd_raise_interrupt(dev, channel);
1591 // not implemeted by this device
1592 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1594 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1595 ASC_INV_FIELD_IN_CMD_PACKET);
1596 rd_raise_interrupt(dev, channel);
1602 case 0x1: // changeable values
1605 case 0x01: // error recovery
1606 case 0x0d: // CD-ROM
1607 case 0x0e: // CD-ROM audio control
1608 case 0x2a: // CD-ROM capabilities & mech. status
1611 PrintError("cdrom: MODE SENSE (chg), code=%x not implemented yet\n",
1613 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1614 ASC_INV_FIELD_IN_CMD_PACKET);
1615 rd_raise_interrupt(dev, channel);
1620 // not implemeted by this device
1621 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1623 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1624 ASC_INV_FIELD_IN_CMD_PACKET);
1625 rd_raise_interrupt(dev, channel);
1631 case 0x2: // default values
1634 case 0x01: // error recovery
1635 case 0x0d: // CD-ROM
1636 case 0x0e: // CD-ROM audio control
1637 case 0x2a: // CD-ROM capabilities & mech. status
1639 PrintError("cdrom: MODE SENSE (dflt), code=%x\n",
1645 // not implemeted by this device
1646 PrintDebug("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1648 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1649 ASC_INV_FIELD_IN_CMD_PACKET);
1650 rd_raise_interrupt(dev, channel);
1656 case 0x3: // saved values not implemented
1658 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1659 rd_raise_interrupt(dev, channel);
1664 PrintError("Should not get here!\n");
1671 case 0x12: // inquiry
1673 uint8_t alloc_length = controller->buffer[4];
1675 if (rd_init_send_atapi_command(dev, channel, atapi_command, 36, alloc_length, false) == -1) {
1679 controller->buffer[0] = 0x05; // CD-ROM
1680 controller->buffer[1] = 0x80; // Removable
1681 controller->buffer[2] = 0x00; // ISO, ECMA, ANSI version
1682 controller->buffer[3] = 0x21; // ATAPI-2, as specified
1683 controller->buffer[4] = 31; // additional length (total 36)
1684 controller->buffer[5] = 0x00; // reserved
1685 controller->buffer[6] = 0x00; // reserved
1686 controller->buffer[7] = 0x00; // reserved
1689 const char* vendor_id = "VTAB ";
1691 for (i = 0; i < 8; i++) {
1692 controller->buffer[8+i] = vendor_id[i];
1696 const char* product_id = "Turbo CD-ROM ";
1697 for (i = 0; i < 16; i++) {
1698 controller->buffer[16+i] = product_id[i];
1701 // Product Revision level
1702 const char* rev_level = "1.0 ";
1703 for (i = 0; i < 4; i++) {
1704 controller->buffer[32 + i] = rev_level[i];
1707 rd_ready_to_send_atapi(dev, channel);
1710 case 0x25: // read cd-rom capacity
1712 // no allocation length???
1713 if (rd_init_send_atapi_command(dev, channel, atapi_command, 8, 8, false) == -1) {
1717 if (drive->cdrom.ready) {
1718 uint32_t capacity = drive->cdrom.capacity;
1720 PrintDebug("\t\tCapacity is %d sectors (%d bytes)\n", capacity, capacity * 2048);
1722 controller->buffer[0] = (capacity >> 24) & 0xff;
1723 controller->buffer[1] = (capacity >> 16) & 0xff;
1724 controller->buffer[2] = (capacity >> 8) & 0xff;
1725 controller->buffer[3] = (capacity >> 0) & 0xff;
1726 controller->buffer[4] = (2048 >> 24) & 0xff;
1727 controller->buffer[5] = (2048 >> 16) & 0xff;
1728 controller->buffer[6] = (2048 >> 8) & 0xff;
1729 controller->buffer[7] = (2048 >> 0) & 0xff;
1731 rd_ready_to_send_atapi(dev, channel);
1733 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1734 rd_raise_interrupt(dev, channel);
1740 case 0xbe: // read cd
1742 if (drive->cdrom.ready) {
1743 PrintError("Read CD with CD present not implemented\n");
1744 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1745 rd_raise_interrupt(dev, channel);
1747 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1748 rd_raise_interrupt(dev, channel);
1752 case 0x43: // read toc
1754 if (drive->cdrom.ready) {
1756 bool msf = (controller->buffer[1] >> 1) & 1;
1757 uint8_t starting_track = controller->buffer[6];
1759 uint16_t alloc_length = rd_read_16bit(controller->buffer + 7);
1761 uint8_t format = (controller->buffer[9] >> 6);
1766 if (!(drive->cdrom.cd->read_toc(drive->private_data, controller->buffer,
1767 &toc_length, msf, starting_track))) {
1768 PrintDebug("CDROM: Reading Table of Contents Failed\n");
1769 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1770 ASC_INV_FIELD_IN_CMD_PACKET);
1771 rd_raise_interrupt(dev, channel);
1773 if (rd_init_send_atapi_command(dev, channel, atapi_command, toc_length, alloc_length, false) == -1) {
1776 rd_ready_to_send_atapi(dev, channel);
1781 // multi session stuff. we ignore this and emulate a single session only
1782 if (rd_init_send_atapi_command(dev, channel, atapi_command, 12, alloc_length, false) == -1) {
1786 controller->buffer[0] = 0;
1787 controller->buffer[1] = 0x0a;
1788 controller->buffer[2] = 1;
1789 controller->buffer[3] = 1;
1791 for (i = 0; i < 8; i++) {
1792 controller->buffer[4 + i] = 0;
1795 rd_ready_to_send_atapi(dev, channel);
1800 PrintError("(READ TOC) Format %d not supported\n", format);
1804 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1805 rd_raise_interrupt(dev, channel);
1809 case 0x28: // read (10)
1810 case 0xa8: // read (12)
1813 uint32_t transfer_length;
1814 if (atapi_command == 0x28) {
1815 transfer_length = rd_read_16bit(controller->buffer + 7);
1817 transfer_length = rd_read_32bit(controller->buffer + 6);
1820 uint32_t lba = rd_read_32bit(controller->buffer + 2);
1822 if (!(drive->cdrom.ready)) {
1823 PrintError("CDROM Error: Not Ready (ATA%d/%d)\n",
1824 get_channel_no(ramdisk, channel), get_drive_no(channel, drive));
1825 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1826 rd_raise_interrupt(dev, channel);
1830 if (transfer_length == 0) {
1831 rd_atapi_cmd_nop(dev, channel);
1832 rd_raise_interrupt(dev, channel);
1833 PrintError("READ(%d) with transfer length 0, ok\n",
1834 (atapi_command == 0x28) ? 10 : 12);
1838 if (lba + transfer_length > drive->cdrom.capacity) {
1839 PrintError("CDROM Error: Capacity exceeded [capacity=%d] (ATA%d/%d)\n",
1840 drive->cdrom.capacity,
1841 get_channel_no(ramdisk, channel), get_drive_no(channel, drive));
1842 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1843 rd_raise_interrupt(dev, channel);
1847 PrintDebug("\t\tcdrom: READ (%d) LBA=%d LEN=%d\n",
1848 (atapi_command == 0x28) ? 10 : 12,
1849 lba, transfer_length);
1852 if (rd_init_send_atapi_command(dev, channel, atapi_command, transfer_length * 2048,
1853 transfer_length * 2048, true) == -1) {
1854 PrintError("CDROM Error: Atapi command send error\n");
1858 drive->cdrom.remaining_blocks = transfer_length;
1859 drive->cdrom.next_lba = lba;
1860 rd_ready_to_send_atapi(dev, channel);
1865 uint32_t lba = rd_read_32bit(controller->buffer + 2);
1867 if (!(drive->cdrom.ready)) {
1868 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1869 rd_raise_interrupt(dev, channel);
1873 if (lba > drive->cdrom.capacity) {
1874 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1875 rd_raise_interrupt(dev, channel);
1879 PrintDebug("\t\tcdrom: SEEK (ignored)\n");
1881 rd_atapi_cmd_nop(dev, channel);
1882 rd_raise_interrupt(dev, channel);
1886 case 0x1e: // prevent/allow medium removal
1889 if (drive->cdrom.ready) {
1890 drive->cdrom.locked = controller->buffer[4] & 1;
1891 rd_atapi_cmd_nop(dev, channel);
1893 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1896 rd_raise_interrupt(dev, channel);
1900 case 0x42: // read sub-channel
1902 //bool msf = get_packet_field(channel,1, 1, 1);
1903 bool sub_q = get_packet_field(channel,2, 6, 1);
1904 //uint8_t data_format = get_packet_byte(channel,3);
1905 //uint8_t track_number = get_packet_byte(channel,6);
1906 uint16_t alloc_length = get_packet_word(channel,7);
1911 UNUSED(data_format);
1912 UNUSED(track_number);
1914 if (!(drive->cdrom.ready)) {
1915 rd_atapi_cmd_error(dev, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1916 rd_raise_interrupt(dev, channel);
1918 controller->buffer[0] = 0;
1919 controller->buffer[1] = 0; // audio not supported
1920 controller->buffer[2] = 0;
1921 controller->buffer[3] = 0;
1923 int ret_len = 4; // header size
1925 if (sub_q) { // !sub_q == header only
1926 PrintError("Read sub-channel with SubQ not implemented\n");
1927 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST,
1928 ASC_INV_FIELD_IN_CMD_PACKET);
1929 rd_raise_interrupt(dev, channel);
1932 if (rd_init_send_atapi_command(dev, channel, atapi_command, ret_len, alloc_length, false) == -1) {
1935 rd_ready_to_send_atapi(dev, channel);
1939 case 0x51: // read disc info
1941 // no-op to keep the Linux CD-ROM driver happy
1942 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1943 rd_raise_interrupt(dev, channel);
1946 case 0x55: // mode select
1947 case 0xa6: // load/unload cd
1948 case 0x4b: // pause/resume
1949 case 0x45: // play audio
1950 case 0x47: // play audio msf
1951 case 0xbc: // play cd
1952 case 0xb9: // read cd msf
1953 case 0x44: // read header
1955 case 0xbb: // set cd speed
1956 case 0x4e: // stop play/scan
1959 PrintError("ATAPI command 0x%x not implemented yet\n",
1961 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1962 rd_raise_interrupt(dev, channel);
1965 PrintError("Unknown ATAPI command 0x%x (%d)\n",
1966 atapi_command, atapi_command);
1967 // We'd better signal the error if the user chose to continue
1968 rd_atapi_cmd_error(dev, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1969 rd_raise_interrupt(dev, channel);
1979 int rd_init_send_atapi_command(struct vm_device * dev, struct channel_t * channel, Bit8u command, int req_length, int alloc_length, bool lazy)
1981 struct drive_t * drive = &(channel->drives[channel->drive_select]);
1982 struct controller_t * controller = &(drive->controller);
1984 // controller->byte_count is a union of controller->cylinder_no;
1985 // lazy is used to force a data read in the buffer at the next read.
1987 PrintDebug("[rd_init_send_atapi_cmd]\n");
1989 if (controller->byte_count == 0xffff) {
1990 controller->byte_count = 0xfffe;
1993 if ((controller->byte_count & 1) &&
1994 !(alloc_length <= controller->byte_count)) {
1996 PrintDebug("\t\tOdd byte count (0x%04x) to ATAPI command 0x%02x, using 0x%x\n",
1997 controller->byte_count,
1999 controller->byte_count - 1);
2001 controller->byte_count -= 1;
2004 if (controller->byte_count == 0) {
2005 PrintError("\t\tATAPI command with zero byte count\n");
2009 if (alloc_length < 0) {
2010 PrintError("\t\tAllocation length < 0\n");
2014 if (alloc_length == 0) {
2015 alloc_length = controller->byte_count;
2018 controller->interrupt_reason.i_o = 1;
2019 controller->interrupt_reason.c_d = 0;
2020 controller->status.busy = 0;
2021 controller->status.drq = 1;
2022 controller->status.err = 0;
2024 // no bytes transfered yet
2026 controller->buffer_index = 2048;
2028 controller->buffer_index = 0;
2031 controller->drq_index = 0;
2033 if (controller->byte_count > req_length) {
2034 controller->byte_count = req_length;
2037 if (controller->byte_count > alloc_length) {
2038 controller->byte_count = alloc_length;
2041 drive->atapi.command = command;
2042 drive->atapi.drq_bytes = controller->byte_count;
2043 drive->atapi.total_bytes_remaining = (req_length < alloc_length) ? req_length : alloc_length;
2046 // // bias drq_bytes and total_bytes_remaining
2047 // SELECTED_DRIVE(channel).atapi.drq_bytes += 2048;
2048 // SELECTED_DRIVE(channel).atapi.total_bytes_remaining += 2048;
2056 void rd_ready_to_send_atapi(struct vm_device * dev, struct channel_t * channel) {
2057 PrintDebug("[rd_ready_to_send_atapi]\n");
2059 rd_raise_interrupt(dev, channel);
2066 void rd_atapi_cmd_error(struct vm_device * dev, struct channel_t * channel, sense_t sense_key, asc_t asc)
2068 struct drive_t * drive = &(channel->drives[channel->drive_select]);
2069 struct controller_t * controller = &(drive->controller);
2071 #ifdef DEBUG_RAMDISK
2073 struct ramdisk_t *ramdisk = (struct ramdisk_t *)(dev->private_data);
2074 PrintDebug("[rd_atapi_cmd_error]\n");
2075 PrintDebug("Error: atapi_cmd_error channel=%02x key=%02x asc=%02x\n",
2076 get_channel_no(ramdisk, channel), sense_key, asc);
2080 controller->error_register = sense_key << 4;
2081 controller->interrupt_reason.i_o = 1;
2082 controller->interrupt_reason.c_d = 1;
2083 controller->interrupt_reason.rel = 0;
2084 controller->status.busy = 0;
2085 controller->status.drive_ready = 1;
2086 controller->status.write_fault = 0;
2087 controller->status.drq = 0;
2088 controller->status.err = 1;
2090 drive->sense.sense_key = sense_key;
2091 drive->sense.asc = asc;
2092 drive->sense.ascq = 0;
2097 void rd_atapi_cmd_nop(struct vm_device * dev, struct channel_t * channel)
2099 struct drive_t * drive = &(channel->drives[channel->drive_select]);
2100 struct controller_t * controller = &(drive->controller);
2102 PrintDebug("[rd_atapi_cmd_nop]\n");
2103 controller->interrupt_reason.i_o = 1;
2104 controller->interrupt_reason.c_d = 1;
2105 controller->interrupt_reason.rel = 0;
2106 controller->status.busy = 0;
2107 controller->status.drive_ready = 1;
2108 controller->status.drq = 0;
2109 controller->status.err = 0;
2115 void rd_identify_ATAPI_drive(struct vm_device * dev, struct channel_t * channel)
2117 struct drive_t * drive = &(channel->drives[channel->drive_select]);
2118 struct controller_t * controller = &(drive->controller);
2122 const char* serial_number = " VT00001\0\0\0\0\0\0\0\0\0\0\0\0";
2123 const char* firmware = "ALPHA1 ";
2125 drive->id_drive[0] = (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0); // Removable CDROM, 50us response, 12 byte packets
2127 for (i = 1; i <= 9; i++) {
2128 drive->id_drive[i] = 0;
2131 for (i = 0; i < 10; i++) {
2132 drive->id_drive[10 + i] = ((serial_number[i * 2] << 8) |
2133 (serial_number[(i * 2) + 1]));
2136 for (i = 20; i <= 22; i++) {
2137 drive->id_drive[i] = 0;
2140 for (i = 0; i < strlen(firmware)/2; i++) {
2141 drive->id_drive[23 + i] = ((firmware[i * 2] << 8) |
2142 (firmware[(i * 2) + 1]));
2144 V3_ASSERT((23 + i) == 27);
2146 for (i = 0; i < strlen((char *)(drive->model_no)) / 2; i++) {
2147 drive->id_drive[27 + i] = ((drive->model_no[i * 2] << 8) |
2148 (drive->model_no[(i * 2) + 1]));
2150 V3_ASSERT((27 + i) == 47);
2152 drive->id_drive[47] = 0;
2153 drive->id_drive[48] = 1; // 32 bits access
2155 drive->id_drive[49] = (1 << 9); // LBA supported
2157 drive->id_drive[50] = 0;
2158 drive->id_drive[51] = 0;
2159 drive->id_drive[52] = 0;
2161 drive->id_drive[53] = 3; // words 64-70, 54-58 valid
2163 for (i = 54; i <= 62; i++) {
2164 drive->id_drive[i] = 0;
2167 // copied from CFA540A
2168 drive->id_drive[63] = 0x0103; // variable (DMA stuff)
2169 drive->id_drive[64] = 0x0001; // PIO
2170 drive->id_drive[65] = 0x00b4;
2171 drive->id_drive[66] = 0x00b4;
2172 drive->id_drive[67] = 0x012c;
2173 drive->id_drive[68] = 0x00b4;
2175 drive->id_drive[69] = 0;
2176 drive->id_drive[70] = 0;
2177 drive->id_drive[71] = 30; // faked
2178 drive->id_drive[72] = 30; // faked
2179 drive->id_drive[73] = 0;
2180 drive->id_drive[74] = 0;
2182 drive->id_drive[75] = 0;
2184 for (i = 76; i <= 79; i++) {
2185 drive->id_drive[i] = 0;
2188 drive->id_drive[80] = 0x1e; // supports up to ATA/ATAPI-4
2189 drive->id_drive[81] = 0;
2190 drive->id_drive[82] = 0;
2191 drive->id_drive[83] = 0;
2192 drive->id_drive[84] = 0;
2193 drive->id_drive[85] = 0;
2194 drive->id_drive[86] = 0;
2195 drive->id_drive[87] = 0;
2196 drive->id_drive[88] = 0;
2198 for (i = 89; i <= 126; i++) {
2199 drive->id_drive[i] = 0;
2202 drive->id_drive[127] = 0;
2203 drive->id_drive[128] = 0;
2205 for (i = 129; i <= 159; i++) {
2206 drive->id_drive[i] = 0;
2209 for (i = 160; i <= 255; i++) {
2210 drive->id_drive[i] = 0;
2213 // now convert the id_drive array (native 256 word format) to
2214 // the controller buffer (512 bytes)
2216 for (i = 0; i <= 255; i++) {
2217 temp16 = drive->id_drive[i];
2218 controller->buffer[i * 2] = temp16 & 0x00ff;
2219 controller->buffer[i * 2 + 1] = temp16 >> 8;
2232 void rd_init_mode_sense_single(struct vm_device * dev,
2233 struct channel_t * channel, const void* src, int size)
2235 struct drive_t * drive = &(channel->drives[channel->drive_select]);
2236 struct controller_t * controller = &(drive->controller);
2238 PrintDebug("[rd_init_mode_sense_single]\n");
2241 controller->buffer[0] = (size + 6) >> 8;
2242 controller->buffer[1] = (size + 6) & 0xff;
2243 controller->buffer[2] = 0x70; // no media present
2244 controller->buffer[3] = 0; // reserved
2245 controller->buffer[4] = 0; // reserved
2246 controller->buffer[5] = 0; // reserved
2247 controller->buffer[6] = 0; // reserved
2248 controller->buffer[7] = 0; // reserved
2251 memcpy(controller->buffer + 8, src, size);
2256 static void rd_command_aborted(struct vm_device * dev,
2257 struct channel_t * channel, unsigned value) {
2258 struct drive_t * drive = &(channel->drives[channel->drive_select]);
2259 struct controller_t * controller = &(drive->controller);
2261 PrintDebug("[rd_command_aborted]\n");
2262 PrintDebug("\t\taborting on command 0x%02x {%s}\n", value, device_type_to_str(drive->device_type));
2264 controller->current_command = 0;
2265 controller->status.busy = 0;
2266 controller->status.drive_ready = 1;
2267 controller->status.err = 1;
2268 controller->error_register = 0x04; // command ABORTED
2269 controller->status.drq = 0;
2270 controller->status.seek_complete = 0;
2271 controller->status.corrected_data = 0;
2272 controller->buffer_index = 0;
2274 rd_raise_interrupt(dev, channel);
2278 static int ramdisk_init_device(struct vm_device *dev) {
2279 struct ramdisk_t *ramdisk= (struct ramdisk_t *)dev->private_data;
2281 PrintDebug("Initializing Ramdisk\n");
2284 rd_init_hardware(ramdisk);
2287 dev_hook_io(dev, PRI_CTRL_PORT,
2288 &read_status_port, &write_ctrl_port);
2290 dev_hook_io(dev, PRI_DATA_PORT,
2291 &read_data_port, &write_data_port);
2292 dev_hook_io(dev, PRI_FEATURES_PORT,
2293 &read_general_port, &write_general_port);
2294 dev_hook_io(dev, PRI_SECT_CNT_PORT,
2295 &read_general_port, &write_general_port);
2296 dev_hook_io(dev, PRI_SECT_ADDR1_PORT,
2297 &read_general_port, &write_general_port);
2298 dev_hook_io(dev, PRI_SECT_ADDR2_PORT,
2299 &read_general_port, &write_general_port);
2300 dev_hook_io(dev, PRI_SECT_ADDR3_PORT,
2301 &read_general_port, &write_general_port);
2302 dev_hook_io(dev, PRI_DRV_SEL_PORT,
2303 &read_general_port, &write_general_port);
2304 dev_hook_io(dev, PRI_CMD_PORT,
2305 &read_status_port, &write_cmd_port);
2308 dev_hook_io(dev, SEC_CTRL_PORT,
2309 &read_status_port, &write_ctrl_port);
2311 dev_hook_io(dev, SEC_DATA_PORT,
2312 &read_data_port, &write_data_port);
2313 dev_hook_io(dev, SEC_FEATURES_PORT,
2314 &read_general_port, &write_general_port);
2315 dev_hook_io(dev, SEC_SECT_CNT_PORT,
2316 &read_general_port, &write_general_port);
2317 dev_hook_io(dev, SEC_SECT_ADDR1_PORT,
2318 &read_general_port, &write_general_port);
2319 dev_hook_io(dev, SEC_SECT_ADDR2_PORT,
2320 &read_general_port, &write_general_port);
2321 dev_hook_io(dev, SEC_SECT_ADDR3_PORT,
2322 &read_general_port, &write_general_port);
2323 dev_hook_io(dev, SEC_DRV_SEL_PORT,
2324 &read_general_port, &write_general_port);
2325 dev_hook_io(dev, SEC_CMD_PORT,
2326 &read_status_port, &write_cmd_port);
2330 dev_hook_io(dev, SEC_ADDR_REG_PORT,
2331 &read_general_port, &write_general_port);
2333 dev_hook_io(dev, PRI_ADDR_REG_PORT,
2334 &read_general_port, &write_general_port);
2343 static int ramdisk_deinit_device(struct vm_device *dev) {
2344 struct ramdisk_t *ramdisk = (struct ramdisk_t *)(dev->private_data);
2345 rd_close_harddrive(ramdisk);
2349 static struct vm_device_ops dev_ops = {
2350 .init = ramdisk_init_device,
2351 .deinit = ramdisk_deinit_device,
2360 struct vm_device *create_ramdisk()
2363 struct ramdisk_t *ramdisk;
2364 ramdisk = (struct ramdisk_t *)V3_Malloc(sizeof(struct ramdisk_t));
2365 V3_ASSERT(ramdisk != NULL);
2367 PrintDebug("[create_ramdisk]\n");
2369 struct vm_device *device = create_device("RAMDISK", &dev_ops, ramdisk);
2377 #ifdef DEBUG_RAMDISK
2379 static void rd_print_state(struct ramdisk_t * ramdisk) {
2382 struct channel_t * channels = (struct channel_t *)(&(ramdisk->channels));
2385 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++) {
2386 memset((char *)(channels + channel), 0, sizeof(struct channel_t));
2389 PrintDebug("sizeof(*channels) = %d\n", sizeof(*channels));
2390 PrintDebug("sizeof(channles->drives[0].controller) = %d\n", sizeof((channels->drives[0].controller)));
2391 PrintDebug("sizeof(channles->drives[0].cdrom) = %d\n", sizeof((channels->drives[0].cdrom)));
2392 PrintDebug("sizeof(channles->drives[0].sense) = %d\n", sizeof((channels->drives[0].sense)));
2393 PrintDebug("sizeof(channles->drives[0].atapi) = %d\n", sizeof((channels->drives[0].atapi)));
2396 PrintDebug("sizeof(channles->drives[0].controller.status) = %d\n",
2397 sizeof((channels->drives[0].controller.status)));
2398 PrintDebug("sizeof(channles->drives[0].controller.sector_count) = %d\n",
2399 sizeof((channels->drives[0].controller.sector_count)));
2400 PrintDebug("sizeof(channles->drives[0].controller.interrupt_reason) = %d\n",
2401 sizeof((channels->drives[0].controller.interrupt_reason)));
2403 PrintDebug("sizeof(channles->drives[0].controller.cylinder_no) = %d\n",
2404 sizeof((channels->drives[0].controller.cylinder_no)));
2405 PrintDebug("sizeof(channles->drives[0].controller.byte_count) = %d\n",
2406 sizeof((channels->drives[0].controller.byte_count)));
2409 PrintDebug("sizeof(channles->drives[0].controller.control) = %d\n",
2410 sizeof((channels->drives[0].controller.control)));
2413 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
2415 for (device = 0; device < 2; device++){
2417 // Initialize controller state, even if device is not present
2418 PrintDebug("channels[%d].drives[%d].controller.status.busy = %d\n",
2420 channels[channel].drives[device].controller.status.busy);
2421 PrintDebug("channels[%d].drives[%d].controller.status.drive_ready = %d\n",
2423 channels[channel].drives[device].controller.status.drive_ready);
2424 PrintDebug("channels[%d].drives[%d].controller.status.write_fault = %d\n",
2426 channels[channel].drives[device].controller.status.write_fault);
2427 PrintDebug("channels[%d].drives[%d].controller.status.seek_complete = %d\n",
2429 channels[channel].drives[device].controller.status.seek_complete);
2430 PrintDebug("channels[%d].drives[%d].controller.status.drq = %d\n",
2432 channels[channel].drives[device].controller.status.drq);
2433 PrintDebug("channels[%d].drives[%d].controller.status.corrected_data = %d\n",
2435 channels[channel].drives[device].controller.status.corrected_data);
2436 PrintDebug("channels[%d].drives[%d].controller.status.index_pulse = %d\n",
2438 channels[channel].drives[device].controller.status.index_pulse);
2439 PrintDebug("channels[%d].drives[%d].controller.status.index_pulse_count = %d\n",
2441 channels[channel].drives[device].controller.status.index_pulse_count);
2442 PrintDebug("channels[%d].drives[%d].controller.status.err = %d\n",
2444 channels[channel].drives[device].controller.status.err);
2447 PrintDebug("channels[%d].drives[%d].controller.error_register = %d\n",
2449 channels[channel].drives[device].controller.error_register);
2450 PrintDebug("channels[%d].drives[%d].controller.head_no = %d\n",
2452 channels[channel].drives[device].controller.head_no);
2453 PrintDebug("channels[%d].drives[%d].controller.sector_count = %d\n",
2455 channels[channel].drives[device].controller.sector_count);
2456 PrintDebug("channels[%d].drives[%d].controller.sector_no = %d\n",
2458 channels[channel].drives[device].controller.sector_no);
2459 PrintDebug("channels[%d].drives[%d].controller.cylinder_no = %d\n",
2461 channels[channel].drives[device].controller.cylinder_no);
2462 PrintDebug("channels[%d].drives[%d].controller.current_command = %02x\n",
2464 channels[channel].drives[device].controller.current_command);
2465 PrintDebug("channels[%d].drives[%d].controller.buffer_index = %d\n",
2467 channels[channel].drives[device].controller.buffer_index);
2470 PrintDebug("channels[%d].drives[%d].controller.control.reset = %d\n",
2472 channels[channel].drives[device].controller.control.reset);
2473 PrintDebug("channels[%d].drives[%d].controller.control.disable_irq = %d\n",
2475 channels[channel].drives[device].controller.control.disable_irq);
2478 PrintDebug("channels[%d].drives[%d].controller.reset_in_progress = %d\n",
2480 channels[channel].drives[device].controller.reset_in_progress);
2481 PrintDebug("channels[%d].drives[%d].controller.sectors_per_block = %02x\n",
2483 channels[channel].drives[device].controller.sectors_per_block);
2484 PrintDebug("channels[%d].drives[%d].controller.lba_mode = %d\n",
2486 channels[channel].drives[device].controller.lba_mode);
2487 PrintDebug("channels[%d].drives[%d].controller.features = %d\n",
2489 channels[channel].drives[device].controller.features);
2492 PrintDebug("channels[%d].drives[%d].model_no = %s\n",
2494 channels[channel].drives[device].model_no);
2495 PrintDebug("channels[%d].drives[%d].device_type = %d\n",
2497 channels[channel].drives[device].device_type);
2498 PrintDebug("channels[%d].drives[%d].cdrom.locked = %d\n",
2500 channels[channel].drives[device].cdrom.locked);
2501 PrintDebug("channels[%d].drives[%d].sense.sense_key = %d\n",
2503 channels[channel].drives[device].sense.sense_key);
2504 PrintDebug("channels[%d].drives[%d].sense.asc = %d\n",
2506 channels[channel].drives[device].sense.asc);
2507 PrintDebug("channels[%d].drives[%d].sense.ascq = %d\n",
2509 channels[channel].drives[device].sense.ascq);
2513 PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n",
2515 channels[channel].drives[device].controller.interrupt_reason.c_d);
2517 PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n",
2519 channels[channel].drives[device].controller.interrupt_reason.i_o);
2521 PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n",
2523 channels[channel].drives[device].controller.interrupt_reason.rel);
2525 PrintDebug("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n",
2527 channels[channel].drives[device].controller.interrupt_reason.tag);
2529 PrintDebug("channels[%d].drives[%d].cdrom.ready = %d\n",
2531 channels[channel].drives[device].cdrom.ready);
2540 static void trace_info(ushort_t port, void *src, uint_t length) {
2545 if (length == 1 && *((uchar_t*) src) == ATA_DETECT)
2546 PrintDebug("ata_detect()\n");
2550 if (length == 1 && *((uchar_t*) src) == ATA_RESET)
2551 PrintDebug("ata_reset()\n");
2555 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_IN)
2556 PrintDebug("ata_cmd_data_in()\n");
2560 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_OUT)
2561 PrintDebug("ata_cmd_data_out()\n");
2565 if (length == 1 && *((uchar_t*) src) == ATA_CMD_PACKET)
2566 PrintDebug("ata_cmd_packet()\n");
2570 if (length == 1 && *((uchar_t*) src) == ATAPI_GET_SENSE)
2571 PrintDebug("atapi_get_sense()\n");
2575 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_READY)
2576 PrintDebug("atapi_is_ready()\n");
2580 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_CDROM)
2581 PrintDebug("atapi_is_cdrom()\n");
2586 if (length == 1 && *((uchar_t*) src) == CDEMU_INIT)
2587 PrintDebug("cdemu_init()\n");
2591 if (length == 1 && *((uchar_t*) src) == CDEMU_ISACTIVE)
2592 PrintDebug("cdemu_isactive()\n");
2596 if (length == 1 && *((uchar_t*) src) == CDEMU_EMULATED_DRIVE)
2597 PrintDebug("cdemu_emulated_drive()\n");
2601 if (length == 1 && *((uchar_t*) src) == CDROM_BOOT)
2602 PrintDebug("cdrom_boot()\n");
2606 if (length == 1 && *((uchar_t*) src) == HARD_DRIVE_POST)
2607 PrintDebug("ata_hard_drive_post()\n");
2612 PrintDebug("ata_device_no(%d)\n", *((uchar_t*) src));
2617 PrintDebug("ata_device_type(%d)\n", *((uchar_t*) src));
2621 if (length == 1 && *((uchar_t*) src) == INT13_HARDDISK)
2622 PrintDebug("int13_harddrive()\n");
2626 if (length == 1 && *((uchar_t*) src) == INT13_CDROM)
2627 PrintDebug("int13_cdrom()\n");
2631 if (length == 1 && *((uchar_t*) src) == INT13_CDEMU)
2632 PrintDebug("int13_cdemu()\n");
2636 if (length == 1 && *((uchar_t*) src) == INT13_ELTORITO)
2637 PrintDebug("int13_eltorito()\n");
2641 if (length == 1 && *((uchar_t*) src) == INT13_DISKETTE_FUNCTION)
2642 PrintDebug("int13_diskette_function()\n");
2653 static int check_bit_fields(struct controller_t * controller) {
2655 controller->sector_count = 0;
2656 controller->interrupt_reason.c_d = 1;
2657 if (controller->sector_count != 0x01) {
2658 return INTR_REASON_BIT_ERR;
2661 controller->sector_count = 0;
2662 controller->interrupt_reason.i_o = 1;
2663 if (controller->sector_count != 0x02) {
2664 return INTR_REASON_BIT_ERR;
2667 controller->sector_count = 0;
2668 controller->interrupt_reason.rel = 1;
2669 if (controller->sector_count != 0x04) {
2670 return INTR_REASON_BIT_ERR;
2673 controller->sector_count = 0;
2674 controller->interrupt_reason.tag = 3;
2675 if (controller->sector_count != 0x18) {
2676 return INTR_REASON_BIT_ERR;