Arm CPU halt support
PATCH 1/1 Arm CPU halt support
The attached patch implements Arm CPU suspend/halt.
Paul
=== cpu-exec.c
==================================================================
cpu-exec.c +11 -0
@@ -274,6 +274,17 @@ return EXCP_HALTED; } } +#elif defined(TARGET_ARM) +if (env1->halted) { +/* An interrupt wakes the CPU even if the I and F CPSR bits are +set. */ +if (env1->interrupt_request + & (CPU_INTERRUPT_FIQ |CPU_INTERRUPT_HARD )) { + env1->halted =0 ; + }else { +return EXCP_HALTED ; + } + }#endif cpu_single_env = env1;
=== target-arm/cpu.h
==================================================================
cpu.h +1 -1
@@ -90,7 +90,7 @@int exception_index;int interrupt_request;int user_mode_only; -uint32_t address; +int halted;/* VFP coprocessor state. */ struct {
=== target-arm/op.c
==================================================================
op.c +7 -0
@@ -878,6 +878,13 @@cpu_loop_exit (); } +void OPPROTO op_wfi(void) +{ + env->exception_index =EXCP_HLT ; + env->halted =1 ; +cpu_loop_exit (); +} +/* VFP support. We follow the convention used for VFP instrunctions: Single precition routines have a "s" suffix, double precision a "d" suffix. */
=== target-arm/translate.c
==================================================================
translate.c +9 -0
@@ -496,6 +496,15 @@if (IS_USER (s)) {return 1 ; } +if ((insn &0x0fff0fff ) ==0x0e070f90 + || (insn &0x0fff0fff ) ==0x0e070f58 ) { +/* Wait for interrupt. */ +gen_op_movl_T0_im ((long )s->pc); + gen_op_movl_reg_TN[0 ][15 ](); +gen_op_wfi (); + s->is_jmp =DISAS_JUMP ; +return 0 ; + } rd = (insn >>12 ) &0xf ;if (insn & (1 <<20 )) {gen_op_movl_T0_cp15 (insn);
Quoted 1 line · Paul Brook
The attached patch implements Arm CPU suspend/halt.
Just to confirm: the busy looping is gone with the patch applied.