Diff for /qemu/hw/ide.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2018/04/24 16:41:19 version 1.1.1.3, 2018/04/24 16:43:23
Line 1082  static void ide_atapi_cmd_read(IDEState  Line 1082  static void ide_atapi_cmd_read(IDEState 
     }      }
 }  }
   
 /* same toc as bochs. Return -1 if error or the toc length */  
 /* XXX: check this */  
 static int cdrom_read_toc(IDEState *s, uint8_t *buf, int msf, int start_track)  
 {  
     uint8_t *q;  
     int nb_sectors, len;  
       
     if (start_track > 1 && start_track != 0xaa)  
         return -1;  
     q = buf + 2;  
     *q++ = 1; /* first session */  
     *q++ = 1; /* last session */  
     if (start_track <= 1) {  
         *q++ = 0; /* reserved */  
         *q++ = 0x14; /* ADR, control */  
         *q++ = 1;    /* track number */  
         *q++ = 0; /* reserved */  
         if (msf) {  
             *q++ = 0; /* reserved */  
             lba_to_msf(q, 0);  
             q += 3;  
         } else {  
             /* sector 0 */  
             cpu_to_ube32(q, 0);  
             q += 4;  
         }  
     }  
     /* lead out track */  
     *q++ = 0; /* reserved */  
     *q++ = 0x16; /* ADR, control */  
     *q++ = 0xaa; /* track number */  
     *q++ = 0; /* reserved */  
     nb_sectors = s->nb_sectors >> 2;  
     if (msf) {  
         *q++ = 0; /* reserved */  
         lba_to_msf(q, nb_sectors);  
         q += 3;  
     } else {  
         cpu_to_ube32(q, nb_sectors);  
         q += 4;  
     }  
     len = q - buf;  
     cpu_to_ube16(buf, len - 2);  
     return len;  
 }  
   
 /* mostly same info as PearPc */  
 static int cdrom_read_toc_raw(IDEState *s, uint8_t *buf, int msf,   
                               int session_num)  
 {  
     uint8_t *q;  
     int nb_sectors, len;  
       
     q = buf + 2;  
     *q++ = 1; /* first session */  
     *q++ = 1; /* last session */  
   
     *q++ = 1; /* session number */  
     *q++ = 0x14; /* data track */  
     *q++ = 0; /* track number */  
     *q++ = 0xa0; /* lead-in */  
     *q++ = 0; /* min */  
     *q++ = 0; /* sec */  
     *q++ = 0; /* frame */  
     *q++ = 0;  
     *q++ = 1; /* first track */  
     *q++ = 0x00; /* disk type */  
     *q++ = 0x00;  
       
     *q++ = 1; /* session number */  
     *q++ = 0x14; /* data track */  
     *q++ = 0; /* track number */  
     *q++ = 0xa1;  
     *q++ = 0; /* min */  
     *q++ = 0; /* sec */  
     *q++ = 0; /* frame */  
     *q++ = 0;  
     *q++ = 1; /* last track */  
     *q++ = 0x00;  
     *q++ = 0x00;  
       
     *q++ = 1; /* session number */  
     *q++ = 0x14; /* data track */  
     *q++ = 0; /* track number */  
     *q++ = 0xa2; /* lead-out */  
     *q++ = 0; /* min */  
     *q++ = 0; /* sec */  
     *q++ = 0; /* frame */  
     nb_sectors = s->nb_sectors >> 2;  
     if (msf) {  
         *q++ = 0; /* reserved */  
         lba_to_msf(q, nb_sectors);  
         q += 3;  
     } else {  
         cpu_to_ube32(q, nb_sectors);  
         q += 4;  
     }  
   
     *q++ = 1; /* session number */  
     *q++ = 0x14; /* ADR, control */  
     *q++ = 0;    /* track number */  
     *q++ = 1;    /* point */  
     *q++ = 0; /* min */  
     *q++ = 0; /* sec */  
     *q++ = 0; /* frame */  
     if (msf) {  
         *q++ = 0;   
         lba_to_msf(q, 0);  
         q += 3;  
     } else {  
         *q++ = 0;   
         *q++ = 0;   
         *q++ = 0;   
         *q++ = 0;   
     }  
   
     len = q - buf;  
     cpu_to_ube16(buf, len - 2);  
     return len;  
 }  
   
 static void ide_atapi_cmd(IDEState *s)  static void ide_atapi_cmd(IDEState *s)
 {  {
     const uint8_t *packet;      const uint8_t *packet;
Line 1449  static void ide_atapi_cmd(IDEState *s) Line 1328  static void ide_atapi_cmd(IDEState *s)
             start_track = packet[6];              start_track = packet[6];
             switch(format) {              switch(format) {
             case 0:              case 0:
                 len = cdrom_read_toc(s, buf, msf, start_track);                  len = cdrom_read_toc(s->nb_sectors >> 2, buf, msf, start_track);
                 if (len < 0)                  if (len < 0)
                     goto error_cmd;                      goto error_cmd;
                 ide_atapi_cmd_reply(s, len, max_len);                  ide_atapi_cmd_reply(s, len, max_len);
Line 1463  static void ide_atapi_cmd(IDEState *s) Line 1342  static void ide_atapi_cmd(IDEState *s)
                 ide_atapi_cmd_reply(s, 12, max_len);                  ide_atapi_cmd_reply(s, 12, max_len);
                 break;                  break;
             case 2:              case 2:
                 len = cdrom_read_toc_raw(s, buf, msf, start_track);                  len = cdrom_read_toc_raw(s->nb_sectors >> 2, buf, msf, start_track);
                 if (len < 0)                  if (len < 0)
                     goto error_cmd;                      goto error_cmd;
                 ide_atapi_cmd_reply(s, len, max_len);                  ide_atapi_cmd_reply(s, len, max_len);
Line 1777  static void ide_ioport_write(void *opaqu Line 1656  static void ide_ioport_write(void *opaqu
             break;              break;
         case WIN_FLUSH_CACHE:          case WIN_FLUSH_CACHE:
         case WIN_FLUSH_CACHE_EXT:          case WIN_FLUSH_CACHE_EXT:
               if (s->bs)
                   bdrv_flush(s->bs);
               s->status = READY_STAT;
               ide_set_irq(s);
               break;
         case WIN_STANDBYNOW1:          case WIN_STANDBYNOW1:
         case WIN_IDLEIMMEDIATE:          case WIN_IDLEIMMEDIATE:
             s->status = READY_STAT;              s->status = READY_STAT;
Line 2490  void pci_cmd646_ide_init(PCIBus *bus, Bl Line 2374  void pci_cmd646_ide_init(PCIBus *bus, Bl
   
 /* hd_table must contain 4 block drivers */  /* hd_table must contain 4 block drivers */
 /* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */  /* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
 void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table)  void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn)
 {  {
     PCIIDEState *d;      PCIIDEState *d;
     uint8_t *pci_conf;      uint8_t *pci_conf;
Line 2498  void pci_piix3_ide_init(PCIBus *bus, Blo Line 2382  void pci_piix3_ide_init(PCIBus *bus, Blo
     /* register a function 1 of PIIX3 */      /* register a function 1 of PIIX3 */
     d = (PCIIDEState *)pci_register_device(bus, "PIIX3 IDE",       d = (PCIIDEState *)pci_register_device(bus, "PIIX3 IDE", 
                                            sizeof(PCIIDEState),                                             sizeof(PCIIDEState),
                                            ((PCIDevice *)piix3_state)->devfn + 1,                                              devfn,
                                            NULL, NULL);                                             NULL, NULL);
     d->type = IDE_TYPE_PIIX3;      d->type = IDE_TYPE_PIIX3;
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


unix.superglobalmegacorp.com