On 1/26/24 02:28, Brian Cain wrote:
static void do_hwlock(CPUHexagonState *env, bool *lock)
{
bql_lock();
if (*lock) {
env->hwlock_pending = true;
cs->halted = true;
cs->exception_index = EXCP_HALTED;
bql_unlock();
cpu_loop_exit(cs);
In place of the above - we have cpu_interrupt(cs, CPU_INTERRUPT_HALT) -- but is
that equivalent?
No, it is not. Raising an interrupt will not take effect immediately.
Is there one idiom that's preferred over another? Somehow it seems simpler if
we don't need to longjmp and IIRC some of these patterns do.
You need the longjmp to halt and stop execution without completing the current insn, so
that the insn can be restarted later.
Oh! Just remembered. You'll want cpu_loop_exit_restore() there, so that pc is updated
properly. Better to unwind in the contended case than require the pc be updated along the
fast path uncontended case.
r~