Hi, This is an alternative approach to fixing the hang that Emilio zeroed in on with:
https://lists.nongnu.org/archive/html/qemu-devel/2017-06/msg03224.html Instead of forcing the front-end to treat any MSRs differently we shortcut the lookup_tb_ptr by checking for icount_decr and cpu->interrupt_request conditions. Fundamentally the problem was that an interrupt was pending (interrupt_request was set) but the "msr daifclr" operations when the kernel did local_irq/fiq_enable() never got handled because the cpu_idle loop was being very efficiently chained. As a result we never got around to exiting the TCG code and calling arm_cpu_do_interrupt which would then raise the IRQ to move things on. Emilio's fix is also correct - we should exit the loop whenever the IRQ conditions may have changed. However by checking in the lookup_ptr function we avoid churn in figuring out all the other cases in the front ends. This may have a potential cost for code with lots of calculated jumps although I would argue its fairly minimal given we've already sucked up the cost of a helper function and I don't think the difference between the helper function and a full exit is that marginal. I've also included Thomas's thread fix as it has yet to be merged. I humbly submit my patches to the TCG gods to decide which is the best approach ;-) Alex Bennée (2): tcg-runtime: light re-factor of lookup_tb_ptr tcg-runtime: short-circuit lookup_tb_ptr on IRQs Thomas Huth (1): vl: Fix broken thread=xxx option of the --accel parameter tcg-runtime.c | 52 +++++++++++++++++++++++++++++++--------------------- vl.c | 13 +++++-------- 2 files changed, 36 insertions(+), 29 deletions(-) -- 2.13.0