riscv: Fix crash when syscall argument reg index is too high

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>
This commit is contained in:
Alec Roelke 2017-01-27 15:05:01 -06:00
parent c5df9308c9
commit e4c57275d3

View 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