VirtualBox

Changeset 80168 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Aug 7, 2019 12:48:58 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132609
Message:

Fixed offset usage that caused reaching into wrong values of newest driver-side config struct, and further refined logging (see #9440, Comment 42)

File:
1 edited

Legend:

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

    r80149 r80168  
    6060#define VIRTIOSCSI_REGION_PCI_CAP                   2
    6161
    62 /**
    63  * Definitions that follow are based on the VirtIO 1.0 specification.
    64  * Struct names are the same. The field names have been adapted to VirtualBox
    65  * data type + camel case annotation, with the original field name from the
    66  * VirtIO specification in the field's comment.
    67  */
    68 
    6962#define MATCH_SCSI_CONFIG(member) \
    7063    ((int)uOffset >= RT_OFFSETOF(VIRTIO_SCSI_CONFIG_T, member) \
     
    7568
    7669#define LOG_ACCESSOR(member) \
    77         LogFunc(("Guest %s %s [%d:%d]: %.*Rhxs\n", \
    78                   fWrite ? "wrote" : "read ", #member,  mOffset, mOffset + cb, cb, pv));
     70        virtioLogMappedIoValue(__FUNCTION__, #member, pv, cb, uMemberOffset, fWrite, false, 0);
    7971
    8072#define SCSI_CONFIG_ACCESSOR(member) \
    8173    { \
    82         uint32_t mOffset = uOffset - RT_OFFSETOF(VIRTIO_SCSI_CONFIG_T, member); \
     74        uint32_t uMemberOffset = uOffset - RT_OFFSETOF(VIRTIO_SCSI_CONFIG_T, member); \
    8375        if (fWrite) \
    84             memcpy(((char *)&pThis->virtioScsiConfig.member) + uOffset, (const char *)pv, cb); \
     76            memcpy(((char *)&pThis->virtioScsiConfig.member) + uMemberOffset, (const char *)pv, cb); \
    8577        else \
    86             memcpy((char *)pv, (const char *)(((char *)&pThis->virtioScsiConfig.member) + uOffset), cb); \
     78            memcpy((char *)pv, (const char *)(((char *)&pThis->virtioScsiConfig.member) + uMemberOffset), cb); \
    8779        LOG_ACCESSOR(member); \
    8880    }
     
    9082#define SCSI_CONFIG_ACCESSOR_READONLY(member) \
    9183    { \
    92         uint32_t mOffset = uOffset - RT_OFFSETOF(VIRTIO_SCSI_CONFIG_T, member); \
     84        uint32_t uMemberOffset = uOffset - RT_OFFSETOF(VIRTIO_SCSI_CONFIG_T, member); \
    9385        if (fWrite) \
    9486            LogFunc(("Guest attempted to write readonly virtio_pci_common_cfg.%s\n", #member)); \
    9587        else \
    9688        { \
    97             memcpy((char *)pv, (const char *)(((char *)&pThis->virtioScsiConfig.member) + uOffset), cb); \
     89            memcpy((char *)pv, (const char *)(((char *)&pThis->virtioScsiConfig.member) + uMemberOffset), cb); \
    9890            LOG_ACCESSOR(member); \
    9991        } \
    10092    }
    10193
     94/**
     95 * Definitions that follow are based on the VirtIO 1.0 specification.
     96 * Struct names are the same. The field names have been adapted to VirtualBox
     97 * data type + camel case annotation, with the original field name from the
     98 * VirtIO specification in the field's comment.
     99 */
    102100
    103101/** @name VirtIO 1.0 SCSI Host feature bits
     
    112110 * Features VirtIO 1.0 Host SCSI controller offers guest driver
    113111 */
    114 #define VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED         VIRTIOSCSI_F_INOUT   \
    115                                                     | VIRTIOSCSI_F_HOTPLUG \
    116                                                     | VIRTIOSCSI_F_CHANGE  \
    117                                                     | VIRTIOSCSI_F_T10_PI  \
     112#define VIRTIOSCSI_HOST_SCSI_FEATURES_OFFERED \
     113            (VIRTIOSCSI_F_INOUT | VIRTIOSCSI_F_HOTPLUG | VIRTIOSCSI_F_CHANGE | VIRTIOSCSI_F_T10_PI)
    118114
    119115typedef struct virtio_scsi_config
     
    167163} VIRTIO_SCSI_REQ_CMD_T, *PVIRTIO_SCSI_REQ_CMD_T;
    168164
    169 /** Command-specific response values */
     165/** @name VirtIO 1.0 SCSI req command-specific response values
     166 * @{  */
    170167#define VIRTIOSCSI_S_OK                            0       /* control, command   */
    171168#define VIRTIOSCSI_S_OVERRUN                       1       /* control */
     
    179176#define VIRTIOSCSI_S_FAILURE                       9       /* control, command */
    180177#define VIRTIOSCSI_S_INCORRECT_LUN                12       /* command */
    181 
    182 
    183 /** task_attr */
     178/** @} */
     179
     180
     181/** @name VirtIO 1.0 SCSI Command-specific task_attr values
     182 * @{  */
    184183#define VIRTIOSCSI_S_SIMPLE                        0
    185184#define VIRTIOSCSI_S_ORDERED                       1
    186185#define VIRTIOSCSI_S_HEAD                          2
    187186#define VIRTIOSCSI_S_ACA                           3
     187/** @} */
    188188
    189189#define VIRTIOSCSI_T_TMF                           0
     
    208208} VIRTIO_SCSI_CTRL_BUF_T, *PVIRTIO_SCSI_CTRL_BUF_T;
    209209
    210 /* command-specific response values */
    211 
     210/** @name VirtIO 1.0 SCSI tmf control command-specific response values
     211 * @{  */
    212212#define VIRTIOSCSI_S_FUNCTION_COMPLETE            0
    213213#define VIRTIOSCSI_S_FUNCTION_SUCCEEDED           10
    214214#define VIRTIOSCSI_S_FUNCTION_REJECTED            11
     215/** @} */
    215216
    216217#define VIRTIOSCSI_T_AN_QUERY                     1         /** Asynchronous notification query */
     
    242243    uint8_t  response;                                       /** response        */
    243244} VIRTIO_SCSI_CTRL_T, *PVIRTIO_SCSI_CTRL_T;
     245
    244246
    245247#define VIRTIOSCSI_T_NO_EVENT                   0
     
    758760}
    759761
    760 static int virtioScsiR3ConfigAccess(PVIRTIOSCSI pThis, uint32_t uOffset,
     762static int virtioScsiR3CfgAccessed(PVIRTIOSCSI pThis, uint32_t uOffset,
    761763                                    const void *pv, size_t cb, uint8_t fWrite)
    762764{
     
    825827 * @param   pDevIns     The device instance.
    826828 * @param   uOffset     Offset within device specific capabilities struct
    827  * @param   pv       Buffer in which to save read data
     829 * @param   pv          Buffer in which to save read data
    828830 * @param   cb          Number of bytes to read
    829831 */
     
    836838//              uOffset, cb));
    837839
    838     rc = virtioScsiR3ConfigAccess(pThis, uOffset, pv, cb, false);
     840    rc = virtioScsiR3CfgAccessed(pThis, uOffset, pv, cb, false);
    839841
    840842    return rc;
     
    847849 * @param   pDevIns     The device instance.
    848850 * @param   uOffset     Offset within device specific capabilities struct
    849  * @param   pv       Buffer in which to save read data
     851 * @param   pv          Buffer in which to save read data
    850852 * @param   cb          Number of bytes to write
    851853 */
     
    858860//              uOffset, cb));
    859861
    860     rc = virtioScsiR3ConfigAccess(pThis, uOffset, pv, cb, true);
     862    rc = virtioScsiR3CfgAccessed(pThis, uOffset, pv, cb, true);
    861863
    862864    return rc;
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