summaryrefslogtreecommitdiff
path: root/src/arch/arm/process.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/process.cc')
-rw-r--r--src/arch/arm/process.cc22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/arch/arm/process.cc b/src/arch/arm/process.cc
index 00a6290c2..555fdf56e 100644
--- a/src/arch/arm/process.cc
+++ b/src/arch/arm/process.cc
@@ -362,10 +362,30 @@ ArmLiveProcess::argsInit(int intSize, int pageSize)
ArmISA::IntReg
ArmLiveProcess::getSyscallArg(ThreadContext *tc, int &i)
{
- assert(i < 4);
+ assert(i < 6);
return tc->readIntReg(ArgumentReg0 + i++);
}
+uint64_t
+ArmLiveProcess::getSyscallArg(ThreadContext *tc, int &i, int width)
+{
+ assert(width == 32 || width == 64);
+ if (width == 32)
+ return getSyscallArg(tc, i);
+
+ // 64 bit arguments are passed starting in an even register
+ if (i % 2 != 0)
+ i++;
+
+ // Registers r0-r6 can be used
+ assert(i < 5);
+ uint64_t val;
+ val = tc->readIntReg(ArgumentReg0 + i++);
+ val |= ((uint64_t)tc->readIntReg(ArgumentReg0 + i++) << 32);
+ return val;
+}
+
+
void
ArmLiveProcess::setSyscallArg(ThreadContext *tc,
int i, ArmISA::IntReg val)