Changeset 35625 in vbox for trunk/src/VBox/Debugger/DBGCCmdHlp.cpp
- Timestamp:
- Jan 19, 2011 11:17:34 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 69526
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Debugger/DBGCCmdHlp.cpp
r35346 r35625 729 729 730 730 /** 731 * Converts a DBGC variable to a number. 732 * 733 * @returns VBox status code. 734 * @param pCmdHlp Pointer to the command callback structure. 735 * @param pVar The variable to convert. 736 * @param pu64Number Where to store the number value. 737 */ 738 static DECLCALLBACK(int) dbgcHlpVarToNumber(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pVar, uint64_t *pu64Number) 739 { 740 PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp); 741 NOREF(pDbgc); 742 743 uint64_t u64Number; 744 switch (pVar->enmType) 745 { 746 case DBGCVAR_TYPE_GC_FLAT: 747 u64Number = pVar->u.GCFlat; 748 break; 749 case DBGCVAR_TYPE_GC_PHYS: 750 u64Number = pVar->u.GCPhys; 751 break; 752 case DBGCVAR_TYPE_HC_FLAT: 753 u64Number = (uintptr_t)pVar->u.pvHCFlat; 754 break; 755 case DBGCVAR_TYPE_HC_PHYS: 756 u64Number = (uintptr_t)pVar->u.HCPhys; 757 break; 758 case DBGCVAR_TYPE_NUMBER: 759 u64Number = (uintptr_t)pVar->u.u64Number; 760 return VINF_SUCCESS; 761 case DBGCVAR_TYPE_HC_FAR: 762 u64Number = (uintptr_t)pVar->u.HCFar.off; 763 break; 764 case DBGCVAR_TYPE_GC_FAR: 765 u64Number = (uintptr_t)pVar->u.GCFar.off; 766 break; 767 case DBGCVAR_TYPE_SYMBOL: 768 case DBGCVAR_TYPE_STRING: 769 return VERR_PARSE_INCORRECT_ARG_TYPE; /** @todo better error code! */ 770 default: 771 return VERR_PARSE_INCORRECT_ARG_TYPE; 772 } 773 *pu64Number = u64Number; 774 return VINF_SUCCESS; 775 } 776 777 778 /** 731 779 * Converts a DBGC variable to a boolean. 732 780 * … … 816 864 817 865 /** 866 * @interface_method_impl{DBGCCMDHLP,pfnVarConvert} 867 */ 868 static DECLCALLBACK(int) dbgcHlpVarConvert(PDBGCCMDHLP pCmdHlp, PCDBGCVAR pInVar, DBGCVARTYPE enmToType, bool fConvSyms, 869 PDBGCVAR pResult) 870 { 871 PDBGC pDbgc = DBGC_CMDHLP2DBGC(pCmdHlp); 872 DBGCVAR const InVar = *pInVar; /* if pInVar == pResult */ 873 PCDBGCVAR pArg = &InVar; /* lazy bird, clean up later */ 874 DBGFADDRESS Address; 875 int rc; 876 877 Assert(pDbgc->pVM); 878 879 *pResult = InVar; 880 switch (InVar.enmType) 881 { 882 case DBGCVAR_TYPE_GC_FLAT: 883 switch (enmToType) 884 { 885 case DBGCVAR_TYPE_GC_FLAT: 886 return VINF_SUCCESS; 887 888 case DBGCVAR_TYPE_GC_FAR: 889 return VERR_PARSE_INCORRECT_ARG_TYPE; 890 891 case DBGCVAR_TYPE_GC_PHYS: 892 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 893 rc = DBGFR3AddrToPhys(pDbgc->pVM, pDbgc->idCpu, 894 DBGFR3AddrFromFlat(pDbgc->pVM, &Address, pArg->u.GCFlat), 895 &pResult->u.GCPhys); 896 if (RT_SUCCESS(rc)) 897 return VINF_SUCCESS; 898 return VERR_PARSE_CONVERSION_FAILED; 899 900 case DBGCVAR_TYPE_HC_FLAT: 901 pResult->enmType = DBGCVAR_TYPE_HC_FLAT; 902 rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pVM, pDbgc->idCpu, 903 DBGFR3AddrFromFlat(pDbgc->pVM, &Address, pArg->u.GCFlat), 904 false /*fReadOnly */, 905 &pResult->u.pvHCFlat); 906 if (RT_SUCCESS(rc)) 907 return VINF_SUCCESS; 908 return VERR_PARSE_CONVERSION_FAILED; 909 910 case DBGCVAR_TYPE_HC_FAR: 911 return VERR_INVALID_PARAMETER; 912 913 case DBGCVAR_TYPE_HC_PHYS: 914 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 915 rc = DBGFR3AddrToHostPhys(pDbgc->pVM, pDbgc->idCpu, 916 DBGFR3AddrFromFlat(pDbgc->pVM, &Address, pArg->u.GCFlat), 917 &pResult->u.GCPhys); 918 if (RT_SUCCESS(rc)) 919 return VINF_SUCCESS; 920 return VERR_PARSE_CONVERSION_FAILED; 921 922 case DBGCVAR_TYPE_NUMBER: 923 pResult->enmType = enmToType; 924 pResult->u.u64Number = InVar.u.GCFlat; 925 return VINF_SUCCESS; 926 927 case DBGCVAR_TYPE_STRING: 928 case DBGCVAR_TYPE_SYMBOL: 929 return VERR_PARSE_INCORRECT_ARG_TYPE; 930 931 case DBGCVAR_TYPE_UNKNOWN: 932 case DBGCVAR_TYPE_ANY: 933 break; 934 } 935 break; 936 937 case DBGCVAR_TYPE_GC_FAR: 938 switch (enmToType) 939 { 940 case DBGCVAR_TYPE_GC_FLAT: 941 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 942 if (RT_SUCCESS(rc)) 943 { 944 pResult->enmType = DBGCVAR_TYPE_GC_FLAT; 945 pResult->u.GCFlat = Address.FlatPtr; 946 return VINF_SUCCESS; 947 } 948 return VERR_PARSE_CONVERSION_FAILED; 949 950 case DBGCVAR_TYPE_GC_FAR: 951 return VINF_SUCCESS; 952 953 case DBGCVAR_TYPE_GC_PHYS: 954 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 955 if (RT_SUCCESS(rc)) 956 { 957 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 958 rc = DBGFR3AddrToPhys(pDbgc->pVM, pDbgc->idCpu, &Address, &pResult->u.GCPhys); 959 if (RT_SUCCESS(rc)) 960 return VINF_SUCCESS; 961 } 962 return VERR_PARSE_CONVERSION_FAILED; 963 964 case DBGCVAR_TYPE_HC_FLAT: 965 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 966 if (RT_SUCCESS(rc)) 967 { 968 pResult->enmType = DBGCVAR_TYPE_HC_FLAT; 969 rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pVM, pDbgc->idCpu, &Address, 970 false /*fReadOnly*/, &pResult->u.pvHCFlat); 971 if (RT_SUCCESS(rc)) 972 return VINF_SUCCESS; 973 } 974 return VERR_PARSE_CONVERSION_FAILED; 975 976 case DBGCVAR_TYPE_HC_FAR: 977 return VERR_PARSE_INCORRECT_ARG_TYPE; 978 979 case DBGCVAR_TYPE_HC_PHYS: 980 rc = DBGFR3AddrFromSelOff(pDbgc->pVM, pDbgc->idCpu, &Address, pArg->u.GCFar.sel, pArg->u.GCFar.off); 981 if (RT_SUCCESS(rc)) 982 { 983 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 984 rc = DBGFR3AddrToHostPhys(pDbgc->pVM, pDbgc->idCpu, &Address, &pResult->u.GCPhys); 985 if (RT_SUCCESS(rc)) 986 return VINF_SUCCESS; 987 } 988 return VERR_PARSE_CONVERSION_FAILED; 989 990 case DBGCVAR_TYPE_NUMBER: 991 pResult->enmType = enmToType; 992 pResult->u.u64Number = InVar.u.GCFar.off; 993 return VINF_SUCCESS; 994 995 case DBGCVAR_TYPE_STRING: 996 case DBGCVAR_TYPE_SYMBOL: 997 return VERR_PARSE_INCORRECT_ARG_TYPE; 998 999 case DBGCVAR_TYPE_UNKNOWN: 1000 case DBGCVAR_TYPE_ANY: 1001 break; 1002 } 1003 break; 1004 1005 case DBGCVAR_TYPE_GC_PHYS: 1006 switch (enmToType) 1007 { 1008 case DBGCVAR_TYPE_GC_FLAT: 1009 //rc = MMR3PhysGCPhys2GCVirtEx(pDbgc->pVM, pResult->u.GCPhys, ..., &pResult->u.GCFlat); - yea, sure. 1010 return VERR_PARSE_INCORRECT_ARG_TYPE; 1011 1012 case DBGCVAR_TYPE_GC_FAR: 1013 return VERR_PARSE_INCORRECT_ARG_TYPE; 1014 1015 case DBGCVAR_TYPE_GC_PHYS: 1016 return VINF_SUCCESS; 1017 1018 case DBGCVAR_TYPE_HC_FLAT: 1019 pResult->enmType = DBGCVAR_TYPE_HC_FLAT; 1020 rc = DBGFR3AddrToVolatileR3Ptr(pDbgc->pVM, pDbgc->idCpu, 1021 DBGFR3AddrFromPhys(pDbgc->pVM, &Address, pArg->u.GCPhys), 1022 false /*fReadOnly */, 1023 &pResult->u.pvHCFlat); 1024 if (RT_SUCCESS(rc)) 1025 return VINF_SUCCESS; 1026 return VERR_PARSE_CONVERSION_FAILED; 1027 1028 case DBGCVAR_TYPE_HC_FAR: 1029 return VERR_PARSE_INCORRECT_ARG_TYPE; 1030 1031 case DBGCVAR_TYPE_HC_PHYS: 1032 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 1033 rc = DBGFR3AddrToHostPhys(pDbgc->pVM, pDbgc->idCpu, 1034 DBGFR3AddrFromPhys(pDbgc->pVM, &Address, pArg->u.GCPhys), 1035 &pResult->u.HCPhys); 1036 if (RT_SUCCESS(rc)) 1037 return VINF_SUCCESS; 1038 return VERR_PARSE_CONVERSION_FAILED; 1039 1040 case DBGCVAR_TYPE_NUMBER: 1041 pResult->enmType = enmToType; 1042 pResult->u.u64Number = InVar.u.GCPhys; 1043 return VINF_SUCCESS; 1044 1045 case DBGCVAR_TYPE_STRING: 1046 case DBGCVAR_TYPE_SYMBOL: 1047 return VERR_PARSE_INCORRECT_ARG_TYPE; 1048 1049 case DBGCVAR_TYPE_UNKNOWN: 1050 case DBGCVAR_TYPE_ANY: 1051 break; 1052 } 1053 break; 1054 1055 case DBGCVAR_TYPE_HC_FLAT: 1056 switch (enmToType) 1057 { 1058 case DBGCVAR_TYPE_GC_FLAT: 1059 return VERR_PARSE_INCORRECT_ARG_TYPE; 1060 1061 case DBGCVAR_TYPE_GC_FAR: 1062 return VERR_PARSE_INCORRECT_ARG_TYPE; 1063 1064 case DBGCVAR_TYPE_GC_PHYS: 1065 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 1066 rc = PGMR3DbgR3Ptr2GCPhys(pDbgc->pVM, pArg->u.pvHCFlat, &pResult->u.GCPhys); 1067 if (RT_SUCCESS(rc)) 1068 return VINF_SUCCESS; 1069 /** @todo more memory types! */ 1070 return VERR_PARSE_CONVERSION_FAILED; 1071 1072 case DBGCVAR_TYPE_HC_FLAT: 1073 return VINF_SUCCESS; 1074 1075 case DBGCVAR_TYPE_HC_FAR: 1076 return VERR_PARSE_INCORRECT_ARG_TYPE; 1077 1078 case DBGCVAR_TYPE_HC_PHYS: 1079 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 1080 rc = PGMR3DbgR3Ptr2HCPhys(pDbgc->pVM, pArg->u.pvHCFlat, &pResult->u.HCPhys); 1081 if (RT_SUCCESS(rc)) 1082 return VINF_SUCCESS; 1083 /** @todo more memory types! */ 1084 return VERR_PARSE_CONVERSION_FAILED; 1085 1086 case DBGCVAR_TYPE_NUMBER: 1087 pResult->enmType = enmToType; 1088 pResult->u.u64Number = (uintptr_t)InVar.u.pvHCFlat; 1089 return VINF_SUCCESS; 1090 1091 case DBGCVAR_TYPE_STRING: 1092 case DBGCVAR_TYPE_SYMBOL: 1093 return VERR_PARSE_INCORRECT_ARG_TYPE; 1094 1095 case DBGCVAR_TYPE_UNKNOWN: 1096 case DBGCVAR_TYPE_ANY: 1097 break; 1098 } 1099 break; 1100 1101 case DBGCVAR_TYPE_HC_FAR: 1102 switch (enmToType) 1103 { 1104 case DBGCVAR_TYPE_GC_FLAT: 1105 return VERR_PARSE_INCORRECT_ARG_TYPE; 1106 1107 case DBGCVAR_TYPE_GC_FAR: 1108 return VERR_PARSE_INCORRECT_ARG_TYPE; 1109 1110 case DBGCVAR_TYPE_GC_PHYS: 1111 return VERR_PARSE_INCORRECT_ARG_TYPE; 1112 1113 case DBGCVAR_TYPE_HC_FLAT: 1114 return VERR_PARSE_INCORRECT_ARG_TYPE; 1115 1116 case DBGCVAR_TYPE_HC_FAR: 1117 return VINF_SUCCESS; 1118 1119 case DBGCVAR_TYPE_HC_PHYS: 1120 return VERR_PARSE_INCORRECT_ARG_TYPE; 1121 1122 case DBGCVAR_TYPE_NUMBER: 1123 pResult->enmType = enmToType; 1124 pResult->u.u64Number = (uintptr_t)InVar.u.HCFar.off; 1125 return VINF_SUCCESS; 1126 1127 case DBGCVAR_TYPE_STRING: 1128 case DBGCVAR_TYPE_SYMBOL: 1129 return VERR_PARSE_INCORRECT_ARG_TYPE; 1130 1131 case DBGCVAR_TYPE_UNKNOWN: 1132 case DBGCVAR_TYPE_ANY: 1133 break; 1134 } 1135 break; 1136 1137 case DBGCVAR_TYPE_HC_PHYS: 1138 switch (enmToType) 1139 { 1140 case DBGCVAR_TYPE_GC_FLAT: 1141 return VERR_PARSE_INCORRECT_ARG_TYPE; 1142 1143 case DBGCVAR_TYPE_GC_FAR: 1144 return VERR_PARSE_INCORRECT_ARG_TYPE; 1145 1146 case DBGCVAR_TYPE_GC_PHYS: 1147 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 1148 rc = PGMR3DbgHCPhys2GCPhys(pDbgc->pVM, pArg->u.HCPhys, &pResult->u.GCPhys); 1149 if (RT_SUCCESS(rc)) 1150 return VINF_SUCCESS; 1151 return VERR_PARSE_CONVERSION_FAILED; 1152 1153 case DBGCVAR_TYPE_HC_FLAT: 1154 return VERR_PARSE_INCORRECT_ARG_TYPE; 1155 1156 case DBGCVAR_TYPE_HC_FAR: 1157 return VERR_PARSE_INCORRECT_ARG_TYPE; 1158 1159 case DBGCVAR_TYPE_HC_PHYS: 1160 return VINF_SUCCESS; 1161 1162 case DBGCVAR_TYPE_NUMBER: 1163 pResult->enmType = enmToType; 1164 pResult->u.u64Number = InVar.u.HCPhys; 1165 return VINF_SUCCESS; 1166 1167 case DBGCVAR_TYPE_STRING: 1168 case DBGCVAR_TYPE_SYMBOL: 1169 return VERR_PARSE_INCORRECT_ARG_TYPE; 1170 1171 case DBGCVAR_TYPE_UNKNOWN: 1172 case DBGCVAR_TYPE_ANY: 1173 break; 1174 } 1175 break; 1176 1177 case DBGCVAR_TYPE_NUMBER: 1178 switch (enmToType) 1179 { 1180 case DBGCVAR_TYPE_GC_FLAT: 1181 pResult->enmType = DBGCVAR_TYPE_GC_FLAT; 1182 pResult->u.GCFlat = (RTGCPTR)InVar.u.u64Number; 1183 return VERR_PARSE_INCORRECT_ARG_TYPE; 1184 1185 case DBGCVAR_TYPE_GC_FAR: 1186 return VERR_PARSE_INCORRECT_ARG_TYPE; 1187 1188 case DBGCVAR_TYPE_GC_PHYS: 1189 pResult->enmType = DBGCVAR_TYPE_GC_PHYS; 1190 pResult->u.GCPhys = (RTGCPHYS)InVar.u.u64Number; 1191 return VERR_PARSE_INCORRECT_ARG_TYPE; 1192 1193 case DBGCVAR_TYPE_HC_FLAT: 1194 pResult->enmType = DBGCVAR_TYPE_HC_FLAT; 1195 pResult->u.pvHCFlat = (void *)(uintptr_t)InVar.u.u64Number; 1196 return VERR_PARSE_INCORRECT_ARG_TYPE; 1197 1198 case DBGCVAR_TYPE_HC_FAR: 1199 return VERR_PARSE_INCORRECT_ARG_TYPE; 1200 1201 case DBGCVAR_TYPE_HC_PHYS: 1202 pResult->enmType = DBGCVAR_TYPE_HC_PHYS; 1203 pResult->u.HCPhys = (RTHCPHYS)InVar.u.u64Number; 1204 return VINF_SUCCESS; 1205 1206 case DBGCVAR_TYPE_NUMBER: 1207 return VINF_SUCCESS; 1208 1209 case DBGCVAR_TYPE_STRING: 1210 case DBGCVAR_TYPE_SYMBOL: 1211 return VERR_PARSE_INCORRECT_ARG_TYPE; 1212 1213 case DBGCVAR_TYPE_UNKNOWN: 1214 case DBGCVAR_TYPE_ANY: 1215 break; 1216 } 1217 break; 1218 1219 case DBGCVAR_TYPE_SYMBOL: 1220 case DBGCVAR_TYPE_STRING: 1221 switch (enmToType) 1222 { 1223 case DBGCVAR_TYPE_GC_FLAT: 1224 case DBGCVAR_TYPE_GC_FAR: 1225 case DBGCVAR_TYPE_GC_PHYS: 1226 case DBGCVAR_TYPE_HC_FLAT: 1227 case DBGCVAR_TYPE_HC_FAR: 1228 case DBGCVAR_TYPE_HC_PHYS: 1229 case DBGCVAR_TYPE_NUMBER: 1230 if (fConvSyms) 1231 return dbgcSymbolGet(pDbgc, InVar.u.pszString, enmToType, pResult); 1232 return VERR_PARSE_INCORRECT_ARG_TYPE; 1233 1234 case DBGCVAR_TYPE_STRING: 1235 case DBGCVAR_TYPE_SYMBOL: 1236 pResult->enmType = enmToType; 1237 return VINF_SUCCESS; 1238 1239 case DBGCVAR_TYPE_UNKNOWN: 1240 case DBGCVAR_TYPE_ANY: 1241 break; 1242 } 1243 break; 1244 1245 case DBGCVAR_TYPE_UNKNOWN: 1246 case DBGCVAR_TYPE_ANY: 1247 break; 1248 } 1249 1250 AssertMsgFailed(("f=%d t=%d\n", InVar.enmType, enmToType)); 1251 return VERR_INVALID_PARAMETER; 1252 } 1253 1254 1255 /** 818 1256 * Info helper callback wrapper - print formatted string. 819 1257 * … … 882 1320 pDbgc->CmdHlp.pfnFailV = dbgcHlpFailV; 883 1321 pDbgc->CmdHlp.pfnVarToDbgfAddr = dbgcHlpVarToDbgfAddr; 1322 pDbgc->CmdHlp.pfnVarToNumber = dbgcHlpVarToNumber; 884 1323 pDbgc->CmdHlp.pfnVarToBool = dbgcHlpVarToBool; 885 1324 pDbgc->CmdHlp.pfnVarGetRange = dbgcHlpVarGetRange; 1325 pDbgc->CmdHlp.pfnVarConvert = dbgcHlpVarConvert; 886 1326 pDbgc->CmdHlp.pfnGetDbgfOutputHlp = dbgcHlpGetDbgfOutputHlp; 887 1327 }
Note:
See TracChangeset
for help on using the changeset viewer.