On 17/12/19 10:51, Alex Bennée wrote: >>> Secondly if the vCPU is paused (via console or gdbstub) we need to >>> unwind from our blocking position and be in a position to restart >>> cleanly. >> Perhaps if fifo8_is_empty(&c->fifo) the CPU could update the PC back to >> the SVC instruction and enter a halted state? Perhaps with a new >> CPU_INTERRUPT_* flag that would be checked in arm_cpu_has_work. > I don't think the PC has been updated at this point - but we don't want > that logic in the common semihosting code. If we cpu_loop_exit the > exception is still in effect and will re-run when we start again.
So that would work? cpu_loop_exit if the FIFO is empty, reentering via cpu_interrupt and clearing the interrupt signal in do_arm_semihosting. > What we really want to do is fall back to the same halting semantics > that leave us in qemu_wait_io_event until there is something to process. > Is there any particular reason a blocking semihosting event isn't like > any other IO event? The "io" in wait_io_event really stands for "iothread". Usually in system emulation "waiting for I/O events" means "waiting for an interrupt" with a halt instruction (for ARM, WFE/WFI), hence my suggestion. Thanks, Paolo