|
@@ -186,6 +186,7 @@ int cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
|
|
|
void list_cpus(void);
|
|
|
|
|
|
#ifdef CONFIG_TCG
|
|
|
+#include "qemu/atomic.h"
|
|
|
|
|
|
bool tcg_cflags_has(CPUState *cpu, uint32_t flags);
|
|
|
void tcg_cflags_set(CPUState *cpu, uint32_t flags);
|
|
@@ -218,6 +219,23 @@ bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data);
|
|
|
*/
|
|
|
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc);
|
|
|
|
|
|
+/**
|
|
|
+ * cpu_loop_exit_requested:
|
|
|
+ * @cpu: The CPU state to be tested
|
|
|
+ *
|
|
|
+ * Indicate if somebody asked for a return of the CPU to the main loop
|
|
|
+ * (e.g., via cpu_exit() or cpu_interrupt()).
|
|
|
+ *
|
|
|
+ * This is helpful for architectures that support interruptible
|
|
|
+ * instructions. After writing back all state to registers/memory, this
|
|
|
+ * call can be used to check if it makes sense to return to the main loop
|
|
|
+ * or to continue executing the interruptible instruction.
|
|
|
+ */
|
|
|
+static inline bool cpu_loop_exit_requested(CPUState *cpu)
|
|
|
+{
|
|
|
+ return (int32_t)qatomic_read(&cpu->neg.icount_decr.u32) < 0;
|
|
|
+}
|
|
|
+
|
|
|
G_NORETURN void cpu_loop_exit_noexc(CPUState *cpu);
|
|
|
G_NORETURN void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc);
|
|
|
#endif /* CONFIG_TCG */
|