From e4c57275d38c864798cb04a4644bac90a83572fd Mon Sep 17 00:00:00 2001 From: Alec Roelke Date: Fri, 27 Jan 2017 15:05:01 -0600 Subject: [PATCH] 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 --- src/arch/riscv/process.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/arch/riscv/process.cc b/src/arch/riscv/process.cc index c1a67ec15..4eb3159af 100644 --- a/src/arch/riscv/process.cc +++ b/src/arch/riscv/process.cc @@ -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