From db3a1d4b6d2b07db9b759c4fba31a94c2da5913e Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 23 Oct 2020 23:09:53 +0900 Subject: [PATCH] nvm fixed it --- src/net/torvald/tsvm/SerialHelper.kt | 6 ++++-- .../torvald/tsvm/peripheral/BlockTransferInterface.kt | 10 +++++++--- src/net/torvald/tsvm/peripheral/BlockTransferPort.kt | 7 ++++--- src/net/torvald/tsvm/peripheral/TestDiskDrive.kt | 4 +++- .../torvald/tsvm/peripheral/TestFunctionGenerator.kt | 4 +++- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/net/torvald/tsvm/SerialHelper.kt b/src/net/torvald/tsvm/SerialHelper.kt index e5adf95..dab3684 100644 --- a/src/net/torvald/tsvm/SerialHelper.kt +++ b/src/net/torvald/tsvm/SerialHelper.kt @@ -42,6 +42,7 @@ object SerialHelper { fun fetchResponse(vm: VM, portNo: Int): ByteArray { val incomingMsg = ByteArray(BLOCK_SIZE) + // incoming message is always 4K long and unused bytes are zero-filled. THIS IS INTENTIONAL UnsafeHelper.memcpyRaw( null, vm.getIO().blockTransferRx[portNo].ptr, incomingMsg, UnsafeHelper.getArrayOffset(incomingMsg), @@ -61,9 +62,10 @@ object SerialHelper { waitUntilReady(vm, portNo) val transStat = getBlockTransferStatus(vm, portNo) - println("[SerialHelper.pullMessage()] received length: ${transStat.first}") + val receivedLen = transStat.first//vm.getIO().blockTransferPorts[portNo].yourBlockSize() + //println("[SerialHelper.pullMessage()] received length: $receivedLen") - for (k in 0 until minOf(BLOCK_SIZE, transStat.first)) { + for (k in 0 until minOf(BLOCK_SIZE, receivedLen)) { msgBuffer.write(vm.getIO().blockTransferRx[portNo][k.toLong()].toInt()) } diff --git a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt b/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt index 7c7d669..24f3a12 100644 --- a/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt +++ b/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt @@ -21,15 +21,19 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea open fun areYouBusy(): Boolean = recipient?.busy ?: false /** Writes a thing to the recipient. - * A method exposed to outside of the box */ - abstract fun startSendImpl(recipient: BlockTransferInterface) + * A method exposed to outside of the box + * @return number of bytes actually sent over*/ + abstract fun startSendImpl(recipient: BlockTransferInterface): Int /** The actual implementation */ fun startSend() { //if (areYouReady()) { busy = true ready = false - recipient?.let { startSendImpl(it) } + recipient?.let { + this.blockSize = startSendImpl(it) + //println("[BlockTransferInterface.startSend()] recipients blocksize = ${this.blockSize}") + } busy = false ready = true diff --git a/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt b/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt index 577731b..c7d8487 100644 --- a/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt +++ b/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt @@ -10,8 +10,9 @@ class BlockTransferPort(val vm: VM, val portno: Int) : BlockTransferInterface(tr internal var hasNext = false - override fun startSendImpl(recipient: BlockTransferInterface) { + override fun startSendImpl(recipient: BlockTransferInterface): Int { recipient.writeout(ByteArray(BLOCK_SIZE) { vm.getIO().blockTransferTx[portno][it.toLong()] }) + return blockSize // use MMIO to modify this variable } override fun hasNext(): Boolean = hasNext @@ -22,9 +23,9 @@ class BlockTransferPort(val vm: VM, val portno: Int) : BlockTransferInterface(tr //UnsafeHelper.memcpyRaw(inputData, arrayOffset, null, vm.getIO().blockTransferRx[portno].ptr, copySize) // not exposing raw memory to block probable security hole - println("[BlockTranferPort] writeout size: ${inputData.size}") + //println("[BlockTranferPort] writeout size: ${inputData.size}") for (k in 0 until BLOCK_SIZE) { - vm.getIO().blockTransferRx[portno][k.toLong()] = if (k >= inputData.size) 0x5F else inputData[k] + vm.getIO().blockTransferRx[portno][k.toLong()] = if (k >= inputData.size) 0 else inputData[k] } } diff --git a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt index 24765de..5f61fad 100644 --- a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt +++ b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt @@ -88,7 +88,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t * * Disk drive must send prepared message (or file transfer packet) to the computer. */ - override fun startSendImpl(recipient: BlockTransferInterface) { + override fun startSendImpl(recipient: BlockTransferInterface): Int { if (blockSendCount == 0) { blockSendBuffer = messageComposeBuffer.toByteArray() } @@ -102,6 +102,8 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t }) blockSendCount += 1 + + return sendSize } /** Computer's attempt to startSend() will result in calling this very function. diff --git a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt index 0df4000..e3d6ede 100644 --- a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt +++ b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt @@ -100,7 +100,7 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac return sb.toByteArray() } - override fun startSendImpl(recipient: BlockTransferInterface) { + override fun startSendImpl(recipient: BlockTransferInterface): Int { if (blockSendCount == 0) { //blockSendBuffer = messageComposeBuffer.toByteArray() blockSendBuffer = fileContent_multiblocks @@ -115,6 +115,8 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac }) blockSendCount += 1 + + return sendSize } override fun hasNext(): Boolean {