VirtualBox

Changeset 43241 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Sep 7, 2012 12:06:37 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
80644
Message:

RTC: Do not corrupt CMOS bank 1 by writing to bank 2 without writing bank 2 index first.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevRTC.cpp

    r41710 r43241  
    115115#define CMOS_BANK2_LOWER_LIMIT  0x80
    116116#define CMOS_BANK2_UPPER_LIMIT  0xFF
     117#define CMOS_BANK_SIZE          0x80
    117118
    118119/** The saved state version. */
     
    379380    if ((Port & 1) == 0)
    380381    {
    381         pThis->cmos_index[bank] = (u32 & 0x7f) + (bank * 128);
     382        pThis->cmos_index[bank] = (u32 & 0x7f) + (bank * CMOS_BANK_SIZE);
    382383    }
    383384    else
     
    769770
    770771    /* The state. */
    771     SSMR3PutMem(pSSM, pThis->cmos_data, 128);
     772    SSMR3PutMem(pSSM, pThis->cmos_data, CMOS_BANK_SIZE);
    772773    SSMR3PutU8(pSSM, pThis->cmos_index[0]);
    773774
     
    790791    SSMR3PutBool(pSSM, pThis->fDisabledByHpet);
    791792
    792     SSMR3PutMem(pSSM, &pThis->cmos_data[128], 128);
     793    SSMR3PutMem(pSSM, &pThis->cmos_data[CMOS_BANK_SIZE], CMOS_BANK_SIZE);
    793794    return SSMR3PutU8(pSSM, pThis->cmos_index[1]);
    794795}
     
    832833
    833834    /* The state. */
    834     SSMR3GetMem(pSSM, pThis->cmos_data, 128);
     835    SSMR3GetMem(pSSM, pThis->cmos_data, CMOS_BANK_SIZE);
    835836    SSMR3GetU8(pSSM, &pThis->cmos_index[0]);
    836837
     
    857858    {
    858859        /* Second CMOS bank. */
    859         SSMR3GetMem(pSSM, &pThis->cmos_data[128], 128);
     860        SSMR3GetMem(pSSM, &pThis->cmos_data[CMOS_BANK_SIZE], CMOS_BANK_SIZE);
    860861        SSMR3GetU8(pSSM, &pThis->cmos_index[1]);
    861862    }
     
    10331034
    10341035    Log(("CMOS bank 0: \n%16.128Rhxd\n", &pThis->cmos_data[0]));
    1035     Log(("CMOS bank 1: \n%16.128Rhxd\n", &pThis->cmos_data[128]));
     1036    Log(("CMOS bank 1: \n%16.128Rhxd\n", &pThis->cmos_data[CMOS_BANK_SIZE]));
    10361037    return VINF_SUCCESS;
    10371038}
     
    10881089        pThis->cmos_data[0xF] = 0;
    10891090    }
     1091
     1092    /* Reset index values (important for second bank). */
     1093    pThis->cmos_index[0]        = 0;
     1094    pThis->cmos_index[1]        = CMOS_BANK_SIZE;   /* Point to start of second bank. */
    10901095}
    10911096
     
    11581163    pThis->RtcReg.pfnWrite      = rtcCMOSWrite;
    11591164    pThis->fDisabledByHpet      = false;
     1165    pThis->cmos_index[1]        = CMOS_BANK_SIZE;   /* Point to start of second bank. */
     1166
    11601167
    11611168    /* IBase */
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