X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fata.h;h=cb0193e965d29ad5e3e1cfeb820e43076a4e40d2;hp=721f2f499e10576dcbca1f39d9c0aa2bbb4f9bb4;hb=0121a4503305424096e2b5c5bd3b6c3af2d813e5;hpb=d0886c953a9e5969ee0f54f11bb146bfe888bfe3 diff --git a/palacios/src/devices/ata.h b/palacios/src/devices/ata.h index 721f2f4..cb0193e 100644 --- a/palacios/src/devices/ata.h +++ b/palacios/src/devices/ata.h @@ -43,8 +43,8 @@ static void ata_identify_device(struct ide_drive * drive) { // Make it the simplest drive possible (1 head, 1 cyl, 1 sect/track) drive_id->num_cylinders = drive->num_cylinders; drive_id->num_heads = drive->num_heads; - drive_id->bytes_per_track = drive->num_sectors * IDE_SECTOR_SIZE; - drive_id->bytes_per_sector = IDE_SECTOR_SIZE; + drive_id->bytes_per_track = drive->num_sectors * HD_SECTOR_SIZE; + drive_id->bytes_per_sector = HD_SECTOR_SIZE; drive_id->sectors_per_track = drive->num_sectors; @@ -64,10 +64,10 @@ static void ata_identify_device(struct ide_drive * drive) { drive_id->lba_enable = 1; // Drive Capacity (28 bit LBA) - drive_id->lba_capacity = drive->hd_ops->get_capacity(drive->private_data); + drive_id->lba_capacity = drive->ops->get_capacity(drive->private_data) / HD_SECTOR_SIZE; // Drive Capacity (48 bit LBA) - drive_id->lba_capacity_2 = drive->hd_ops->get_capacity(drive->private_data); + drive_id->lba_capacity_2 = drive->ops->get_capacity(drive->private_data) / HD_SECTOR_SIZE; // lower byte is the maximum multiple sector size... @@ -116,7 +116,7 @@ static int ata_read(struct vm_device * dev, struct ide_channel * channel, uint8_ PrintDebug("Reading Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt); - int ret = drive->hd_ops->read(dst, sect_cnt, drive->current_lba, drive->private_data); + int ret = drive->ops->read(dst, drive->current_lba * HD_SECTOR_SIZE, sect_cnt * HD_SECTOR_SIZE, drive->private_data); if (ret == -1) { PrintError("IDE: Error reading HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba)); @@ -124,9 +124,27 @@ static int ata_read(struct vm_device * dev, struct ide_channel * channel, uint8_ } return 0; + + + } +static int ata_write(struct vm_device * dev, struct ide_channel * channel, uint8_t * src, uint_t sect_cnt) { + struct ide_drive * drive = get_selected_drive(channel); + + PrintDebug("Writing Drive LBA=%d (count=%d)\n", (uint32_t)(drive->current_lba), sect_cnt); + + int ret = drive->ops->write(src, drive->current_lba * HD_SECTOR_SIZE, sect_cnt * HD_SECTOR_SIZE, drive->private_data); + + if (ret == -1) { + PrintError("IDE: Error writing HD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba)); + return -1; + } + + return 0; +} + static int ata_get_lba(struct vm_device * dev, struct ide_channel * channel, uint64_t * lba) { @@ -152,12 +170,12 @@ static int ata_get_lba(struct vm_device * dev, struct ide_channel * channel, uin lba_addr.buf[3] = channel->drive_head.lba3; - if (lba_addr.addr + (sect_cnt * IDE_SECTOR_SIZE) > - drive->hd_ops->get_capacity(drive->private_data)) { + if ((lba_addr.addr + sect_cnt) > + drive->ops->get_capacity(drive->private_data) / HD_SECTOR_SIZE) { PrintError("IDE: request size exceeds disk capacity (lba=%d) (sect_cnt=%d) (ReadEnd=%d) (capacity=%p)\n", lba_addr.addr, sect_cnt, - lba_addr.addr + (sect_cnt * IDE_SECTOR_SIZE), - (void *)(addr_t)(drive->hd_ops->get_capacity(drive->private_data))); + lba_addr.addr + (sect_cnt * HD_SECTOR_SIZE), + (void *)(addr_t)(drive->ops->get_capacity(drive->private_data))); return -1; } @@ -183,7 +201,7 @@ static int ata_read_sectors(struct vm_device * dev, struct ide_channel * channel return -1; } - drive->transfer_length = sect_cnt * IDE_SECTOR_SIZE; + drive->transfer_length = sect_cnt * HD_SECTOR_SIZE; drive->transfer_index = 0; channel->status.busy = 0;