|
From: <sv...@va...> - 2013-03-01 21:13:31
|
sewardj 2013-03-01 21:13:24 +0000 (Fri, 01 Mar 2013)
New Revision: 2688
Log:
Handle WFE and SEV, needed for spinlock hinting.
Modified files:
trunk/priv/guest_arm_toIR.c
trunk/priv/host_arm_defs.c
trunk/priv/host_arm_isel.c
Modified: trunk/priv/host_arm_defs.c (+1 -1)
===================================================================
--- trunk/priv/host_arm_defs.c 2013-02-27 22:57:17 +00:00 (rev 2687)
+++ trunk/priv/host_arm_defs.c 2013-03-01 21:13:24 +00:00 (rev 2688)
@@ -3304,7 +3304,7 @@
case Ijk_ClientReq: trcval = VEX_TRC_JMP_CLIENTREQ; break;
case Ijk_Sys_syscall: trcval = VEX_TRC_JMP_SYS_SYSCALL; break;
//case Ijk_Sys_int128: trcval = VEX_TRC_JMP_SYS_INT128; break;
- //case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break;
+ case Ijk_Yield: trcval = VEX_TRC_JMP_YIELD; break;
//case Ijk_EmWarn: trcval = VEX_TRC_JMP_EMWARN; break;
//case Ijk_MapFail: trcval = VEX_TRC_JMP_MAPFAIL; break;
case Ijk_NoDecode: trcval = VEX_TRC_JMP_NODECODE; break;
Modified: trunk/priv/host_arm_isel.c (+2 -0)
===================================================================
--- trunk/priv/host_arm_isel.c 2013-02-27 22:57:17 +00:00 (rev 2687)
+++ trunk/priv/host_arm_isel.c 2013-03-01 21:13:24 +00:00 (rev 2688)
@@ -6121,6 +6121,7 @@
case Ijk_NoRedir:
case Ijk_Sys_syscall:
case Ijk_TInval:
+ case Ijk_Yield:
{
HReg r = iselIntExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst));
addInstr(env, ARMInstr_XAssisted(r, amR15T, cc,
@@ -6212,6 +6213,7 @@
case Ijk_NoRedir:
case Ijk_Sys_syscall:
case Ijk_TInval:
+ case Ijk_Yield:
{
HReg r = iselIntExpr_R(env, next);
ARMAMode1* amR15T = ARMAMode1_RI(hregARM_R8(), offsIP);
Modified: trunk/priv/guest_arm_toIR.c (+26 -4)
===================================================================
--- trunk/priv/guest_arm_toIR.c 2013-02-27 22:57:17 +00:00 (rev 2687)
+++ trunk/priv/guest_arm_toIR.c 2013-03-01 21:13:24 +00:00 (rev 2688)
@@ -16569,10 +16569,32 @@
/* ================ 16-bit misc cases ================ */
- /* ------ NOP ------ */
- if (INSN0(15,0) == 0xBF00) {
- DIP("nop\n");
- goto decode_success;
+ switch (INSN0(15,0)) {
+ case 0xBF00:
+ /* ------ NOP ------ */
+ DIP("nop\n");
+ goto decode_success;
+ case 0xBF20:
+ /* ------ WFE ------ */
+ /* WFE gets used as a spin-loop hint. Do the usual thing,
+ which is to continue after yielding. */
+ stmt( IRStmt_Exit( unop(Iop_32to1, mkexpr(condT)),
+ Ijk_Yield,
+ IRConst_U32((guest_R15_curr_instr_notENC + 2)
+ | 1 /*CPSR.T*/),
+ OFFB_R15T ));
+ DIP("wfe\n");
+ goto decode_success;
+ case 0xBF40:
+ /* ------ SEV ------ */
+ /* Treat this as a no-op. Any matching WFEs won't really
+ cause the host CPU to snooze; they just cause V to try to
+ run some other thread for a while. So there's no point in
+ really doing anything for SEV. */
+ DIP("sev\n");
+ goto decode_success;
+ default:
+ break; /* fall through */
}
/* ----------------------------------------------------------- */
|