1
0
mirror of synced 2026-01-13 15:17:07 +00:00

Fixed crash with IOSD and expander disk file transfers.

This commit is contained in:
Andras Tantos 2021-03-01 16:34:31 +00:00
parent 06a8476248
commit 7991cfd770
2 changed files with 8 additions and 5 deletions

View File

@ -416,6 +416,7 @@ public:
CREATE_FIELD(CAddr_t, YmpReadAddress, 2, 0, 7, 0)
CREATE_FIELD(uint8_t, YmpExchangeAddress, 5, 8, 15, 0)
CREATE_FIELD(uint8_t, YmpVectorLength, 5, 16, 22, 0)
// Here the number of bits is actually series dependent. YEL for example has 4 bits, J90 has 6. Leaving as 8 for now as it doesn't seem to cause trouble.
CREATE_FIELD(uint8_t, YmpClusterNumber, 5, 24, 31, 0)
CREATE_FIELD(uint8_t, YmpVectorNotUsed, 6, 0, 0, 0)
CREATE_FIELD(uint8_t, YmpProcessorType, 7, 0, 1, 0)

View File

@ -256,6 +256,7 @@ void SimIopPeripheral_c::HandlePacket(std::vector<CInt_t> &aPacket, bool aIosESt
case FunctionCodes_e::RD:
case FunctionCodes_e::RDHLD:
case FunctionCodes_e::RDRD: {
int BufferCnt = (Function == FunctionCodes_e::RDRD) ? 2 : 1;
uint32_t Addr[2];
uint32_t DataLen[2];
uint32_t TransferLen[2];
@ -272,10 +273,10 @@ void SimIopPeripheral_c::HandlePacket(std::vector<CInt_t> &aPacket, bool aIosESt
case ChannelNumbers_e::Disk:
break;
case ChannelNumbers_e::Tape:
Read(Addr, DataLen, TransferLen, 2, mTapeFile);
Read(Addr, DataLen, TransferLen, BufferCnt, mTapeFile);
break;
case ChannelNumbers_e::File:
Read(Addr, DataLen, TransferLen, 2, mFile);
Read(Addr, DataLen, TransferLen, BufferCnt, mFile);
break;
default:
CRAY_ASSERT(false);
@ -290,6 +291,7 @@ void SimIopPeripheral_c::HandlePacket(std::vector<CInt_t> &aPacket, bool aIosESt
case FunctionCodes_e::WR:
case FunctionCodes_e::WRHLD:
case FunctionCodes_e::WRWR: {
int BufferCnt = (Function == FunctionCodes_e::RDRD) ? 2 : 1;
uint32_t Addr[2];
uint32_t DataLen[2];
uint32_t TransferLen[2];
@ -301,15 +303,15 @@ void SimIopPeripheral_c::HandlePacket(std::vector<CInt_t> &aPacket, bool aIosESt
TransferLen[1] = uint32_t(GetBits(aPacket[4], TransferLenReq2Range));
switch (ChannelNumber) {
case ChannelNumbers_e::Printer:
Write(Addr, DataLen, TransferLen, 2, mPrinterFile);
Write(Addr, DataLen, TransferLen, BufferCnt, mPrinterFile);
break;
case ChannelNumbers_e::Disk:
break;
case ChannelNumbers_e::Tape:
Write(Addr, DataLen, TransferLen, 2, mTapeFile);
Write(Addr, DataLen, TransferLen, BufferCnt, mTapeFile);
break;
case ChannelNumbers_e::File:
Write(Addr, DataLen, TransferLen, 2, mFile);
Write(Addr, DataLen, TransferLen, BufferCnt, mFile);
break;
default:
CRAY_ASSERT(false);