x86: Flag instructions that call suspend as IsQuiesce
The o3 cpu relies upon instructions that suspend a thread context being flagged as "IsQuiesce". If they are not, unpredictable behavior can occur. This patch fixes that for the x86 ISA.
This commit is contained in:
parent
659bdc1a6b
commit
afbae1ec95
2 changed files with 5 additions and 4 deletions
|
@ -141,13 +141,13 @@
|
||||||
}}, IsNonSpeculative);
|
}}, IsNonSpeculative);
|
||||||
0x01: m5quiesce({{
|
0x01: m5quiesce({{
|
||||||
PseudoInst::quiesce(xc->tcBase());
|
PseudoInst::quiesce(xc->tcBase());
|
||||||
}}, IsNonSpeculative);
|
}}, IsNonSpeculative, IsQuiesce);
|
||||||
0x02: m5quiesceNs({{
|
0x02: m5quiesceNs({{
|
||||||
PseudoInst::quiesceNs(xc->tcBase(), Rdi);
|
PseudoInst::quiesceNs(xc->tcBase(), Rdi);
|
||||||
}}, IsNonSpeculative);
|
}}, IsNonSpeculative, IsQuiesce);
|
||||||
0x03: m5quiesceCycle({{
|
0x03: m5quiesceCycle({{
|
||||||
PseudoInst::quiesceCycles(xc->tcBase(), Rdi);
|
PseudoInst::quiesceCycles(xc->tcBase(), Rdi);
|
||||||
}}, IsNonSpeculative);
|
}}, IsNonSpeculative, IsQuiesce);
|
||||||
0x04: m5quiesceTime({{
|
0x04: m5quiesceTime({{
|
||||||
Rax = PseudoInst::quiesceTime(xc->tcBase());
|
Rax = PseudoInst::quiesceTime(xc->tcBase());
|
||||||
}}, IsNonSpeculative);
|
}}, IsNonSpeculative);
|
||||||
|
|
|
@ -63,7 +63,8 @@ output header {{
|
||||||
MicroHalt(ExtMachInst _machInst, const char * instMnem,
|
MicroHalt(ExtMachInst _machInst, const char * instMnem,
|
||||||
uint64_t setFlags) :
|
uint64_t setFlags) :
|
||||||
X86MicroopBase(_machInst, "halt", instMnem,
|
X86MicroopBase(_machInst, "halt", instMnem,
|
||||||
setFlags | (ULL(1) << StaticInst::IsNonSpeculative),
|
setFlags | (ULL(1) << StaticInst::IsNonSpeculative) |
|
||||||
|
(ULL(1) << StaticInst::IsQuiesce),
|
||||||
No_OpClass)
|
No_OpClass)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue