VirtualBox

Changeset 43724 in vbox for trunk/src/VBox/Devices/PC/BIOS


Ignore:
Timestamp:
Oct 24, 2012 11:26:54 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
81608
Message:

BIOS: Use indirect calls for packet reads to reduce code size.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/eltorito.c

    r43671 r43724  
    9494ct_assert(sizeof(cdb_atapi) == 12);
    9595
     96/* Generic ATAPI/SCSI CD-ROM access routine signature. */
     97typedef uint16_t (* cd_pkt_func)(uint16_t device_id, uint8_t cmdlen, char __far *cmdbuf,
     98                                 uint16_t header, uint32_t length, uint8_t inout, char __far *buffer);
     99
     100/* Pointers to HW specific CD-ROM access routines. */
     101cd_pkt_func     pktacc[DSKTYP_CNT] = {
     102    [DSK_TYPE_ATAPI]  = { ata_cmd_packet },
     103#ifdef VBOX_WITH_AHCI
     104    [DSK_TYPE_AHCI]   = { ahci_cmd_packet },
     105#endif
     106#ifdef VBOX_WITH_SCSI
     107    [DSK_TYPE_SCSI]   = { scsi_cmd_packet },
     108#endif
     109};
     110
    96111// ---------------------------------------------------------------------------
    97112// Start of El-Torito boot functions
     
    267282    for (read_try = 0; read_try <= 4; ++read_try)
    268283    {
    269         //@todo: Use indirect calls instead?
    270         if (VBOX_IS_AHCI_DEVICE(device))
    271             error = ahci_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    272         else if (VBOX_IS_SCSI_DEVICE(device))
    273             error = scsi_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    274         else
    275             error = ata_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
     284        error = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    276285        if (!error)
    277286            break;
     
    306315#endif
    307316
    308     if (VBOX_IS_AHCI_DEVICE(device))
    309         error = ahci_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    310     else if (VBOX_IS_SCSI_DEVICE(device))
    311         error = scsi_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    312     else
    313         error = ata_cmd_packet(device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    314 
     317    error = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, 0, 2048L, ATA_DATA_IN, &buffer);
    315318    if (error != 0)
    316319        return 7;
     
    372375    bios_dsk->drqp.skip_a = (2048 - nbsectors * 512) % 2048;
    373376
    374     if (VBOX_IS_AHCI_DEVICE(device))
    375         error = ahci_cmd_packet(device, 12, (char __far *)&atapicmd, 0, nbsectors*512L, ATA_DATA_IN, MK_FP(boot_segment,0));
    376     else if (VBOX_IS_SCSI_DEVICE(device))
    377         error = scsi_cmd_packet(device, 12, (char __far *)&atapicmd, 0, nbsectors*512L, ATA_DATA_IN, MK_FP(boot_segment,0));
    378     else
    379         error = ata_cmd_packet(device, 12, (char __far *)&atapicmd, 0, nbsectors*512L, ATA_DATA_IN, MK_FP(boot_segment,0));
     377    error = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, 0, nbsectors*512L, ATA_DATA_IN, MK_FP(boot_segment,0));
    380378
    381379    bios_dsk->drqp.skip_a = 0;
     
    560558        bios_dsk->drqp.skip_a = ((4 - nbsectors % 4 - before) * 512) % 2048;
    561559
    562         if (VBOX_IS_AHCI_DEVICE(device))
    563             status = ahci_cmd_packet(device, 12, (char __far *)&atapicmd, before*512, nbsectors*512L, ATA_DATA_IN, MK_FP(segment,offset));
    564         else if (VBOX_IS_SCSI_DEVICE(device))
    565             status = scsi_cmd_packet(device, 12, (char __far *)&atapicmd, before*512, nbsectors*512L, ATA_DATA_IN, MK_FP(segment,offset));
    566         else
    567             status = ata_cmd_packet(device, 12, (char __far *)&atapicmd, before*512, nbsectors*512L, ATA_DATA_IN, MK_FP(segment,offset));
     560        status = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, before*512, nbsectors*512L, ATA_DATA_IN, MK_FP(segment,offset));
    568561
    569562        bios_dsk->drqp.skip_b = 0;
     
    766759        bios_dsk->drqp.sect_sz = 2048;
    767760
    768         if (VBOX_IS_AHCI_DEVICE(device))
    769             status = ahci_cmd_packet(device, 12, (char __far *)&atapicmd, 0, count*2048L, ATA_DATA_IN, MK_FP(segment,offset));
    770         else if (VBOX_IS_SCSI_DEVICE(device))
    771             status = scsi_cmd_packet(device, 12, (char __far *)&atapicmd, 0, count*2048L, ATA_DATA_IN, MK_FP(segment,offset));
    772         else
    773             status = ata_cmd_packet(device, 12, (char __far *)&atapicmd, 0, count*2048L, ATA_DATA_IN, MK_FP(segment,offset));
     761        status = pktacc[bios_dsk->devices[device].type](device, 12, (char __far *)&atapicmd, 0, count*2048L, ATA_DATA_IN, MK_FP(segment,offset));
    774762
    775763        count = (uint16_t)(bios_dsk->drqp.trsfbytes >> 11);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette