const std::vector<int> ArmProcess64::SyscallABI::ArgumentRegs = {
0, 1, 2, 3, 4, 5, 6
};
-
-void
-ArmProcess32::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
-
- if (objFile->getOpSys() == ObjectFile::FreeBSD) {
- // Decode return value
- if (sysret.encodedValue() >= 0)
- // FreeBSD checks the carry bit to determine if syscall is succeeded
- tc->setCCReg(CCREG_C, 0);
- else {
- sysret = -sysret.encodedValue();
- }
- }
-
- tc->setIntReg(ReturnValueReg, sysret.encodedValue());
- if (sysret.count() > 1)
- tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
-}
-
-void
-ArmProcess64::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
-
- if (objFile->getOpSys() == ObjectFile::FreeBSD) {
- // Decode return value
- if (sysret.encodedValue() >= 0)
- // FreeBSD checks the carry bit to determine if syscall is succeeded
- tc->setCCReg(CCREG_C, 0);
- else {
- sysret = -sysret.encodedValue();
- }
- }
-
- tc->setIntReg(ReturnValueReg, sysret.encodedValue());
- if (sysret.count() > 1)
- tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
-}
uint32_t armHwcapImpl() const override;
public:
-
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
-
struct SyscallABI : public GenericSyscallABI32
{
static const std::vector<int> ArgumentRegs;
uint32_t armHwcapImpl() const override;
public:
-
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
-
struct SyscallABI : public GenericSyscallABI64
{
static const std::vector<int> ArgumentRegs;
tc->pcState(getStartPC());
}
-
-void
-MipsProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
- if (sysret.successful()) {
- // no error
- tc->setIntReg(SyscallSuccessReg, 0);
- tc->setIntReg(ReturnValueReg, sysret.returnValue());
- } else {
- // got an error, return details
- tc->setIntReg(SyscallSuccessReg, (uint32_t)(-1));
- tc->setIntReg(ReturnValueReg, sysret.errnoValue());
- }
- if (sysret.count() > 1)
- tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
-}
-
const std::vector<int> MipsProcess::SyscallABI::ArgumentRegs = {
4, 5, 6, 7, 8, 9
};
void argsInit(int pageSize);
public:
- void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
-
struct SyscallABI : public GenericSyscallABI64
{
static const std::vector<int> ArgumentRegs;
memState->setStackMin(roundDown(stack_min, pageSize));
}
-void
-PowerProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
- Cr cr = tc->readIntReg(INTREG_CR);
- if (sysret.successful()) {
- cr.cr0.so = 0;
- } else {
- cr.cr0.so = 1;
- }
- tc->setIntReg(INTREG_CR, cr);
- tc->setIntReg(ReturnValueReg, sysret.encodedValue());
-}
-
const std::vector<int> PowerProcess::SyscallABI::ArgumentRegs = {
3, 4, 5, 6, 7, 8
};
public:
void argsInit(int intSize, int pageSize);
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
struct SyscallABI : public GenericSyscallABI64
{
memState->setStackMin(roundDown(memState->getStackMin(), pageSize));
}
-void
-RiscvProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
- if (sysret.successful()) {
- // no error
- tc->setIntReg(SyscallPseudoReturnReg, sysret.returnValue());
- } else {
- // got an error, return details
- tc->setIntReg(SyscallPseudoReturnReg, sysret.encodedValue());
- }
-}
-
const std::vector<int> RiscvProcess::SyscallABI::ArgumentRegs = {
10, 11, 12, 13, 14, 15, 16
};
void argsInit(int pageSize);
public:
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
-
virtual bool mmapGrowsDown() const override { return false; }
//FIXME RISCV needs to handle 64 bit arguments in its 32 bit ISA.
tc->setIntReg(INTREG_CANRESTORE, Canrestore);
tc->setMiscReg(MISCREG_CWP, origCWP);
}
-
-static const int FirstArgumentReg = 8;
-
-void
-SparcProcess::setSyscallReturn(ThreadContext *tc, SyscallReturn sysret)
-{
- // check for error condition. SPARC syscall convention is to
- // indicate success/failure in reg the carry bit of the ccr
- // and put the return value itself in the standard return value reg.
- PSTATE pstate = tc->readMiscRegNoEffect(MISCREG_PSTATE);
- CCR ccr = tc->readIntReg(INTREG_CCR);
- RegVal val;
- if (sysret.successful()) {
- ccr.xcc.c = ccr.icc.c = 0;
- val = sysret.returnValue();
- } else {
- ccr.xcc.c = ccr.icc.c = 1;
- val = sysret.errnoValue();
- }
- tc->setIntReg(INTREG_CCR, ccr);
- if (pstate.am)
- val = bits(val, 31, 0);
- tc->setIntReg(ReturnValueReg, val);
- if (sysret.count() > 1)
- tc->setIntReg(SyscallPseudoReturnReg, sysret.value2());
-}
Addr readSpillStart() { return spillStart; }
virtual void flushWindows(ThreadContext *tc) = 0;
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
struct SyscallABI
{
X86Process::argsInit<uint32_t>(pageSize, extraAuxvs);
}
-void
-X86Process::setSyscallReturn(ThreadContext *tc, SyscallReturn retval)
-{
- tc->setIntReg(INTREG_RAX, retval.encodedValue());
-}
-
void
X86_64Process::clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *p, RegVal flags)
SyscallDesc* getDesc(int callnum) override;
- void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) override;
void clone(ThreadContext *old_tc, ThreadContext *new_tc,
Process *process, RegVal flags) override;
DrainState drain() override;
virtual void syscall(ThreadContext *tc, Fault *fault) = 0;
- virtual void setSyscallReturn(ThreadContext *tc,
- SyscallReturn return_value) = 0;
virtual SyscallDesc *getDesc(int callnum) = 0;
inline uint64_t uid() { return _uid; }