void syscall(ThreadContext *tc, Fault *fault) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using ArmProcess::getSyscallArg;
-
/// A page to hold "kernel" provided functions. The name might be wrong.
static const Addr commPage;
void syscall(ThreadContext *tc, Fault *fault) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using ArmProcess::getSyscallArg;
-
/// A page to hold "kernel" provided functions. The name might be wrong.
static const Addr commPage;
0, 1, 2, 3, 4, 5, 6
};
-RegVal
-ArmProcess32::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 6);
- return tc->readIntReg(ArgumentReg0 + i++);
-}
-
-RegVal
-ArmProcess64::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 8);
- return tc->readIntReg(ArgumentReg0 + i++);
-}
-
-RegVal
-ArmProcess32::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;
-}
-
-RegVal
-ArmProcess64::getSyscallArg(ThreadContext *tc, int &i, int width)
-{
- return getSyscallArg(tc, i);
-}
-
void
ArmProcess32::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
{
public:
- RegVal getSyscallArg(ThreadContext *tc, int &i, int width) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) override;
public:
- RegVal getSyscallArg(ThreadContext *tc, int &i, int width) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) override;
}
-RegVal
-MipsProcess::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 6);
- return tc->readIntReg(FirstArgumentReg + i++);
-}
-
void
MipsProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
{
void argsInit(int pageSize);
public:
- RegVal getSyscallArg(ThreadContext *tc, int &i);
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
struct SyscallABI : public GenericSyscallABI64
{
doSyscall(tc->readIntReg(0), tc, fault);
}
-
-RegVal
-PowerLinuxProcess::getSyscallArg(ThreadContext *tc, int &i)
-{
- // Linux apparently allows more parameter than the ABI says it should.
- // This limit may need to be increased even further.
- assert(i < 6);
- return tc->readIntReg(ArgumentReg0 + i++);
-}
void syscall(ThreadContext *tc, Fault *fault) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
-
/// Array of syscall descriptors, indexed by call number.
static SyscallDescABI<SyscallABI> syscallDescs[];
memState->setStackMin(roundDown(stack_min, pageSize));
}
-RegVal
-PowerProcess::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 5);
- return tc->readIntReg(ArgumentReg0 + i++);
-}
-
void
PowerProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
{
public:
void argsInit(int intSize, int pageSize);
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) override;
memState->setStackMin(roundDown(memState->getStackMin(), pageSize));
}
-RegVal
-RiscvProcess::getSyscallArg(ThreadContext *tc, int &i)
-{
- // If a larger index is requested than there are syscall argument
- // registers, return 0
- RegVal retval = 0;
- if (i < SyscallArgumentRegs.size())
- retval = tc->readIntReg(SyscallArgumentRegs[i]);
- i++;
- return retval;
-}
-
void
RiscvProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
{
void argsInit(int pageSize);
public:
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) override;
static const int FirstArgumentReg = 8;
-RegVal
-Sparc32Process::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 6);
- return bits(tc->readIntReg(FirstArgumentReg + i++), 31, 0);
-}
-
-RegVal
-Sparc64Process::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < 6);
- return tc->readIntReg(FirstArgumentReg + i++);
-}
-
void
SparcProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
{
void flushWindows(ThreadContext *tc) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
-
struct SyscallABI : public GenericSyscallABI32,
public SparcProcess::SyscallABI
{};
void flushWindows(ThreadContext *tc) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
-
struct SyscallABI : public GenericSyscallABI64,
public SparcProcess::SyscallABI
{};
tc->setIntReg(INTREG_RAX, retval.encodedValue());
}
-RegVal
-X86_64Process::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < NumArgumentRegs);
- return tc->readIntReg(ArgumentReg[i++]);
-}
-
void
X86_64Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *p, RegVal flags)
((X86_64Process*)p)->vsyscallPage = vsyscallPage;
}
-RegVal
-I386Process::getSyscallArg(ThreadContext *tc, int &i)
-{
- assert(i < NumArgumentRegs32);
- return tc->readIntReg(ArgumentReg32[i++]);
-}
-
-RegVal
-I386Process::getSyscallArg(ThreadContext *tc, int &i, int width)
-{
- assert(width == 32 || width == 64);
- assert(i < NumArgumentRegs);
- uint64_t retVal = tc->readIntReg(ArgumentReg32[i++]) & mask(32);
- if (width == 64)
- retVal |= ((uint64_t)tc->readIntReg(ArgumentReg[i++]) << 32);
- return retVal;
-}
-
void
I386Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *p, RegVal flags)
void argsInit(int pageSize);
void initState() override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- /// Explicitly import the otherwise hidden getSyscallArg
- using Process::getSyscallArg;
void clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *process, RegVal flags) override;
};
void argsInit(int pageSize);
void initState() override;
- RegVal getSyscallArg(ThreadContext *tc, int &i) override;
- RegVal getSyscallArg(ThreadContext *tc, int &i, int width) override;
void clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *process, RegVal flags) override;
};
desc->doSyscall(callnum, tc, fault);
}
-RegVal
-Process::getSyscallArg(ThreadContext *tc, int &i, int width)
-{
- return getSyscallArg(tc, i);
-}
-
EmulatedDriver *
Process::findDriver(std::string filename)
{
DrainState drain() override;
virtual void syscall(ThreadContext *tc, Fault *fault) = 0;
- virtual RegVal getSyscallArg(ThreadContext *tc, int &i) = 0;
- virtual RegVal getSyscallArg(ThreadContext *tc, int &i, int width);
virtual void setSyscallReturn(ThreadContext *tc,
SyscallReturn return_value) = 0;
virtual SyscallDesc *getDesc(int callnum) = 0;