mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-22 14:31:12 +00:00
target/arm: Convert Clear-Exclusive, Barriers
Backports commit 519b84711ea36bb8a339096e207b6b9b65cd2051 from qemu
This commit is contained in:
parent
eff475c9a9
commit
15558cfa7e
|
@ -22,6 +22,7 @@
|
|||
# All of those that have a COND field in insn[31:28] are in a32.decode
|
||||
#
|
||||
|
||||
&empty !extern
|
||||
&i !extern imm
|
||||
|
||||
# Branch with Link and Exchange
|
||||
|
@ -37,3 +38,12 @@ BLX_i 1111 101 . ........................ &i imm=%imm24h
|
|||
|
||||
RFE 1111 100 pu:2 0 w:1 1 rn:4 0000 1010 0000 0000 &rfe
|
||||
SRS 1111 100 pu:2 1 w:1 0 1101 0000 0101 000 mode:5 &srs
|
||||
|
||||
# Clear-Exclusive, Barriers
|
||||
|
||||
# QEMU does not require the option field for the barriers.
|
||||
CLREX 1111 0101 0111 1111 1111 0000 0001 1111
|
||||
DSB 1111 0101 0111 1111 1111 0000 0100 ----
|
||||
DMB 1111 0101 0111 1111 1111 0000 0101 ----
|
||||
ISB 1111 0101 0111 1111 1111 0000 0110 ----
|
||||
SB 1111 0101 0111 1111 1111 0000 0111 0000
|
||||
|
|
|
@ -305,6 +305,16 @@ CLZ 1111 1010 1011 ---- 1111 .... 1000 .... @rdm
|
|||
# of the space is "reserved hint, behaves as nop".
|
||||
NOP 1111 0011 1010 1111 1000 0000 ---- ----
|
||||
}
|
||||
|
||||
# Miscellaneous control
|
||||
{
|
||||
CLREX 1111 0011 1011 1111 1000 1111 0010 1111
|
||||
DSB 1111 0011 1011 1111 1000 1111 0100 ----
|
||||
DMB 1111 0011 1011 1111 1000 1111 0101 ----
|
||||
ISB 1111 0011 1011 1111 1000 1111 0110 ----
|
||||
SB 1111 0011 1011 1111 1000 1111 0111 0000
|
||||
}
|
||||
|
||||
# Note that the v7m insn overlaps both the normal and banked insn.
|
||||
{
|
||||
MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \
|
||||
|
|
|
@ -10482,6 +10482,65 @@ static bool trans_SRS(DisasContext *s, arg_SRS *a)
|
|||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear-Exclusive, Barriers
|
||||
*/
|
||||
|
||||
static bool trans_CLREX(DisasContext *s, arg_CLREX *a)
|
||||
{
|
||||
if (s->thumb
|
||||
? !ENABLE_ARCH_7 && !arm_dc_feature(s, ARM_FEATURE_M)
|
||||
: !ENABLE_ARCH_6K) {
|
||||
return false;
|
||||
}
|
||||
gen_clrex(s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_DSB(DisasContext *s, arg_DSB *a)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
if (!ENABLE_ARCH_7 && !arm_dc_feature(s, ARM_FEATURE_M)) {
|
||||
return false;
|
||||
}
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_DMB(DisasContext *s, arg_DMB *a)
|
||||
{
|
||||
return trans_DSB(s, NULL);
|
||||
}
|
||||
|
||||
static bool trans_ISB(DisasContext *s, arg_ISB *a)
|
||||
{
|
||||
if (!ENABLE_ARCH_7 && !arm_dc_feature(s, ARM_FEATURE_M)) {
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* We need to break the TB after this insn to execute
|
||||
* self-modifying code correctly and also to take
|
||||
* any pending interrupts immediately.
|
||||
*/
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_SB(DisasContext *s, arg_SB *a)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
if (!dc_isar_feature(aa32_sb, s)) {
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* TODO: There is no speculation barrier opcode
|
||||
* for TCG; MB and end the TB instead.
|
||||
*/
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Legacy decoder.
|
||||
*/
|
||||
|
@ -10584,38 +10643,6 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
|
|||
s->base.is_jmp = DISAS_UPDATE;
|
||||
}
|
||||
return;
|
||||
} else if ((insn & 0x0fffff00) == 0x057ff000) {
|
||||
switch ((insn >> 4) & 0xf) {
|
||||
case 1: /* clrex */
|
||||
ARCH(6K);
|
||||
gen_clrex(s);
|
||||
return;
|
||||
case 4: /* dsb */
|
||||
case 5: /* dmb */
|
||||
ARCH(7);
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
return;
|
||||
case 6: /* isb */
|
||||
/* We need to break the TB after this insn to execute
|
||||
* self-modifying code correctly and also to take
|
||||
* any pending interrupts immediately.
|
||||
*/
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
return;
|
||||
case 7: /* sb */
|
||||
if ((insn & 0xf) || !dc_isar_feature(aa32_sb, s)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
/*
|
||||
* TODO: There is no speculation barrier opcode
|
||||
* for TCG; MB and end the TB instead.
|
||||
*/
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
return;
|
||||
default:
|
||||
goto illegal_op;
|
||||
}
|
||||
} else if ((insn & 0x0e000f00) == 0x0c000100) {
|
||||
if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
|
||||
/* iWMMXt register transfer. */
|
||||
|
@ -11080,43 +11107,7 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
|
|||
gen_set_psr_im(s, offset, 0, imm);
|
||||
}
|
||||
break;
|
||||
case 3: /* Special control operations. */
|
||||
if (!arm_dc_feature(s, ARM_FEATURE_V7) &&
|
||||
!arm_dc_feature(s, ARM_FEATURE_M)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
op = (insn >> 4) & 0xf;
|
||||
switch (op) {
|
||||
case 2: /* clrex */
|
||||
gen_clrex(s);
|
||||
break;
|
||||
case 4: /* dsb */
|
||||
case 5: /* dmb */
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
break;
|
||||
case 6: /* isb */
|
||||
/* We need to break the TB after this insn
|
||||
* to execute self-modifying code correctly
|
||||
* and also to take any pending interrupts
|
||||
* immediately.
|
||||
*/
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
break;
|
||||
case 7: /* sb */
|
||||
if ((insn & 0xf) || !dc_isar_feature(aa32_sb, s)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
/*
|
||||
* TODO: There is no speculation barrier opcode
|
||||
* for TCG; MB and end the TB instead.
|
||||
*/
|
||||
tcg_gen_mb(tcg_ctx, TCG_MO_ALL | TCG_BAR_SC);
|
||||
gen_goto_tb(s, 0, s->base.pc_next);
|
||||
break;
|
||||
default:
|
||||
goto illegal_op;
|
||||
}
|
||||
break;
|
||||
case 3: /* Special control operations, in decodetree */
|
||||
case 4: /* bxj, in decodetree */
|
||||
goto illegal_op;
|
||||
case 5: /* Exception return. */
|
||||
|
|
Loading…
Reference in a new issue