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>
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