VirtualBox

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


Ignore:
Timestamp:
Mar 19, 2012 5:05:56 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76935
Message:

Started logging of SCSI mode pages for debug builds

File:
1 edited

Legend:

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

    r38622 r40543  
    1919#include <iprt/assert.h>
    2020#include <iprt/types.h>
     21#include <iprt/string.h>
    2122#include <VBox/scsi.h>
    2223#include "ide.h"
     
    938939    return "(Unknown extended sense code)";
    939940}
     941
     942/**
     943 * Log the write parameters mode page into a given buffer.
     944 */
     945static int scsiLogWriteParamsModePage(char *pszBuffer, size_t cchBuffer,
     946                                      uint8_t *pbModePage, size_t cbModePage)
     947{
     948    size_t cch = 0;
     949    const char *pcsz = NULL;
     950
     951    switch (pbModePage[2] & 0x0f)
     952    {
     953        case 0x00: pcsz = "Packet/Incremental"; break;
     954        case 0x01: pcsz = "Track At Once"; break;
     955        case 0x02: pcsz = "Session At Once"; break;
     956        case 0x03: pcsz = "RAW"; break;
     957        case 0x04: pcsz = "Layer Jump Recording"; break;
     958        default : pcsz = "Unknown/Reserved Write Type"; break;
     959    }
     960
     961    cch = RTStrPrintf(pszBuffer, cchBuffer, "BUFE=%d LS_V=%d TestWrite=%d WriteType=%s\n",
     962                      pbModePage[2] & RT_BIT(6) ? 1 : 0,
     963                      pbModePage[2] & RT_BIT(5) ? 1 : 0,
     964                      pbModePage[2] & RT_BIT(4) ? 1 : 0,
     965                      pcsz);
     966    pszBuffer += cch;
     967    cchBuffer -= cch;
     968    if (!cchBuffer)
     969        return VERR_BUFFER_OVERFLOW;
     970
     971    switch ((pbModePage[3] & 0xc0) >> 6)
     972    {
     973        case 0x00: pcsz = "No B0 pointer, no next session"; break;
     974        case 0x01: pcsz = "B0 pointer=FF:FF:FF, no next session"; break;
     975        case 0x02: pcsz = "Reserved"; break;
     976        case 0x03: pcsz = "Next session allowed"; break;
     977        default: pcsz = "Impossible multi session field value"; break;
     978    }
     979
     980    cch = RTStrPrintf(pszBuffer, cchBuffer, "MultiSession=%s FP=%d Copy=%d TrackMode=%d\n",
     981                      pcsz,
     982                      pbModePage[3] & RT_BIT(5) ? 1 : 0,
     983                      pbModePage[3] & RT_BIT(4) ? 1 : 0,
     984                      pbModePage[3] & 0x0f);
     985    pszBuffer += cch;
     986    cchBuffer -= cch;
     987    if (!cchBuffer)
     988        return VERR_BUFFER_OVERFLOW;
     989
     990    switch (pbModePage[4] & 0x0f)
     991    {
     992        case  0: pcsz = "Raw data (2352)"; break;
     993        case  1: pcsz = "Raw data with P and Q Sub-channel (2368)"; break;
     994        case  2: pcsz = "Raw data with P-W Sub-channel (2448)"; break;
     995        case  3: pcsz = "Raw data with raw P-W Sub-channel (2448)"; break;
     996        case  8: pcsz = "Mode 1 (ISO/IEC 10149) (2048)"; break;
     997        case  9: pcsz = "Mode 2 (ISO/IEC 10149) (2336)"; break;
     998        case 10: pcsz = "Mode 2 (CD-ROM XA, form 1) (2048)"; break;
     999        case 11: pcsz = "Mode 2 (CD-ROM XA, form 1) (2056)"; break;
     1000        case 12: pcsz = "Mode 2 (CD-ROM XA, form 2) (2324)"; break;
     1001        case 13: pcsz = "Mode 2 (CD-ROM XA, form 1, form 2 or mixed form) (2332)"; break;
     1002        default: pcsz = "Reserved or vendor specific Data Block Type Code"; break;
     1003    }
     1004
     1005    cch = RTStrPrintf(pszBuffer, cchBuffer, "DataBlockType=%d (%s)\n",
     1006                      pbModePage[4] & 0x0f,
     1007                      pcsz);
     1008    pszBuffer += cch;
     1009    cchBuffer -= cch;
     1010    if (!cchBuffer)
     1011        return VERR_BUFFER_OVERFLOW;
     1012
     1013    cch = RTStrPrintf(pszBuffer, cchBuffer, "LinkSize=%d\n", pbModePage[5]);
     1014    pszBuffer += cch;
     1015    cchBuffer -= cch;
     1016    if (!cchBuffer)
     1017        return VERR_BUFFER_OVERFLOW;
     1018
     1019    cch = RTStrPrintf(pszBuffer, cchBuffer, "HostApplicationCode=%d\n",
     1020                      pbModePage[7] & 0x3f);
     1021    pszBuffer += cch;
     1022    cchBuffer -= cch;
     1023    if (!cchBuffer)
     1024        return VERR_BUFFER_OVERFLOW;
     1025
     1026    switch (pbModePage[8])
     1027    {
     1028        case 0x00: pcsz = "CD-DA or CD-ROM or other data discs"; break;
     1029        case 0x10: pcsz = "CD-I Disc"; break;
     1030        case 0x20: pcsz = "CD-ROM XA Disc"; break;
     1031        default: pcsz = "Reserved"; break;
     1032    }
     1033
     1034    cch = RTStrPrintf(pszBuffer, cchBuffer, "SessionFormat=%d (%s)\n",
     1035                      pbModePage[8], pcsz);
     1036    pszBuffer += cch;
     1037    cchBuffer -= cch;
     1038    if (!cchBuffer)
     1039        return VERR_BUFFER_OVERFLOW;
     1040
     1041    return VINF_SUCCESS;
     1042}
     1043
     1044/**
     1045 * Log a mode page to a human readable form.
     1046 *
     1047 * @returns VBox status code.
     1048 * @retval VERR_BUFFER_OVERFLOW if the given buffer is not large enough.
     1049 *         The buffer might contain valid data though.
     1050 * @param  pszBuffer     The buffer to log into.
     1051 * @param  cchBuffer     Size of the buffer in characters.
     1052 * @param  pbModePage    The mode page buffer.
     1053 * @param  cbModePage    Size of the mode page buffer in bytes.
     1054 */
     1055int SCSILogModePage(char *pszBuffer, size_t cchBuffer, uint8_t *pbModePage,
     1056                    size_t cbModePage)
     1057{
     1058    int rc = VINF_SUCCESS;
     1059    uint8_t uModePage;
     1060    const char *pcszModePage = NULL;
     1061    size_t cch = 0;
     1062
     1063    uModePage = pbModePage[0] & 0x3f;
     1064    switch (uModePage)
     1065    {
     1066        case 0x05: pcszModePage = "Write Parameters"; break;
     1067        default:
     1068            pcszModePage = "Unknown mode page";
     1069    }
     1070
     1071    cch = RTStrPrintf(pszBuffer, cchBuffer, "Byte 0: PS=%d, Page code=%d (%s)\n",
     1072                      pbModePage[0] & 0x80 ? 1 : 0, uModePage, pcszModePage);
     1073    pszBuffer += cch;
     1074    cchBuffer -= cch;
     1075    if (!cchBuffer)
     1076        return VERR_BUFFER_OVERFLOW;
     1077
     1078    cch = RTStrPrintf(pszBuffer, cchBuffer, "Byte 1: Page length=%u\n", pbModePage[1]);
     1079    pszBuffer += cch;
     1080    cchBuffer -= cch;
     1081    if (!cchBuffer)
     1082        return VERR_BUFFER_OVERFLOW;
     1083
     1084    switch (uModePage)
     1085    {
     1086        case 0x05:
     1087            rc = scsiLogWriteParamsModePage(pszBuffer, cchBuffer, pbModePage, cbModePage);
     1088            break;
     1089        default:
     1090            break;
     1091    }
     1092
     1093    return rc;
     1094}
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