VirtualBox

Ignore:
Timestamp:
Nov 23, 2015 12:13:00 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
104274
Message:

BIOS: Reduced read path stack usage for ATA/AHCI.

File:
1 edited

Legend:

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

    r58724 r58818  
    235235    parm [ax] modify nomemory;
    236236
    237 void high_bits_save(ahci_t __far *ahci)
     237void inline high_bits_save(ahci_t __far *ahci)
    238238{
    239239    ahci->saved_eax_hi = eax_hi_rd();
    240240}
    241241
    242 void high_bits_restore(ahci_t __far *ahci)
     242void inline high_bits_restore(ahci_t __far *ahci)
    243243{
    244244    eax_hi_wr(ahci->saved_eax_hi);
     
    248248 * Sets a given set of bits in a register.
    249249 */
    250 static void ahci_ctrl_set_bits(uint16_t iobase, uint16_t reg, uint32_t mask)
     250static void inline ahci_ctrl_set_bits(uint16_t iobase, uint16_t reg, uint32_t mask)
    251251{
    252252    outpd(iobase + AHCI_REG_IDX, reg);
     
    257257 * Clears a given set of bits in a register.
    258258 */
    259 static void ahci_ctrl_clear_bits(uint16_t iobase, uint16_t reg, uint32_t mask)
     259static void inline ahci_ctrl_clear_bits(uint16_t iobase, uint16_t reg, uint32_t mask)
    260260{
    261261    outpd(iobase + AHCI_REG_IDX, reg);
     
    267267 * for a register.
    268268 */
    269 static uint8_t ahci_ctrl_is_bit_set(uint16_t iobase, uint16_t reg, uint32_t mask)
     269static uint8_t inline ahci_ctrl_is_bit_set(uint16_t iobase, uint16_t reg, uint32_t mask)
    270270{
    271271    outpd(iobase + AHCI_REG_IDX, reg);
     
    343343    uint16_t        n_sect = bios_dsk->drqp.nsect;
    344344    uint16_t        sectsz = bios_dsk->drqp.sect_sz;
    345     uint16_t        prdt_idx;
    346345    fis_d2h __far   *d2h;
    347346
     
    373372    vds_build_sg_list(&ahci->edds, bios_dsk->drqp.buffer, (uint32_t)n_sect * sectsz);
    374373
    375     prdt_idx = ahci->cur_prd;
    376 
    377374    /* Set up the PRDT. */
    378     ahci->aPrdt[prdt_idx].len       = ahci->edds.u.sg[0].size - 1;
    379     ahci->aPrdt[prdt_idx].phys_addr = ahci->edds.u.sg[0].phys_addr;
    380     ++prdt_idx;
     375    ahci->aPrdt[ahci->cur_prd].len       = ahci->edds.u.sg[0].size - 1;
     376    ahci->aPrdt[ahci->cur_prd].phys_addr = ahci->edds.u.sg[0].phys_addr;
     377    ++ahci->cur_prd;
    381378
    382379    if (bios_dsk->drqp.skip_a) {
    383         ahci->aPrdt[prdt_idx].len       = bios_dsk->drqp.skip_a - 1;
    384         ahci->aPrdt[prdt_idx].phys_addr = ahci->sink_buf_phys;
    385         ++prdt_idx;
    386     }
    387 
    388     ahci->cur_prd = prdt_idx;
    389 
    390 #ifdef DEBUG_AHCI
    391     for (prdt_idx = 0; prdt_idx < ahci->cur_prd; ++prdt_idx) {
    392         DBG_AHCI("S/G entry %u: %5lu bytes @ %08lX\n", prdt_idx,
    393                  ahci->aPrdt[prdt_idx].len + 1, ahci->aPrdt[prdt_idx].phys_addr);
     380        ahci->aPrdt[ahci->cur_prd].len       = bios_dsk->drqp.skip_a - 1;
     381        ahci->aPrdt[ahci->cur_prd].phys_addr = ahci->sink_buf_phys;
     382        ++ahci->cur_prd;
     383    }
     384
     385#if DEBUG_AHCI
     386    {
     387        uint16_t     prdt_idx;
     388
     389        for (prdt_idx = 0; prdt_idx < ahci->cur_prd; ++prdt_idx) {
     390            DBG_AHCI("S/G entry %u: %5lu bytes @ %08lX\n", prdt_idx,
     391                     ahci->aPrdt[prdt_idx].len + 1, ahci->aPrdt[prdt_idx].phys_addr);
     392        }
    394393    }
    395394#endif
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