Skip to content

Commit e4d9e6b

Browse files
Julien Thierrygregkh
authored andcommitted
arm64: insn: Add barrier encodings
[ Upstream commit d4b2173 ] Create necessary functions to encode/decode aarch64 barrier instructions. DSB needs special case handling as it has multiple encodings. Signed-off-by: Julien Thierry <[email protected]> Link: https://lore.kernel.org/r/[email protected] [will: Don't reject DSB #4] Signed-off-by: Will Deacon <[email protected]> Signed-off-by: Pu Lehui <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 9c839c6 commit e4d9e6b

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

arch/arm64/include/asm/insn.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ __AARCH64_INSN_FUNCS(eret_auth, 0xFFFFFBFF, 0xD69F0BFF)
370370
__AARCH64_INSN_FUNCS(mrs, 0xFFF00000, 0xD5300000)
371371
__AARCH64_INSN_FUNCS(msr_imm, 0xFFF8F01F, 0xD500401F)
372372
__AARCH64_INSN_FUNCS(msr_reg, 0xFFF00000, 0xD5100000)
373+
__AARCH64_INSN_FUNCS(dmb, 0xFFFFF0FF, 0xD50330BF)
374+
__AARCH64_INSN_FUNCS(dsb_base, 0xFFFFF0FF, 0xD503309F)
375+
__AARCH64_INSN_FUNCS(dsb_nxs, 0xFFFFF3FF, 0xD503323F)
376+
__AARCH64_INSN_FUNCS(isb, 0xFFFFF0FF, 0xD50330DF)
377+
__AARCH64_INSN_FUNCS(sb, 0xFFFFFFFF, 0xD50330FF)
378+
__AARCH64_INSN_FUNCS(clrex, 0xFFFFF0FF, 0xD503305F)
379+
__AARCH64_INSN_FUNCS(ssbb, 0xFFFFFFFF, 0xD503309F)
380+
__AARCH64_INSN_FUNCS(pssbb, 0xFFFFFFFF, 0xD503349F)
373381

374382
#undef __AARCH64_INSN_FUNCS
375383

@@ -381,6 +389,19 @@ static inline bool aarch64_insn_is_adr_adrp(u32 insn)
381389
return aarch64_insn_is_adr(insn) || aarch64_insn_is_adrp(insn);
382390
}
383391

392+
static inline bool aarch64_insn_is_dsb(u32 insn)
393+
{
394+
return aarch64_insn_is_dsb_base(insn) || aarch64_insn_is_dsb_nxs(insn);
395+
}
396+
397+
static inline bool aarch64_insn_is_barrier(u32 insn)
398+
{
399+
return aarch64_insn_is_dmb(insn) || aarch64_insn_is_dsb(insn) ||
400+
aarch64_insn_is_isb(insn) || aarch64_insn_is_sb(insn) ||
401+
aarch64_insn_is_clrex(insn) || aarch64_insn_is_ssbb(insn) ||
402+
aarch64_insn_is_pssbb(insn);
403+
}
404+
384405
int aarch64_insn_read(void *addr, u32 *insnp);
385406
int aarch64_insn_write(void *addr, u32 insn);
386407
enum aarch64_insn_encoding_class aarch64_get_insn_class(u32 insn);

0 commit comments

Comments
 (0)