1010#include <linux/build_bug.h>
1111#include <linux/types.h>
1212
13- #include <asm/alternative .h>
13+ #include <asm/insn-def .h>
1414
1515#ifndef __ASSEMBLY__
1616/*
3030 */
3131enum aarch64_insn_encoding_class {
3232 AARCH64_INSN_CLS_UNKNOWN , /* UNALLOCATED */
33+ AARCH64_INSN_CLS_SVE , /* SVE instructions */
3334 AARCH64_INSN_CLS_DP_IMM , /* Data processing - immediate */
3435 AARCH64_INSN_CLS_DP_REG , /* Data processing - register */
3536 AARCH64_INSN_CLS_DP_FPSIMD , /* Data processing - SIMD and FP */
@@ -294,6 +295,12 @@ __AARCH64_INSN_FUNCS(adr, 0x9F000000, 0x10000000)
294295__AARCH64_INSN_FUNCS (adrp , 0x9F000000 , 0x90000000 )
295296__AARCH64_INSN_FUNCS (prfm , 0x3FC00000 , 0x39800000 )
296297__AARCH64_INSN_FUNCS (prfm_lit , 0xFF000000 , 0xD8000000 )
298+ __AARCH64_INSN_FUNCS (store_imm , 0x3FC00000 , 0x39000000 )
299+ __AARCH64_INSN_FUNCS (load_imm , 0x3FC00000 , 0x39400000 )
300+ __AARCH64_INSN_FUNCS (store_pre , 0x3FE00C00 , 0x38000C00 )
301+ __AARCH64_INSN_FUNCS (load_pre , 0x3FE00C00 , 0x38400C00 )
302+ __AARCH64_INSN_FUNCS (store_post , 0x3FE00C00 , 0x38000400 )
303+ __AARCH64_INSN_FUNCS (load_post , 0x3FE00C00 , 0x38400400 )
297304__AARCH64_INSN_FUNCS (str_reg , 0x3FE0EC00 , 0x38206800 )
298305__AARCH64_INSN_FUNCS (ldadd , 0x3F20FC00 , 0x38200000 )
299306__AARCH64_INSN_FUNCS (ldr_reg , 0x3FE0EC00 , 0x38606800 )
@@ -302,6 +309,8 @@ __AARCH64_INSN_FUNCS(ldrsw_lit, 0xFF000000, 0x98000000)
302309__AARCH64_INSN_FUNCS (exclusive , 0x3F800000 , 0x08000000 )
303310__AARCH64_INSN_FUNCS (load_ex , 0x3F400000 , 0x08400000 )
304311__AARCH64_INSN_FUNCS (store_ex , 0x3F400000 , 0x08000000 )
312+ __AARCH64_INSN_FUNCS (stp , 0x7FC00000 , 0x29000000 )
313+ __AARCH64_INSN_FUNCS (ldp , 0x7FC00000 , 0x29400000 )
305314__AARCH64_INSN_FUNCS (stp_post , 0x7FC00000 , 0x28800000 )
306315__AARCH64_INSN_FUNCS (ldp_post , 0x7FC00000 , 0x28C00000 )
307316__AARCH64_INSN_FUNCS (stp_pre , 0x7FC00000 , 0x29800000 )
@@ -334,6 +343,7 @@ __AARCH64_INSN_FUNCS(rev64, 0x7FFFFC00, 0x5AC00C00)
334343__AARCH64_INSN_FUNCS (and , 0x7F200000 , 0x0A000000 )
335344__AARCH64_INSN_FUNCS (bic , 0x7F200000 , 0x0A200000 )
336345__AARCH64_INSN_FUNCS (orr , 0x7F200000 , 0x2A000000 )
346+ __AARCH64_INSN_FUNCS (mov_reg , 0x7FE0FFE0 , 0x2A0003E0 )
337347__AARCH64_INSN_FUNCS (orn , 0x7F200000 , 0x2A200000 )
338348__AARCH64_INSN_FUNCS (eor , 0x7F200000 , 0x4A000000 )
339349__AARCH64_INSN_FUNCS (eon , 0x7F200000 , 0x4A200000 )
@@ -368,6 +378,14 @@ __AARCH64_INSN_FUNCS(eret_auth, 0xFFFFFBFF, 0xD69F0BFF)
368378__AARCH64_INSN_FUNCS (mrs , 0xFFF00000 , 0xD5300000 )
369379__AARCH64_INSN_FUNCS (msr_imm , 0xFFF8F01F , 0xD500401F )
370380__AARCH64_INSN_FUNCS (msr_reg , 0xFFF00000 , 0xD5100000 )
381+ __AARCH64_INSN_FUNCS (dmb , 0xFFFFF0FF , 0xD50330BF )
382+ __AARCH64_INSN_FUNCS (dsb_base , 0xFFFFF0FF , 0xD503309F )
383+ __AARCH64_INSN_FUNCS (dsb_nxs , 0xFFFFF3FF , 0xD503323F )
384+ __AARCH64_INSN_FUNCS (isb , 0xFFFFF0FF , 0xD50330DF )
385+ __AARCH64_INSN_FUNCS (sb , 0xFFFFFFFF , 0xD50330FF )
386+ __AARCH64_INSN_FUNCS (clrex , 0xFFFFF0FF , 0xD503305F )
387+ __AARCH64_INSN_FUNCS (ssbb , 0xFFFFFFFF , 0xD503309F )
388+ __AARCH64_INSN_FUNCS (pssbb , 0xFFFFFFFF , 0xD503349F )
371389
372390#undef __AARCH64_INSN_FUNCS
373391
@@ -379,8 +397,47 @@ static inline bool aarch64_insn_is_adr_adrp(u32 insn)
379397 return aarch64_insn_is_adr (insn ) || aarch64_insn_is_adrp (insn );
380398}
381399
382- int aarch64_insn_read (void * addr , u32 * insnp );
383- int aarch64_insn_write (void * addr , u32 insn );
400+ static inline bool aarch64_insn_is_dsb (u32 insn )
401+ {
402+ return aarch64_insn_is_dsb_base (insn ) || aarch64_insn_is_dsb_nxs (insn );
403+ }
404+
405+ static inline bool aarch64_insn_is_barrier (u32 insn )
406+ {
407+ return aarch64_insn_is_dmb (insn ) || aarch64_insn_is_dsb (insn ) ||
408+ aarch64_insn_is_isb (insn ) || aarch64_insn_is_sb (insn ) ||
409+ aarch64_insn_is_clrex (insn ) || aarch64_insn_is_ssbb (insn ) ||
410+ aarch64_insn_is_pssbb (insn );
411+ }
412+
413+ static inline bool aarch64_insn_is_store_single (u32 insn )
414+ {
415+ return aarch64_insn_is_store_imm (insn ) ||
416+ aarch64_insn_is_store_pre (insn ) ||
417+ aarch64_insn_is_store_post (insn );
418+ }
419+
420+ static inline bool aarch64_insn_is_store_pair (u32 insn )
421+ {
422+ return aarch64_insn_is_stp (insn ) ||
423+ aarch64_insn_is_stp_pre (insn ) ||
424+ aarch64_insn_is_stp_post (insn );
425+ }
426+
427+ static inline bool aarch64_insn_is_load_single (u32 insn )
428+ {
429+ return aarch64_insn_is_load_imm (insn ) ||
430+ aarch64_insn_is_load_pre (insn ) ||
431+ aarch64_insn_is_load_post (insn );
432+ }
433+
434+ static inline bool aarch64_insn_is_load_pair (u32 insn )
435+ {
436+ return aarch64_insn_is_ldp (insn ) ||
437+ aarch64_insn_is_ldp_pre (insn ) ||
438+ aarch64_insn_is_ldp_post (insn );
439+ }
440+
384441enum aarch64_insn_encoding_class aarch64_get_insn_class (u32 insn );
385442bool aarch64_insn_uses_literal (u32 insn );
386443bool aarch64_insn_is_branch (u32 insn );
@@ -487,9 +544,6 @@ u32 aarch64_insn_gen_prefetch(enum aarch64_insn_register base,
487544s32 aarch64_get_branch_offset (u32 insn );
488545u32 aarch64_set_branch_offset (u32 insn , s32 offset );
489546
490- int aarch64_insn_patch_text_nosync (void * addr , u32 insn );
491- int aarch64_insn_patch_text (void * addrs [], u32 insns [], int cnt );
492-
493547s32 aarch64_insn_adrp_get_offset (u32 insn );
494548u32 aarch64_insn_adrp_set_offset (u32 insn , s32 offset );
495549
@@ -506,6 +560,7 @@ u32 aarch32_insn_mcr_extract_crm(u32 insn);
506560
507561typedef bool (pstate_check_t )(unsigned long );
508562extern pstate_check_t * const aarch32_opcode_cond_checks [16 ];
563+
509564#endif /* __ASSEMBLY__ */
510565
511566#endif /* __ASM_INSN_H */
0 commit comments