VirtualBox

Changeset 26104 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 29, 2010 4:46:11 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
57090
Message:

SATA: integrity word

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/ATAController.cpp

    r25986 r26104  
    647647}
    648648
     649static uint32_t ataChecksum(void* ptr, size_t count)
     650{
     651    uint8_t u8Sum = 0xa5, *p = (uint8_t*)ptr;
     652    size_t i;
     653
     654    for (i = 0; i < count; i++)
     655    {
     656      u8Sum += *p++;
     657    }
     658
     659    return (uint8_t)-(int32_t)u8Sum;
     660}
    649661
    650662static void ataCmdOK(AHCIATADevState *s, uint8_t status)
     
    765777        p[103] = RT_H2LE_U16(s->cTotalSectors >> 48);
    766778    }
     779    uint32_t uCsum = ataChecksum(p, 510);
     780    p[255] = RT_H2LE_U16(0xa5 | (uCsum << 8)); /* Integrity word */
     781
    767782    s->iSourceSink = ATAFN_SS_NULL;
    768783    ataCmdOK(s, ATA_STAT_SEEK);
     
    848863    p[88] = RT_H2LE_U16(ATA_TRANSFER_ID(ATA_MODE_UDMA, ATA_UDMA_MODE_MAX, s->uATATransferMode)); /* UDMA modes supported / mode enabled */
    849864    p[93] = RT_H2LE_U16((1 | 1 << 1) << ((s->iLUN & 1) == 0 ? 0 : 8) | 1 << 13 | 1 << 14);
     865    uint32_t uCsum = ataChecksum(p, 510);
     866    p[255] = RT_H2LE_U16(0xa5 | (uCsum << 8)); /* Integrity word */
    850867    s->iSourceSink = ATAFN_SS_NULL;
    851868    ataCmdOK(s, ATA_STAT_SEEK);
     
    55395556#endif /* IN_RING3 */
    55405557#endif /* !VBOX_DEVICE_STRUCT_TESTCASE */
    5541 
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