Update MIPS ISA description to work with new write result interface
for store conditional. --HG-- extra : convert_revision : 73efd2ca17994e0e19c08746441874a2ac8183af
This commit is contained in:
parent
ca5cd68df4
commit
f55fd68f88
3 changed files with 74 additions and 4 deletions
|
@ -1093,6 +1093,9 @@ decode OPCODE_HI default Unknown::unknown() {
|
||||||
0x0: StoreCond::sc({{ Mem.uw = Rt.uw;}},
|
0x0: StoreCond::sc({{ Mem.uw = Rt.uw;}},
|
||||||
{{ uint64_t tmp = write_result;
|
{{ uint64_t tmp = write_result;
|
||||||
Rt.uw = (tmp == 0 || tmp == 1) ? tmp : Rt.uw;
|
Rt.uw = (tmp == 0 || tmp == 1) ? tmp : Rt.uw;
|
||||||
|
if (tmp == 1) {
|
||||||
|
xc->setStCondFailures(0);
|
||||||
|
}
|
||||||
}}, mem_flags=LOCKED, inst_flags = IsStoreConditional);
|
}}, mem_flags=LOCKED, inst_flags = IsStoreConditional);
|
||||||
|
|
||||||
format StoreMemory {
|
format StoreMemory {
|
||||||
|
|
|
@ -319,6 +319,41 @@ def template LoadCompleteAcc {{
|
||||||
|
|
||||||
|
|
||||||
def template StoreMemAccExecute {{
|
def template StoreMemAccExecute {{
|
||||||
|
Fault
|
||||||
|
%(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
|
||||||
|
Trace::InstRecord *traceData) const
|
||||||
|
{
|
||||||
|
Addr EA;
|
||||||
|
Fault fault = NoFault;
|
||||||
|
|
||||||
|
%(fp_enable_check)s;
|
||||||
|
%(op_decl)s;
|
||||||
|
%(op_rd)s;
|
||||||
|
EA = xc->getEA();
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(memacc_code)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
|
||||||
|
memAccessFlags, NULL);
|
||||||
|
if (traceData) { traceData->setData(Mem); }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(postacc_code)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(op_wb)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fault;
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
|
||||||
|
def template StoreCondMemAccExecute {{
|
||||||
Fault
|
Fault
|
||||||
%(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
|
%(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,
|
||||||
Trace::InstRecord *traceData) const
|
Trace::InstRecord *traceData) const
|
||||||
|
@ -356,6 +391,40 @@ def template StoreMemAccExecute {{
|
||||||
|
|
||||||
|
|
||||||
def template StoreExecute {{
|
def template StoreExecute {{
|
||||||
|
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
|
||||||
|
Trace::InstRecord *traceData) const
|
||||||
|
{
|
||||||
|
Addr EA;
|
||||||
|
Fault fault = NoFault;
|
||||||
|
|
||||||
|
%(fp_enable_check)s;
|
||||||
|
%(op_decl)s;
|
||||||
|
%(op_rd)s;
|
||||||
|
%(ea_code)s;
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(memacc_code)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
|
||||||
|
memAccessFlags, NULL);
|
||||||
|
if (traceData) { traceData->setData(Mem); }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(postacc_code)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fault == NoFault) {
|
||||||
|
%(op_wb)s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fault;
|
||||||
|
}
|
||||||
|
}};
|
||||||
|
|
||||||
|
def template StoreCondExecute {{
|
||||||
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
|
Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
|
||||||
Trace::InstRecord *traceData) const
|
Trace::InstRecord *traceData) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,10 +66,8 @@ def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
|
||||||
|
|
||||||
# select templates
|
# select templates
|
||||||
|
|
||||||
# define aliases... most StoreCond templates are the same as the
|
# The InitiateAcc template is the same for StoreCond templates as the
|
||||||
# corresponding Store templates (only CompleteAcc is different).
|
# corresponding Store template..
|
||||||
StoreCondMemAccExecute = StoreMemAccExecute
|
|
||||||
StoreCondExecute = StoreExecute
|
|
||||||
StoreCondInitiateAcc = StoreInitiateAcc
|
StoreCondInitiateAcc = StoreInitiateAcc
|
||||||
|
|
||||||
memAccExecTemplate = eval(exec_template_base + 'MemAccExecute')
|
memAccExecTemplate = eval(exec_template_base + 'MemAccExecute')
|
||||||
|
|
Loading…
Reference in a new issue