From 8bce2fc739d7d490f1a6d056e5373549ae85f627 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Tue, 11 Jun 2024 16:21:53 -0700 Subject: [PATCH] Getting closer. --- fpga/rvvidaemon/rvvidaemon.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/fpga/rvvidaemon/rvvidaemon.c b/fpga/rvvidaemon/rvvidaemon.c index f7447d9dd..1b4a25d0e 100644 --- a/fpga/rvvidaemon/rvvidaemon.c +++ b/fpga/rvvidaemon/rvvidaemon.c @@ -158,6 +158,9 @@ int main(int argc, char **argv){ void DecodeRVVI(uint8_t *payload, ssize_t payloadsize, uint64_t * PC, uint32_t *insn){ // you know this actually easiser in assembly. :( uint8_t buf2[BUF_SIZ], buf3[BUF_SIZ]; + uint8_t * buf2ptr, *buf3ptr; + buf2ptr = buf2; + buf3ptr = buf3; //int PayloadSize = sizeof(RequiredRVVI_t) - 1; int PayloadSize = 30; int Buf2Size = BUF_SIZ - PayloadSize; @@ -175,9 +178,11 @@ void DecodeRVVI(uint8_t *payload, ssize_t payloadsize, uint64_t * PC, uint32_t * uint32_t RequiredFlags; RequiredFlags = * (uint32_t *) payload; uint8_t Trap, PrivilegeMode, GPRWen, FPRWen; - uint16_t CSRCount; - uint8_t GPRReg; - uint64_t GPRData; + uint16_t CSRCount = 0; + uint8_t GPRReg = 0; + uint64_t GPRData = 0; + uint8_t FPRReg = 0; + uint64_t FPRData = 0; Trap = RequiredFlags & 0x1; PrivilegeMode = (RequiredFlags >> 1) & 0x3; @@ -203,10 +208,22 @@ void DecodeRVVI(uint8_t *payload, ssize_t payloadsize, uint64_t * PC, uint32_t * } printf("\n"); if(GPRWen){ - GPRReg = * (uint8_t *) buf2; + GPRReg = * (uint8_t *) buf2ptr; GPRReg = GPRReg & 0x1F; - BitShiftArray(buf3, buf2, 5, newPayloadSize); + BitShiftArray(buf3, buf2ptr, 5, newPayloadSize); GPRData = * (uint64_t *) buf3; + if(FPRWen){ + buf3ptr += 8; + FPRReg = * (uint8_t *) buf3ptr; + BitShiftArray(buf2, buf3ptr, 5, newPayloadSize - 8); + FPRReg = FPRReg & 0x1F; + FPRData = * (uint64_t *) buf2; + } + }else if(FPRWen){ + FPRReg = * (uint8_t *) buf2; + FPRReg = FPRReg & 0x1F; + BitShiftArray(buf3, buf2, 5, newPayloadSize); + FPRData = * (uint64_t *) buf3; } printf("Wrote register %d with value = %lx\n", GPRReg, GPRData); int bits;