/* main */ int main(int argc, char * argv[]) { int ret = 0; (void) argc; ret |= _rt(argv[0]); return (ret == 0) ? 0 : 2; }
void armv7a::arm_strex(armv7a_ir& inst) { inst.print_inst("arm_strex"); inst.check(27, 20, B(0001 1000)); inst.check(11, 4, B(1111 1001)); if(rf.condition_passed(inst.cond())) { uint32_t rn = inst(19, 16); uint32_t rd = inst(15, 12); uint32_t rt = inst(3, 0); uint32_t d = rd; uint32_t t = rt; uint32_t n = rn; uint32_t imm32 = 0; if((d == 15) || (t == 15) || (n == 15)) { printb(d_inst, "arm_strex error"); } if((d == n) || (d == t)) { printb(d_inst, "arm_strex error 2"); } //ESO null_check_if_thumbee(n); uint32_t address = rf.r_read(n) + imm32; if(exclusive_monitor_pass(address, 4)) { bits _rt(rf.r_read(t), 32); if(! mem_a_write(address, 4, _rt)) { return; } rf.r_write(d, 0); } else { rf.r_write(d, 1); } } }
result_t Lock::acquire(bool blocking, bool &retVal) { if (!blocking) { retVal = m_lock.trylock(); return 0; } if (!m_lock.trylock()) { Isolate::rt _rt(holder()); m_lock.lock(); } retVal = true; return 0; }