riscv: Fix crash when syscall argument reg index is too high
authorAlec Roelke <ar4jc@virginia.edu>
Fri, 27 Jan 2017 21:05:01 +0000 (15:05 -0600)
committerAlec Roelke <ar4jc@virginia.edu>
Fri, 27 Jan 2017 21:05:01 +0000 (15:05 -0600)
By default, doSyscall gets the values of six registers to be used for
system call arguments.  RISC-V, by convention, only has four.  Because
RISC-V's implementation of these indices is as arrays of integers rather
than as base indices plus offsets, trying to get the fifth argument
register's value will cause a crash.  This patch fixes that by returning 0
for any index higher than 3.

Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
src/arch/riscv/process.cc

index c1a67ec153daf4125972079261ab301105ec5978..4eb3159af1c7cceef61a62b536b1526cadceef76 100644 (file)
@@ -217,7 +217,13 @@ RiscvLiveProcess::argsInit(int pageSize)
 RiscvISA::IntReg
 RiscvLiveProcess::getSyscallArg(ThreadContext *tc, int &i)
 {
-    return tc->readIntReg(SyscallArgumentRegs[i++]);
+    // RISC-V only has four system call argument registers by convention, so
+    // if a larger index is requested return 0
+    RiscvISA::IntReg retval = 0;
+    if (i < 4)
+        retval = tc->readIntReg(SyscallArgumentRegs[i]);
+    i++;
+    return retval;
 }
 
 void