- Timestamp:
- Dec 27, 2012 2:52:09 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 82974
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r44206 r44207 62 62 63 63 /** State saved version. */ 64 #define BUSLOGIC_SAVED_STATE_MINOR_VERSION 264 #define BUSLOGIC_SAVED_STATE_MINOR_VERSION 3 65 65 66 66 /** Saved state version before the suspend on error feature was implemented. */ 67 67 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_ERROR_HANDLING 1 68 69 /** The duration of software-initiated reset. Not documented, set to 500 ms. */ 70 #define BUSLOGIC_RESET_DURATION_NS (500*1000*1000UL) 68 /** Saved state version before 24-bit mailbox support was implemented. */ 69 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_24BIT_MBOX 2 70 71 /** The duration of software-initiated reset. Not documented, set to 50 ms. */ 72 #define BUSLOGIC_RESET_DURATION_NS (50*1000*1000UL) 71 73 72 74 /** … … 268 270 AssertCompileSize(HostAdapterLocalRam, 256); 269 271 272 273 /* Ugly 24-bit big-endian addressing. */ 274 typedef struct { 275 uint8_t hi; 276 uint8_t mid; 277 uint8_t lo; 278 } Addr24, Len24; 279 AssertCompileSize(Addr24, 3); 280 281 #define ADDR_TO_U32(x) (((x).hi << 16) | ((x).mid << 8) | (x).lo) 282 #define LEN_TO_U32 ADDR_TO_U32 283 #define U32_TO_ADDR(a, x) do {(a).hi = (x) >> 16; (a).mid = (x) >> 8; (a).lo = (x);} while(0) 284 #define U32_TO_LEN U32_TO_ADDR 285 270 286 /* Compatible ISA base I/O port addresses. Disabled if zero. */ 271 287 #define NUM_ISA_BASES 8 … … 526 542 uint8_t uTimeOffBus; 527 543 uint8_t cMailbox; 528 uint8_t MailboxAddress[3];544 Addr24 MailboxAddress; 529 545 ReplyInquireSetupInformationSynchronousValue SynchronousValuesId0To7[8]; 530 546 uint8_t uDisconnectPermittedId0To7; … … 579 595 #pragma pack() 580 596 597 /* Structure for the INITIALIZE MAILBOX request. */ 598 typedef struct 599 { 600 /** Number of mailboxes to set up. */ 601 uint8_t cMailbox; 602 /** Physical address of the first mailbox. */ 603 Addr24 aMailboxBaseAddr; 604 } RequestInitMbx, *PRequestInitMbx; 605 AssertCompileSize(RequestInitMbx, 4); 606 581 607 /* 582 608 * Structure of a mailbox in guest memory. … … 589 615 * We use one structure for both types. 590 616 */ 591 #pragma pack(1) 592 typedef struct Mailbox 617 typedef struct Mailbox32 593 618 { 594 619 /** Physical address of the CCB structure in the guest memory. */ … … 618 643 } in; 619 644 } u; 620 } Mailbox, *PMailbox; 621 AssertCompileSize(Mailbox, 8); 622 #pragma pack() 645 } Mailbox32, *PMailbox32; 646 AssertCompileSize(Mailbox32, 8); 647 648 /* Old style 24-bit mailbox entry. */ 649 typedef struct Mailbox24 650 { 651 /** Mailbox command (incoming) or state (outgoing). */ 652 uint8_t uCmdState; 653 /** Physical address of the CCB structure in the guest memory. */ 654 Addr24 aPhysAddrCCB; 655 } Mailbox24, *PMailbox24; 656 AssertCompileSize(Mailbox24, 4); 623 657 624 658 /* … … 714 748 * The command control block for a SCSI request. 715 749 */ 716 #pragma pack(1) 717 typedef struct CommandControlBlock 750 typedef struct CCB32 718 751 { 719 752 /** Opcode. */ … … 757 790 /** Sense data pointer. */ 758 791 uint32_t u32PhysAddrSenseData; 759 } CommandControlBlock, *PCommandControlBlock; 760 AssertCompileSize(CommandControlBlock, 40); 761 #pragma pack() 762 763 #pragma pack(1) 764 typedef struct ScatterGatherEntry 792 } CCB32, *PCCB32; 793 AssertCompileSize(CCB32, 40); 794 795 796 /* 797 * The 24-bit command control block. 798 */ 799 typedef struct CCB24 800 { 801 /** Opcode. */ 802 uint8_t uOpcode; 803 /** The LUN in the device. */ 804 unsigned char uLogicalUnit: 3; 805 /** Data direction for the request. */ 806 unsigned char uDataDirection: 2; 807 /** The target device ID. */ 808 unsigned char uTargetId: 3; 809 /** Length of the SCSI CDB. */ 810 uint8_t cbCDB; 811 /** Sense data length. */ 812 uint8_t cbSenseData; 813 /** Data length. */ 814 Len24 acbData; 815 /** Data pointer. 816 * This points to the data region or a scatter gather list based on the opc 817 */ 818 Addr24 aPhysAddrData; 819 /** Pointer to next CCB for linked commands. */ 820 Addr24 aPhysAddrLink; 821 /** Command linking identifier. */ 822 uint8_t uLinkId; 823 /** Host adapter status. */ 824 uint8_t uHostAdapterStatus; 825 /** Device adapter status. */ 826 uint8_t uDeviceStatus; 827 /** Two unused bytes. */ 828 uint8_t aReserved[2]; 829 /** The SCSI CDB. */ 830 uint8_t aCDB[12]; /* A CDB can be 12 bytes long. */ 831 } CCB24, *PCCB24; 832 AssertCompileSize(CCB24, 30); 833 834 /* 835 * The common 24-bit/32-bit command control block. The 32-bit CCB is laid out 836 * such that many fields are in the same location as in the older 24-bit CCB. 837 */ 838 typedef struct CCBC 839 { 840 /** Opcode. */ 841 uint8_t uOpcode; 842 /** The LUN in the device. */ 843 unsigned char uPad1: 3; 844 /** Data direction for the request. */ 845 unsigned char uDataDirection: 2; 846 /** The target device ID. */ 847 unsigned char uPad2: 3; 848 /** Length of the SCSI CDB. */ 849 uint8_t cbCDB; 850 /** Sense data length. */ 851 uint8_t cbSenseData; 852 uint8_t aPad1[10]; 853 /** Host adapter status. */ 854 uint8_t uHostAdapterStatus; 855 /** Device adapter status. */ 856 uint8_t uDeviceStatus; 857 uint8_t aPad2[2]; 858 /** The SCSI CDB (up to 12 bytes). */ 859 uint8_t aCDB[12]; 860 } CCBC, *PCCBC; 861 AssertCompileSize(CCB24, 30); 862 863 /* Make sure that the 24-bit/32-bit/common CCB offsets match. */ 864 AssertCompileMemberOffset(CCBC, cbCDB, 2); 865 AssertCompileMemberOffset(CCB24, cbCDB, 2); 866 AssertCompileMemberOffset(CCB32, cbCDB, 2); 867 AssertCompileMemberOffset(CCBC, uHostAdapterStatus, 14); 868 AssertCompileMemberOffset(CCB24, uHostAdapterStatus, 14); 869 AssertCompileMemberOffset(CCB32, uHostAdapterStatus, 14); 870 AssertCompileMemberOffset(CCBC, aCDB, 18); 871 AssertCompileMemberOffset(CCB24, aCDB, 18); 872 AssertCompileMemberOffset(CCB32, aCDB, 18); 873 874 /* A union of all CCB types (24-bit/32-bit/common). */ 875 typedef union CCBU { 876 CCB32 n; /* New 32-bit CCB. */ 877 CCB24 o; /* Old 24-bit CCB. */ 878 CCBC c; /* Common CCB subset. */ 879 } CCBU, *PCCBU; 880 881 /* 32-bit scatter-gather list entry. */ 882 typedef struct SGE32 765 883 { 766 884 uint32_t cbSegment; 767 885 uint32_t u32PhysAddrSegmentBase; 768 } ScatterGatherEntry, *PScatterGatherEntry; 769 AssertCompileSize(ScatterGatherEntry, 8); 770 #pragma pack() 886 } SGE32, *PSGE32; 887 AssertCompileSize(SGE32, 8); 888 889 /* 24-bit scatter-gather list entry. */ 890 typedef struct SGE24 891 { 892 Len24 acbSegment; 893 Addr24 aPhysAddrSegmentBase; 894 } SGE24, *PSGE24; 895 AssertCompileSize(SGE24, 6); 896 897 /* 898 * The structure for the "Execute SCSI Command" command. 899 */ 900 typedef struct ESCMD 901 { 902 /** Data length. */ 903 uint32_t cbData; 904 /** Data pointer. */ 905 uint32_t u32PhysAddrData; 906 /** The device the request is sent to. */ 907 uint8_t uTargetId; 908 /** The LUN in the device. */ 909 uint8_t uLogicalUnit; 910 /** Reserved */ 911 unsigned char uReserved1: 3; 912 /** Data direction for the request. */ 913 unsigned char uDataDirection: 2; 914 /** Reserved */ 915 unsigned char uReserved2: 3; 916 /** Length of the SCSI CDB. */ 917 uint8_t cbCDB; 918 /** The SCSI CDB. */ 919 uint8_t aCDB[12]; /* A CDB can be 12 bytes long. */ 920 } ESCMD, *PESCMD; 921 AssertCompileSize(ESCMD, 24); 771 922 772 923 /* … … 780 931 R3PTRTYPE(PBUSLOGICDEVICE) pTargetDeviceR3; 781 932 /** The command control block from the guest. */ 782 C ommandControlBlockCommandControlBlockGuest;933 CCBU CommandControlBlockGuest; 783 934 /** Mailbox read from guest memory. */ 784 Mailbox 935 Mailbox32 MailboxGuest; 785 936 /** The SCSI request we pass to the underlying SCSI engine. */ 786 937 PDMSCSIREQUEST PDMScsiRequest; … … 791 942 /** Flag whether this is a request from the BIOS. */ 792 943 bool fBIOS; 944 /** 24-bit request flag (default is 32-bit). */ 945 bool fIs24Bit; 946 /** S/G entry size (depends on the above flag). */ 947 uint8_t cbSGEntry; 793 948 } BUSLOGICTASKSTATE; 794 949 … … 863 1018 { 864 1019 pBusLogic->uMailboxOutgoingPositionCurrent = (pBusLogic->uMailboxOutgoingPositionCurrent + 1) % pBusLogic->cMailbox; 865 }866 867 /**868 * Returns the physical address of the next outgoing mailbox to process.869 */870 DECLINLINE(RTGCPHYS) buslogicOutgoingMailboxGetGCPhys(PBUSLOGIC pBusLogic)871 {872 return pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox));873 1020 } 874 1021 … … 976 1123 LogFlowFunc(("pBusLogic=%#p fHardReset=%d\n", pBusLogic, fHardReset)); 977 1124 978 buslogicHwReset(pBusLogic, f HardReset);1125 buslogicHwReset(pBusLogic, false); 979 1126 980 1127 if (fHardReset) … … 1009 1156 int rc = PDMCritSectEnter(&pBusLogic->CritSectIntr, VINF_SUCCESS); 1010 1157 AssertRC(rc); 1011 RTGCPHYS GCPhysAddrMailboxIncoming = pBusLogic->GCPhysAddrMailboxIncomingBase + (pBusLogic->uMailboxIncomingPositionCurrent * sizeof(Mailbox)); 1012 RTGCPHYS GCPhysAddrCCB = (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB; 1013 1014 LogFlowFunc(("Completing CCB %RGp\n", GCPhysAddrCCB)); 1158 RTGCPHYS GCPhysAddrMailboxIncoming; 1159 RTGCPHYS GCPhysAddrCCB = pTaskState->MailboxGuest.u32PhysAddrCCB; 1160 1161 GCPhysAddrMailboxIncoming = pBusLogic->GCPhysAddrMailboxIncomingBase + (pBusLogic->uMailboxIncomingPositionCurrent * (pTaskState->fIs24Bit ? sizeof(Mailbox24) : sizeof(Mailbox32))); 1162 LogFlowFunc(("Completing CCB %RGp hstat=%u, dstat=%u, outgoing mailbox at %RGp\n", GCPhysAddrCCB, 1163 uHostAdapterStatus, uDeviceStatus, GCPhysAddrMailboxIncoming)); 1015 1164 1016 1165 /* Update CCB. */ 1017 pTaskState->CommandControlBlockGuest. uHostAdapterStatus = uHostAdapterStatus;1018 pTaskState->CommandControlBlockGuest. uDeviceStatus= uDeviceStatus;1166 pTaskState->CommandControlBlockGuest.c.uHostAdapterStatus = uHostAdapterStatus; 1167 pTaskState->CommandControlBlockGuest.c.uDeviceStatus = uDeviceStatus; 1019 1168 /* @todo: this is wrong - writing too much! */ 1020 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB, &pTaskState->CommandControlBlockGuest, sizeof(C ommandControlBlock));1169 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB, &pTaskState->CommandControlBlockGuest, sizeof(CCBC)); 1021 1170 1022 1171 #ifdef RT_STRICT 1023 Mailbox Tmp; 1024 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &Tmp, sizeof(Mailbox)); 1025 Assert(Tmp.u.in.uCompletionCode == BUSLOGIC_MAILBOX_INCOMING_COMPLETION_FREE); 1172 uint8_t uCode; 1173 unsigned uCodeOffs = pTaskState->fIs24Bit ? RT_OFFSETOF(Mailbox24, uCmdState) : RT_OFFSETOF(Mailbox32, u.out.uActionCode); 1174 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming + uCodeOffs, &uCode, sizeof(uCode)); 1175 Assert(uCode == BUSLOGIC_MAILBOX_INCOMING_COMPLETION_FREE); 1026 1176 #endif 1027 1177 1028 1178 /* Update mailbox. */ 1029 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &pTaskState->MailboxGuest, sizeof(Mailbox)); 1179 if (pTaskState->fIs24Bit) 1180 { 1181 Mailbox24 Mbx24; 1182 1183 Mbx24.uCmdState = pTaskState->MailboxGuest.u.in.uCompletionCode; 1184 U32_TO_ADDR(Mbx24.aPhysAddrCCB, pTaskState->MailboxGuest.u32PhysAddrCCB); 1185 Log(("24-bit mailbox: completion code=%u, CCB at %RGp\n", Mbx24.uCmdState, (RTGCPHYS)ADDR_TO_U32(Mbx24.aPhysAddrCCB))); 1186 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &Mbx24, sizeof(Mailbox24)); 1187 } 1188 else 1189 { 1190 Log(("32-bit mailbox: completion code=%u, CCB at %RGp\n", pTaskState->MailboxGuest.u.in.uCompletionCode, (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB)); 1191 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &pTaskState->MailboxGuest, sizeof(Mailbox32)); 1192 } 1030 1193 1031 1194 /* Advance to next mailbox position. */ … … 1052 1215 * false if dumping the incoming state. 1053 1216 */ 1054 static void buslogicDumpMailboxInfo(PMailbox pMailbox, bool fOutgoing)1217 static void buslogicDumpMailboxInfo(PMailbox32 pMailbox, bool fOutgoing) 1055 1218 { 1056 1219 Log(("%s: Dump for %s mailbox:\n", __FUNCTION__, fOutgoing ? "outgoing" : "incoming")); … … 1072 1235 * 1073 1236 * @returns nothing. 1074 * @param pCCB Pointer to the command control block to dump. 1075 */ 1076 static void buslogicDumpCCBInfo(PCommandControlBlock pCCB) 1077 { 1078 Log(("%s: Dump for Command Control Block:\n", __FUNCTION__)); 1079 Log(("%s: uOpCode=%#x\n", __FUNCTION__, pCCB->uOpcode)); 1080 Log(("%s: uDataDirection=%u\n", __FUNCTION__, pCCB->uDataDirection)); 1081 Log(("%s: fTagQueued=%d\n", __FUNCTION__, pCCB->fTagQueued)); 1082 Log(("%s: uQueueTag=%u\n", __FUNCTION__, pCCB->uQueueTag)); 1083 Log(("%s: cbCDB=%u\n", __FUNCTION__, pCCB->cbCDB)); 1084 Log(("%s: cbSenseData=%u\n", __FUNCTION__, pCCB->cbSenseData)); 1085 Log(("%s: cbData=%u\n", __FUNCTION__, pCCB->cbData)); 1086 Log(("%s: u32PhysAddrData=%#x\n", __FUNCTION__, pCCB->u32PhysAddrData)); 1087 Log(("%s: uHostAdapterStatus=%u\n", __FUNCTION__, pCCB->uHostAdapterStatus)); 1088 Log(("%s: uDeviceStatus=%u\n", __FUNCTION__, pCCB->uDeviceStatus)); 1089 Log(("%s: uTargetId=%u\n", __FUNCTION__, pCCB->uTargetId)); 1090 Log(("%s: uLogicalUnit=%u\n", __FUNCTION__, pCCB->uLogicalUnit)); 1091 Log(("%s: fLegacyTagEnable=%u\n", __FUNCTION__, pCCB->fLegacyTagEnable)); 1092 Log(("%s: uLegacyQueueTag=%u\n", __FUNCTION__, pCCB->uLegacyQueueTag)); 1093 Log(("%s: uCDB[0]=%#x\n", __FUNCTION__, pCCB->aCDB[0])); 1094 for (int i = 1; i < pCCB->cbCDB; i++) 1095 Log(("%s: uCDB[%d]=%u\n", __FUNCTION__, i, pCCB->aCDB[i])); 1096 Log(("%s: u32PhysAddrSenseData=%#x\n", __FUNCTION__, pCCB->u32PhysAddrSenseData)); 1237 * @param pCCB Pointer to the command control block to dump. 1238 * @param fIs24BitCCB Flag to determine CCB format. 1239 */ 1240 static void buslogicDumpCCBInfo(PCCBU pCCB, bool fIs24BitCCB) 1241 { 1242 Log(("%s: Dump for %s Command Control Block:\n", __FUNCTION__, fIs24BitCCB ? "24-bit" : "32-bit")); 1243 Log(("%s: uOpCode=%#x\n", __FUNCTION__, pCCB->c.uOpcode)); 1244 Log(("%s: uDataDirection=%u\n", __FUNCTION__, pCCB->c.uDataDirection)); 1245 Log(("%s: cbCDB=%u\n", __FUNCTION__, pCCB->c.cbCDB)); 1246 Log(("%s: cbSenseData=%u\n", __FUNCTION__, pCCB->c.cbSenseData)); 1247 Log(("%s: uHostAdapterStatus=%u\n", __FUNCTION__, pCCB->c.uHostAdapterStatus)); 1248 Log(("%s: uDeviceStatus=%u\n", __FUNCTION__, pCCB->c.uDeviceStatus)); 1249 if (fIs24BitCCB) 1250 { 1251 Log(("%s: cbData=%u\n", __FUNCTION__, LEN_TO_U32(pCCB->o.acbData))); 1252 Log(("%s: PhysAddrData=%#x\n", __FUNCTION__, ADDR_TO_U32(pCCB->o.aPhysAddrData))); 1253 Log(("%s: uTargetId=%u\n", __FUNCTION__, pCCB->o.uTargetId)); 1254 Log(("%s: uLogicalUnit=%u\n", __FUNCTION__, pCCB->o.uLogicalUnit)); 1255 } 1256 else 1257 { 1258 Log(("%s: cbData=%u\n", __FUNCTION__, pCCB->n.cbData)); 1259 Log(("%s: PhysAddrData=%#x\n", __FUNCTION__, pCCB->n.u32PhysAddrData)); 1260 Log(("%s: uTargetId=%u\n", __FUNCTION__, pCCB->n.uTargetId)); 1261 Log(("%s: uLogicalUnit=%u\n", __FUNCTION__, pCCB->n.uLogicalUnit)); 1262 Log(("%s: fTagQueued=%d\n", __FUNCTION__, pCCB->n.fTagQueued)); 1263 Log(("%s: uQueueTag=%u\n", __FUNCTION__, pCCB->n.uQueueTag)); 1264 Log(("%s: fLegacyTagEnable=%u\n", __FUNCTION__, pCCB->n.fLegacyTagEnable)); 1265 Log(("%s: uLegacyQueueTag=%u\n", __FUNCTION__, pCCB->n.uLegacyQueueTag)); 1266 Log(("%s: PhysAddrSenseData=%#x\n", __FUNCTION__, pCCB->n.u32PhysAddrSenseData)); 1267 } 1268 Log(("%s: uCDB[0]=%#x\n", __FUNCTION__, pCCB->c.aCDB[0])); 1269 for (int i = 1; i < pCCB->c.cbCDB; i++) 1270 Log(("%s: uCDB[%d]=%u\n", __FUNCTION__, i, pCCB->c.aCDB[i])); 1097 1271 } 1098 1272 #endif 1273 1274 /** 1275 * Allocate data buffer. 1276 * 1277 * @param pTaskState Pointer to the task state. 1278 * @param GCSGList Guest physical address of S/G list. 1279 * @param cEntries Number of list entries to read. 1280 * @param pSGEList Pointer to 32-bit S/G list storage. 1281 */ 1282 1283 static void buslogicReadSGEntries(PBUSLOGICTASKSTATE pTaskState, RTGCPHYS GCSGList, uint32_t cEntries, SGE32 *pSGEList) 1284 { 1285 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1286 SGE24 aSGE24[32]; 1287 Assert(cEntries <= RT_ELEMENTS(aSGE24)); 1288 1289 /* Read the S/G entries. Convert 24-bit entries to 32-bit format. */ 1290 if (pTaskState->fIs24Bit) 1291 { 1292 Log2(("Converting %u 24-bit S/G entries to 32-bit\n", cEntries)); 1293 PDMDevHlpPhysRead(pDevIns, GCSGList, &aSGE24, cEntries * sizeof(SGE24)); 1294 for (unsigned i = 0; i < cEntries; ++i) 1295 { 1296 pSGEList[i].cbSegment = LEN_TO_U32(aSGE24[i].acbSegment); 1297 pSGEList[i].u32PhysAddrSegmentBase = ADDR_TO_U32(aSGE24[i].aPhysAddrSegmentBase); 1298 } 1299 } 1300 else 1301 PDMDevHlpPhysRead(pDevIns, GCSGList, pSGEList, cEntries * sizeof(SGE32)); 1302 } 1099 1303 1100 1304 /** … … 1107 1311 { 1108 1312 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1109 1110 if ( (pTaskState->CommandControlBlockGuest.uDataDirection != BUSLOGIC_CCB_DIRECTION_NO_DATA) 1111 && (pTaskState->CommandControlBlockGuest.cbData > 0)) 1313 uint32_t cbDataCCB; 1314 uint32_t u32PhysAddrCCB; 1315 1316 /* Extract the data length and physical address from the CCB. */ 1317 if (pTaskState->fIs24Bit) 1318 { 1319 u32PhysAddrCCB = ADDR_TO_U32(pTaskState->CommandControlBlockGuest.o.aPhysAddrData); 1320 cbDataCCB = LEN_TO_U32(pTaskState->CommandControlBlockGuest.o.acbData); 1321 } 1322 else 1323 { 1324 u32PhysAddrCCB = pTaskState->CommandControlBlockGuest.n.u32PhysAddrData; 1325 cbDataCCB = pTaskState->CommandControlBlockGuest.n.cbData; 1326 } 1327 1328 if ( (pTaskState->CommandControlBlockGuest.c.uDataDirection != BUSLOGIC_CCB_DIRECTION_NO_DATA) 1329 && cbDataCCB) 1112 1330 { 1113 1331 /* … … 1119 1337 * scatter gather list which describes the buffer. 1120 1338 */ 1121 if ( (pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER)1122 || (pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER))1339 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER) 1340 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 1123 1341 { 1124 1342 uint32_t cScatterGatherGCRead; 1125 1343 uint32_t iScatterGatherEntry; 1126 S catterGatherEntry aScatterGatherReadGC[32]; /* Number ofscatter gather list entries read from guest memory. */1127 uint32_t cScatterGatherGCLeft = pTaskState->CommandControlBlockGuest.cbData / sizeof(ScatterGatherEntry);1128 RTGCPHYS GCPhysAddrScatterGatherCurrent = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrData;1344 SGE32 aScatterGatherReadGC[32]; /* A buffer for scatter gather list entries read from guest memory. */ 1345 uint32_t cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry; 1346 RTGCPHYS GCPhysAddrScatterGatherCurrent = u32PhysAddrCCB; 1129 1347 size_t cbDataToTransfer = 0; 1130 1348 … … 1137 1355 cScatterGatherGCLeft -= cScatterGatherGCRead; 1138 1356 1139 /* Read the SG entries. */ 1140 PDMDevHlpPhysRead(pDevIns, GCPhysAddrScatterGatherCurrent, &aScatterGatherReadGC[0], 1141 cScatterGatherGCRead * sizeof(ScatterGatherEntry)); 1357 buslogicReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC); 1142 1358 1143 1359 for (iScatterGatherEntry = 0; iScatterGatherEntry < cScatterGatherGCRead; iScatterGatherEntry++) … … 1156 1372 1157 1373 /* Set address to the next entries to read. */ 1158 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * sizeof(ScatterGatherEntry);1374 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry; 1159 1375 } while (cScatterGatherGCLeft > 0); 1160 1376 … … 1168 1384 1169 1385 /* Copy the data if needed */ 1170 if (pTaskState->CommandControlBlockGuest. uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT)1386 if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT) 1171 1387 { 1172 cScatterGatherGCLeft = pTaskState->CommandControlBlockGuest.cbData / sizeof(ScatterGatherEntry);1173 GCPhysAddrScatterGatherCurrent = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrData;1388 cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry; 1389 GCPhysAddrScatterGatherCurrent = u32PhysAddrCCB; 1174 1390 uint8_t *pbData = (uint8_t *)pTaskState->DataSeg.pvSeg; 1175 1391 … … 1181 1397 cScatterGatherGCLeft -= cScatterGatherGCRead; 1182 1398 1183 /* Read the SG entries. */ 1184 PDMDevHlpPhysRead(pDevIns, GCPhysAddrScatterGatherCurrent, &aScatterGatherReadGC[0], 1185 cScatterGatherGCRead * sizeof(ScatterGatherEntry)); 1399 buslogicReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC); 1186 1400 1187 1401 for (iScatterGatherEntry = 0; iScatterGatherEntry < cScatterGatherGCRead; iScatterGatherEntry++) … … 1201 1415 1202 1416 /* Set address to the next entries to read. */ 1203 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * sizeof(ScatterGatherEntry);1417 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry; 1204 1418 } while (cScatterGatherGCLeft > 0); 1205 1419 } 1206 1420 1207 1421 } 1208 else if ( pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB1209 || pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH)1422 else if ( pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB 1423 || pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH) 1210 1424 { 1211 1425 /* The buffer is not scattered. */ 1212 RTGCPHYS GCPhysAddrDataBase = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrData;1426 RTGCPHYS GCPhysAddrDataBase = u32PhysAddrCCB; 1213 1427 1214 1428 AssertMsg(GCPhysAddrDataBase != 0, ("Physical address is 0\n")); 1215 1429 1216 pTaskState->DataSeg.cbSeg = pTaskState->CommandControlBlockGuest.cbData;1430 pTaskState->DataSeg.cbSeg = cbDataCCB; 1217 1431 pTaskState->DataSeg.pvSeg = RTMemAlloc(pTaskState->DataSeg.cbSeg); 1218 1432 if (!pTaskState->DataSeg.pvSeg) … … 1220 1434 1221 1435 Log(("Non scattered buffer:\n")); 1222 Log(("u32PhysAddrData=%#x\n", pTaskState->CommandControlBlockGuest.u32PhysAddrData));1223 Log(("cbData=%u\n", pTaskState->CommandControlBlockGuest.cbData));1436 Log(("u32PhysAddrData=%#x\n", u32PhysAddrCCB)); 1437 Log(("cbData=%u\n", cbDataCCB)); 1224 1438 Log(("GCPhysAddrDataBase=0x%RGp\n", GCPhysAddrDataBase)); 1225 1439 … … 1241 1455 { 1242 1456 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1243 1244 if ( (pTaskState->CommandControlBlockGuest.cbData > 0) 1245 && ( (pTaskState->CommandControlBlockGuest.uDataDirection == BUSLOGIC_CCB_DIRECTION_IN) 1246 || (pTaskState->CommandControlBlockGuest.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN))) 1247 { 1248 if ( (pTaskState->CommandControlBlockGuest.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER) 1249 || (pTaskState->CommandControlBlockGuest.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 1457 uint32_t cbDataCCB; 1458 uint32_t u32PhysAddrCCB; 1459 1460 /* Extract the data length and physical address from the CCB. */ 1461 if (pTaskState->fIs24Bit) 1462 { 1463 u32PhysAddrCCB = ADDR_TO_U32(pTaskState->CommandControlBlockGuest.o.aPhysAddrData); 1464 cbDataCCB = LEN_TO_U32(pTaskState->CommandControlBlockGuest.o.acbData); 1465 } 1466 else 1467 { 1468 u32PhysAddrCCB = pTaskState->CommandControlBlockGuest.n.u32PhysAddrData; 1469 cbDataCCB = pTaskState->CommandControlBlockGuest.n.cbData; 1470 } 1471 1472 #if 1 1473 /* Hack for NT 10/91: A CCB describes a 2K buffer, but TEST UNIT READY is executed. This command 1474 * returns no data, hence the buffer must be left alone! 1475 */ 1476 if (pTaskState->CommandControlBlockGuest.c.aCDB[0] == 0) 1477 cbDataCCB = 0; 1478 #endif 1479 1480 LogFlowFunc(("pTaskState=%#p cbDataCCB=%u direction=%u cbSeg=%u\n", pTaskState, cbDataCCB, 1481 pTaskState->CommandControlBlockGuest.c.uDataDirection, pTaskState->DataSeg.cbSeg)); 1482 1483 if ( (cbDataCCB > 0) 1484 && ( (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_IN) 1485 || (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN))) 1486 { 1487 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER) 1488 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 1250 1489 { 1251 1490 uint32_t cScatterGatherGCRead; 1252 1491 uint32_t iScatterGatherEntry; 1253 S catterGatherEntryaScatterGatherReadGC[32]; /* Number of scatter gather list entries read from guest memory. */1254 uint32_t cScatterGatherGCLeft = pTaskState->CommandControlBlockGuest.cbData / sizeof(ScatterGatherEntry);1255 RTGCPHYS GCPhysAddrScatterGatherCurrent = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrData;1492 SGE32 aScatterGatherReadGC[32]; /* Number of scatter gather list entries read from guest memory. */ 1493 uint32_t cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry; 1494 RTGCPHYS GCPhysAddrScatterGatherCurrent = u32PhysAddrCCB; 1256 1495 uint8_t *pbData = (uint8_t *)pTaskState->DataSeg.pvSeg; 1257 1496 … … 1263 1502 cScatterGatherGCLeft -= cScatterGatherGCRead; 1264 1503 1265 /* Read the SG entries. */ 1266 PDMDevHlpPhysRead(pDevIns, GCPhysAddrScatterGatherCurrent, &aScatterGatherReadGC[0], 1267 cScatterGatherGCRead * sizeof(ScatterGatherEntry)); 1504 buslogicReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC); 1268 1505 1269 1506 for (iScatterGatherEntry = 0; iScatterGatherEntry < cScatterGatherGCRead; iScatterGatherEntry++) … … 1284 1521 1285 1522 /* Set address to the next entries to read. */ 1286 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * sizeof(ScatterGatherEntry);1523 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry; 1287 1524 } while (cScatterGatherGCLeft > 0); 1288 1525 1289 1526 } 1290 else if ( pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB1291 || pTaskState->CommandControlBlockGuest. uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH)1527 else if ( pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB 1528 || pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH) 1292 1529 { 1293 1530 /* The buffer is not scattered. */ 1294 RTGCPHYS GCPhysAddrDataBase = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrData;1531 RTGCPHYS GCPhysAddrDataBase = u32PhysAddrCCB; 1295 1532 1296 1533 AssertMsg(GCPhysAddrDataBase != 0, ("Physical address is 0\n")); 1297 1534 1298 1535 Log(("Non scattered buffer:\n")); 1299 Log(("u32PhysAddrData=%#x\n", pTaskState->CommandControlBlockGuest.u32PhysAddrData));1300 Log(("cbData=%u\n", pTaskState->CommandControlBlockGuest.cbData));1536 Log(("u32PhysAddrData=%#x\n", u32PhysAddrCCB)); 1537 Log(("cbData=%u\n", cbDataCCB)); 1301 1538 Log(("GCPhysAddrDataBase=0x%RGp\n", GCPhysAddrDataBase)); 1302 1539 … … 1304 1541 PDMDevHlpPhysWrite(pDevIns, GCPhysAddrDataBase, pTaskState->DataSeg.pvSeg, pTaskState->DataSeg.cbSeg); 1305 1542 } 1543 1544 } 1545 /* Update residual data length. */ 1546 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH) 1547 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 1548 { 1549 uint32_t cbResidual; 1550 1551 //@todo: we need to get the actual transfer length from the VSCSI layer?! 1552 cbResidual = 0; //LEN_TO_U32(pTaskState->CCBGuest.acbData) - ???; 1553 if (pTaskState->fIs24Bit) 1554 U32_TO_LEN(pTaskState->CommandControlBlockGuest.o.acbData, cbResidual); 1555 else 1556 pTaskState->CommandControlBlockGuest.n.cbData = cbResidual; 1306 1557 } 1307 1558 … … 1336 1587 uint32_t cbSenseBuffer; 1337 1588 1338 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c bSenseData);1589 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData); 1339 1590 1340 1591 /* Copy the sense buffer into guest memory if requested. */ … … 1342 1593 { 1343 1594 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1344 RTGCPHYS GCPhysAddrSenseBuffer = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrSenseData; 1595 RTGCPHYS GCPhysAddrSenseBuffer; 1596 1597 /* With 32-bit CCBs, the (optional) sense buffer physical address is provided separately. 1598 * On the other hand, with 24-bit CCBs, the sense buffer is simply located at the end of 1599 * the CCB, right after the variable-length CDB. 1600 */ 1601 if (pTaskState->fIs24Bit) 1602 { 1603 GCPhysAddrSenseBuffer = pTaskState->MailboxGuest.u32PhysAddrCCB; 1604 GCPhysAddrSenseBuffer += pTaskState->CommandControlBlockGuest.c.cbCDB + RT_OFFSETOF(CCB24, aCDB); 1605 } 1606 else 1607 GCPhysAddrSenseBuffer = pTaskState->CommandControlBlockGuest.n.u32PhysAddrSenseData; 1345 1608 1346 1609 PDMDevHlpPhysWrite(pDevIns, GCPhysAddrSenseBuffer, pTaskState->pbSenseBuffer, cbSenseBuffer); … … 1365 1628 pTaskState->pbSenseBuffer = NULL; 1366 1629 1367 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c bSenseData);1630 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData); 1368 1631 if (cbSenseBuffer) 1369 1632 { … … 1544 1807 pReply->fParityCheckingEnabled = true; 1545 1808 pReply->cMailbox = pBusLogic->cMailbox; 1809 U32_TO_ADDR(pReply->MailboxAddress, pBusLogic->GCPhysAddrMailboxOutgoingBase); 1546 1810 pReply->uSignature = 'B'; 1547 1811 /* The 'D' signature prevents Adaptec's OS/2 drivers from getting too … … 1565 1829 break; 1566 1830 } 1831 case BUSLOGICCOMMAND_INITIALIZE_MAILBOX: 1832 { 1833 PRequestInitMbx pRequest = (PRequestInitMbx)pBusLogic->aCommandBuffer; 1834 1835 pBusLogic->fMbxIs24Bit = true; 1836 pBusLogic->cMailbox = pRequest->cMailbox; 1837 pBusLogic->GCPhysAddrMailboxOutgoingBase = (RTGCPHYS)ADDR_TO_U32(pRequest->aMailboxBaseAddr); 1838 /* The area for incoming mailboxes is right after the last entry of outgoing mailboxes. */ 1839 pBusLogic->GCPhysAddrMailboxIncomingBase = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->cMailbox * sizeof(Mailbox24)); 1840 1841 Log(("GCPhysAddrMailboxOutgoingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxOutgoingBase)); 1842 Log(("GCPhysAddrMailboxIncomingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxIncomingBase)); 1843 Log(("cMailboxes=%u (24-bit mode)\n", pBusLogic->cMailbox)); 1844 LogRel(("Initialized 24-bit mailbox, %d entries at %08x\n", pRequest->cMailbox, ADDR_TO_U32(pRequest->aMailboxBaseAddr))); 1845 1846 pBusLogic->regStatus &= ~BUSLOGIC_REGISTER_STATUS_INITIALIZATION_REQUIRED; 1847 pBusLogic->cbReplyParametersLeft = 0; 1848 break; 1849 } 1567 1850 case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX: 1568 1851 { 1569 1852 PRequestInitializeExtendedMailbox pRequest = (PRequestInitializeExtendedMailbox)pBusLogic->aCommandBuffer; 1570 1853 1854 pBusLogic->fMbxIs24Bit = false; 1571 1855 pBusLogic->cMailbox = pRequest->cMailbox; 1572 1856 pBusLogic->GCPhysAddrMailboxOutgoingBase = (RTGCPHYS)pRequest->uMailboxBaseAddress; 1573 1857 /* The area for incoming mailboxes is right after the last entry of outgoing mailboxes. */ 1574 pBusLogic->GCPhysAddrMailboxIncomingBase = (RTGCPHYS)pRequest->uMailboxBaseAddress + (pBusLogic->cMailbox * sizeof(Mailbox ));1858 pBusLogic->GCPhysAddrMailboxIncomingBase = (RTGCPHYS)pRequest->uMailboxBaseAddress + (pBusLogic->cMailbox * sizeof(Mailbox32)); 1575 1859 1576 1860 Log(("GCPhysAddrMailboxOutgoingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxOutgoingBase)); … … 1909 2193 case BUSLOGICCOMMAND_FETCH_HOST_ADAPTER_LOCAL_RAM: 1910 2194 pBusLogic->cbCommandParametersLeft = 2; 2195 break; 2196 case BUSLOGICCOMMAND_INITIALIZE_MAILBOX: 2197 pBusLogic->cbCommandParametersLeft = sizeof(RequestInitMbx); 1911 2198 break; 1912 2199 case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX: … … 2462 2749 } 2463 2750 #ifdef DEBUG 2464 buslogicDumpCCBInfo(&pTaskState->CommandControlBlockGuest );2751 buslogicDumpCCBInfo(&pTaskState->CommandControlBlockGuest, pTaskState->fIs24Bit); 2465 2752 #endif 2466 2753 … … 2495 2782 { 2496 2783 int rc = VINF_SUCCESS; 2784 uint8_t uTargetIdCCB; 2785 PBUSLOGICDEVICE pTargetDevice; 2497 2786 2498 2787 /* Fetch the CCB from guest memory. */ 2788 //@todo: How much do we really have to read? 2499 2789 RTGCPHYS GCPhysAddrCCB = (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB; 2500 2790 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB, 2501 &pTaskState->CommandControlBlockGuest, sizeof(CommandControlBlock)); 2502 2503 PBUSLOGICDEVICE pTargetDevice = &pBusLogic->aDeviceStates[pTaskState->CommandControlBlockGuest.uTargetId]; 2791 &pTaskState->CommandControlBlockGuest, sizeof(CCB32)); 2792 2793 uTargetIdCCB = pTaskState->fIs24Bit ? pTaskState->CommandControlBlockGuest.o.uTargetId : pTaskState->CommandControlBlockGuest.n.uTargetId; 2794 pTargetDevice = &pBusLogic->aDeviceStates[uTargetIdCCB]; 2504 2795 pTaskState->CTX_SUFF(pTargetDevice) = pTargetDevice; 2505 2796 2506 2797 #ifdef DEBUG 2507 buslogicDumpCCBInfo(&pTaskState->CommandControlBlockGuest );2798 buslogicDumpCCBInfo(&pTaskState->CommandControlBlockGuest, pTaskState->fIs24Bit); 2508 2799 #endif 2509 2800 … … 2516 2807 2517 2808 /* Check if device is present on bus. If not return error immediately and don't process this further. */ 2518 if (!pBusLogic->aDeviceStates[ pTaskState->CommandControlBlockGuest.uTargetId].fPresent)2809 if (!pBusLogic->aDeviceStates[uTargetIdCCB].fPresent) 2519 2810 { 2520 2811 buslogicDataBufferFree(pTaskState); … … 2533 2824 { 2534 2825 /* Setup SCSI request. */ 2535 pTaskState->PDMScsiRequest.uLogicalUnit = pTaskState->CommandControlBlockGuest.uLogicalUnit; 2536 2537 if (pTaskState->CommandControlBlockGuest.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN) 2826 pTaskState->PDMScsiRequest.uLogicalUnit = pTaskState->fIs24Bit ? pTaskState->CommandControlBlockGuest.o.uLogicalUnit 2827 : pTaskState->CommandControlBlockGuest.n.uLogicalUnit; 2828 2829 if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN) 2538 2830 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_UNKNOWN; 2539 else if (pTaskState->CommandControlBlockGuest. uDataDirection == BUSLOGIC_CCB_DIRECTION_IN)2831 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_IN) 2540 2832 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_FROM_DEVICE; 2541 else if (pTaskState->CommandControlBlockGuest. uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT)2833 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT) 2542 2834 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_TO_DEVICE; 2543 else if (pTaskState->CommandControlBlockGuest. uDataDirection == BUSLOGIC_CCB_DIRECTION_NO_DATA)2835 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_NO_DATA) 2544 2836 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_NONE; 2545 2837 else 2546 AssertMsgFailed(("Invalid data direction type %d\n", pTaskState->CommandControlBlockGuest. uDataDirection));2547 2548 pTaskState->PDMScsiRequest.cbCDB = pTaskState->CommandControlBlockGuest.c bCDB;2549 pTaskState->PDMScsiRequest.pbCDB = pTaskState->CommandControlBlockGuest. aCDB;2838 AssertMsgFailed(("Invalid data direction type %d\n", pTaskState->CommandControlBlockGuest.c.uDataDirection)); 2839 2840 pTaskState->PDMScsiRequest.cbCDB = pTaskState->CommandControlBlockGuest.c.cbCDB; 2841 pTaskState->PDMScsiRequest.pbCDB = pTaskState->CommandControlBlockGuest.c.aCDB; 2550 2842 if (pTaskState->DataSeg.cbSeg) 2551 2843 { … … 2560 2852 pTaskState->PDMScsiRequest.paScatterGatherHead = NULL; 2561 2853 } 2562 pTaskState->PDMScsiRequest.cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c bSenseData);2854 pTaskState->PDMScsiRequest.cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData); 2563 2855 pTaskState->PDMScsiRequest.pbSenseBuffer = pTaskState->pbSenseBuffer; 2564 2856 pTaskState->PDMScsiRequest.pvUser = pTaskState; … … 2573 2865 2574 2866 /** 2867 * Read a mailbox from guest memory. Convert 24-bit mailboxes to 2868 * 32-bit format. 2869 * 2870 * @returns Mailbox guest physical address. 2871 * @param pBusLogic Pointer to the BusLogic instance data. 2872 * @param pTaskStat Pointer to the task state being set up. 2873 */ 2874 static RTGCPHYS buslogicReadOutgoingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState) 2875 { 2876 RTGCPHYS GCMailbox; 2877 2878 if (pBusLogic->fMbxIs24Bit) 2879 { 2880 Mailbox24 Mbx24; 2881 2882 GCMailbox = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox24)); 2883 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCMailbox, &Mbx24, sizeof(Mailbox24)); 2884 pTaskState->MailboxGuest.u32PhysAddrCCB = ADDR_TO_U32(Mbx24.aPhysAddrCCB); 2885 pTaskState->MailboxGuest.u.out.uActionCode = Mbx24.uCmdState; 2886 } 2887 else 2888 { 2889 GCMailbox = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox32)); 2890 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCMailbox, &pTaskState->MailboxGuest, sizeof(Mailbox32)); 2891 } 2892 2893 return GCMailbox; 2894 } 2895 2896 /** 2575 2897 * Read mailbox from the guest and execute command. 2576 2898 * … … 2587 2909 AssertMsgReturn(RT_SUCCESS(rc) && (pTaskState != NULL), ("Failed to get task state from cache\n"), rc); 2588 2910 2589 pTaskState->fBIOS = false; 2911 pTaskState->fBIOS = false; 2912 pTaskState->fIs24Bit = pBusLogic->fMbxIs24Bit; 2913 pTaskState->cbSGEntry = pBusLogic->fMbxIs24Bit ? sizeof(SGE24) : sizeof(SGE32); 2590 2914 2591 2915 if (!pBusLogic->fStrictRoundRobinMode) … … 2597 2921 { 2598 2922 /* Fetch mailbox from guest memory. */ 2599 GCPhysAddrMailboxCurrent = buslogicOutgoingMailboxGetGCPhys(pBusLogic); 2600 2601 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent, 2602 &pTaskState->MailboxGuest, sizeof(Mailbox)); 2923 GCPhysAddrMailboxCurrent = buslogicReadOutgoingMailbox(pBusLogic,pTaskState); 2603 2924 2604 2925 /* Check the next mailbox. */ … … 2610 2931 { 2611 2932 /* Fetch mailbox from guest memory. */ 2612 GCPhysAddrMailboxCurrent = buslogicOutgoingMailboxGetGCPhys(pBusLogic); 2613 2614 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent, 2615 &pTaskState->MailboxGuest, sizeof(Mailbox)); 2933 GCPhysAddrMailboxCurrent = buslogicReadOutgoingMailbox(pBusLogic,pTaskState); 2616 2934 } 2617 2935 … … 2636 2954 /* We got the mailbox, mark it as free in the guest. */ 2637 2955 uint8_t uActionCode = BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE; 2638 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent + RT_OFFSETOF(Mailbox, u.out.uActionCode), &uActionCode, sizeof(uActionCode)); 2956 unsigned uCodeOffs = pTaskState->fIs24Bit ? RT_OFFSETOF(Mailbox24, uCmdState) : RT_OFFSETOF(Mailbox32, u.out.uActionCode); 2957 PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent + uCodeOffs, &uActionCode, sizeof(uActionCode)); 2639 2958 2640 2959 if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_START_COMMAND) … … 2765 3084 SSMR3PutU8 (pSSM, pBusLogic->uISABaseCode); 2766 3085 SSMR3PutU32 (pSSM, pBusLogic->cMailbox); 3086 SSMR3PutBool (pSSM, pBusLogic->fMbxIs24Bit); 2767 3087 SSMR3PutGCPhys(pSSM, pBusLogic->GCPhysAddrMailboxOutgoingBase); 2768 3088 SSMR3PutU32 (pSSM, pBusLogic->uMailboxOutgoingPositionCurrent); … … 2871 3191 SSMR3GetU8 (pSSM, &pBusLogic->uISABaseCode); 2872 3192 SSMR3GetU32 (pSSM, &pBusLogic->cMailbox); 3193 if (uVersion > BUSLOGIC_SAVED_STATE_MINOR_PRE_24BIT_MBOX) 3194 SSMR3GetBool (pSSM, &pBusLogic->fMbxIs24Bit); 2873 3195 SSMR3GetGCPhys(pSSM, &pBusLogic->GCPhysAddrMailboxOutgoingBase); 2874 3196 SSMR3GetU32 (pSSM, &pBusLogic->uMailboxOutgoingPositionCurrent);
Note:
See TracChangeset
for help on using the changeset viewer.