Add a flag to indicate an instruction triggers a syscall in SE mode.
--HG-- extra : convert_revision : 1d0b3afdd8254f5b2fb4bbff1fa4a0536f78bb06
This commit is contained in:
parent
55ade789d3
commit
4bdabe1254
6 changed files with 11 additions and 5 deletions
|
@ -714,7 +714,7 @@ decode OPCODE default Unknown::unknown() {
|
|||
}}, IsNonSpeculative);
|
||||
0x83: callsys({{
|
||||
xc->syscall(R0);
|
||||
}}, IsSerializeAfter, IsNonSpeculative);
|
||||
}}, IsSerializeAfter, IsNonSpeculative, IsSyscall);
|
||||
// Read uniq reg into ABI return value register (r0)
|
||||
0x9e: rduniq({{ R0 = Runiq; }}, IsIprAccess);
|
||||
// Write uniq reg with value from ABI arg register (r16)
|
||||
|
|
|
@ -134,7 +134,8 @@ decode OPCODE_HI default Unknown::unknown() {
|
|||
0x2: movz({{ Rd = (Rt == 0) ? Rs : Rd; }});
|
||||
0x3: movn({{ Rd = (Rt != 0) ? Rs : Rd; }});
|
||||
0x4: syscall({{ xc->syscall(R2); }},
|
||||
IsSerializeAfter, IsNonSpeculative);
|
||||
IsSerializeAfter, IsNonSpeculative,
|
||||
IsSyscall);
|
||||
0x7: sync({{ ; }}, IsMemBarrier);
|
||||
}
|
||||
|
||||
|
|
|
@ -1230,7 +1230,7 @@ decode OP default Unknown::unknown()
|
|||
DPRINTF(Sparc, "The trap number is %d\n", lTrapNum);
|
||||
fault = new TrapInstruction(lTrapNum);
|
||||
}
|
||||
}}, IsSerializeAfter, IsNonSpeculative);
|
||||
}}, IsSerializeAfter, IsNonSpeculative, IsSyscall);
|
||||
0x2: Trap::tccx({{
|
||||
if(passesCondition(Ccr<7:4>, COND2))
|
||||
{
|
||||
|
@ -1238,7 +1238,7 @@ decode OP default Unknown::unknown()
|
|||
DPRINTF(Sparc, "The trap number is %d\n", lTrapNum);
|
||||
fault = new TrapInstruction(lTrapNum);
|
||||
}
|
||||
}}, IsSerializeAfter, IsNonSpeculative);
|
||||
}}, IsSerializeAfter, IsNonSpeculative, IsSyscall);
|
||||
}
|
||||
0x3B: Nop::flush({{/*Instruction memory flush*/}}, IsWriteBarrier,
|
||||
MemWriteOp);
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
#if FULL_SYSTEM
|
||||
0x05: syscall();
|
||||
#else
|
||||
0x05: SyscallInst::syscall('xc->syscall(rax)');
|
||||
0x05: SyscallInst::syscall('xc->syscall(rax)', IsSyscall);
|
||||
#endif
|
||||
0x06: clts();
|
||||
//sandpile.org says (AMD) after sysret, so I might want to check
|
||||
|
|
|
@ -498,6 +498,7 @@ class BaseDynInst : public FastAlloc, public RefCounted
|
|||
bool isQuiesce() const { return staticInst->isQuiesce(); }
|
||||
bool isIprAccess() const { return staticInst->isIprAccess(); }
|
||||
bool isUnverifiable() const { return staticInst->isUnverifiable(); }
|
||||
bool isSyscall() const { return staticInst->isSyscall(); }
|
||||
bool isMacroop() const { return staticInst->isMacroop(); }
|
||||
bool isMicroop() const { return staticInst->isMicroop(); }
|
||||
bool isDelayedCommit() const { return staticInst->isDelayedCommit(); }
|
||||
|
|
|
@ -143,6 +143,9 @@ class StaticInstBase : public RefCounted
|
|||
IsIprAccess, ///< Accesses IPRs
|
||||
IsUnverifiable, ///< Can't be verified by a checker
|
||||
|
||||
IsSyscall, ///< Causes a system call to be emulated in syscall
|
||||
/// emulation mode.
|
||||
|
||||
//Flags for microcode
|
||||
IsMacroop, ///< Is a macroop containing microops
|
||||
IsMicroop, ///< Is a microop
|
||||
|
@ -243,6 +246,7 @@ class StaticInstBase : public RefCounted
|
|||
bool isQuiesce() const { return flags[IsQuiesce]; }
|
||||
bool isIprAccess() const { return flags[IsIprAccess]; }
|
||||
bool isUnverifiable() const { return flags[IsUnverifiable]; }
|
||||
bool isSyscall() const { return flags[IsSyscall]; }
|
||||
bool isMacroop() const { return flags[IsMacroop]; }
|
||||
bool isMicroop() const { return flags[IsMicroop]; }
|
||||
bool isDelayedCommit() const { return flags[IsDelayedCommit]; }
|
||||
|
|
Loading…
Reference in a new issue