Changeset 40543 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Mar 19, 2012 5:05:56 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76935
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/Debug.cpp
r38622 r40543 19 19 #include <iprt/assert.h> 20 20 #include <iprt/types.h> 21 #include <iprt/string.h> 21 22 #include <VBox/scsi.h> 22 23 #include "ide.h" … … 938 939 return "(Unknown extended sense code)"; 939 940 } 941 942 /** 943 * Log the write parameters mode page into a given buffer. 944 */ 945 static 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 */ 1055 int 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.