Skip to content

Commit 9b948e7

Browse files
mrutland-armwilldeacon
authored andcommitted
arm64: insn: always inline predicates
We have a number of aarch64_insn_*() predicates which are used in code which is not instrumentation safe (e.g. alternatives patching, kprobes). Some of those are marked with __kprobes, but most are not, and are implemented out-of-line in insn.c. This patch moves the predicates to insn.h and marks them with __always_inline. This is ensures that they will respect the instrumentation requirements of their caller which they will be inlined into. At the same time, I've formatted each of the functions consistently as a list, to make them easier to read and update in future. Other than preventing unwanted instrumentation, there should be no functional change as a result of this patch. Signed-off-by: Mark Rutland <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Joey Gouly <[email protected]> Cc: Will Deacon <[email protected]> Reviewed-by: Joey Gouly <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Will Deacon <[email protected]>
1 parent 1b6bf2d commit 9b948e7

File tree

2 files changed

+80
-77
lines changed

2 files changed

+80
-77
lines changed

arch/arm64/include/asm/insn.h

Lines changed: 80 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -431,58 +431,122 @@ __AARCH64_INSN_FUNCS(pssbb, 0xFFFFFFFF, 0xD503349F)
431431

432432
#undef __AARCH64_INSN_FUNCS
433433

434-
bool aarch64_insn_is_steppable_hint(u32 insn);
435-
bool aarch64_insn_is_branch_imm(u32 insn);
434+
static __always_inline bool aarch64_insn_is_steppable_hint(u32 insn)
435+
{
436+
if (!aarch64_insn_is_hint(insn))
437+
return false;
438+
439+
switch (insn & 0xFE0) {
440+
case AARCH64_INSN_HINT_XPACLRI:
441+
case AARCH64_INSN_HINT_PACIA_1716:
442+
case AARCH64_INSN_HINT_PACIB_1716:
443+
case AARCH64_INSN_HINT_PACIAZ:
444+
case AARCH64_INSN_HINT_PACIASP:
445+
case AARCH64_INSN_HINT_PACIBZ:
446+
case AARCH64_INSN_HINT_PACIBSP:
447+
case AARCH64_INSN_HINT_BTI:
448+
case AARCH64_INSN_HINT_BTIC:
449+
case AARCH64_INSN_HINT_BTIJ:
450+
case AARCH64_INSN_HINT_BTIJC:
451+
case AARCH64_INSN_HINT_NOP:
452+
return true;
453+
default:
454+
return false;
455+
}
456+
}
457+
458+
static __always_inline bool aarch64_insn_is_branch(u32 insn)
459+
{
460+
/* b, bl, cb*, tb*, ret*, b.cond, br*, blr* */
461+
462+
return aarch64_insn_is_b(insn) ||
463+
aarch64_insn_is_bl(insn) ||
464+
aarch64_insn_is_cbz(insn) ||
465+
aarch64_insn_is_cbnz(insn) ||
466+
aarch64_insn_is_tbz(insn) ||
467+
aarch64_insn_is_tbnz(insn) ||
468+
aarch64_insn_is_ret(insn) ||
469+
aarch64_insn_is_ret_auth(insn) ||
470+
aarch64_insn_is_br(insn) ||
471+
aarch64_insn_is_br_auth(insn) ||
472+
aarch64_insn_is_blr(insn) ||
473+
aarch64_insn_is_blr_auth(insn) ||
474+
aarch64_insn_is_bcond(insn);
475+
}
476+
477+
static __always_inline bool aarch64_insn_is_branch_imm(u32 insn)
478+
{
479+
return aarch64_insn_is_b(insn) ||
480+
aarch64_insn_is_bl(insn) ||
481+
aarch64_insn_is_tbz(insn) ||
482+
aarch64_insn_is_tbnz(insn) ||
483+
aarch64_insn_is_cbz(insn) ||
484+
aarch64_insn_is_cbnz(insn) ||
485+
aarch64_insn_is_bcond(insn);
486+
}
436487

437-
static inline bool aarch64_insn_is_adr_adrp(u32 insn)
488+
static __always_inline bool aarch64_insn_is_adr_adrp(u32 insn)
438489
{
439-
return aarch64_insn_is_adr(insn) || aarch64_insn_is_adrp(insn);
490+
return aarch64_insn_is_adr(insn) ||
491+
aarch64_insn_is_adrp(insn);
440492
}
441493

442-
static inline bool aarch64_insn_is_dsb(u32 insn)
494+
static __always_inline bool aarch64_insn_is_dsb(u32 insn)
443495
{
444-
return aarch64_insn_is_dsb_base(insn) || aarch64_insn_is_dsb_nxs(insn);
496+
return aarch64_insn_is_dsb_base(insn) ||
497+
aarch64_insn_is_dsb_nxs(insn);
445498
}
446499

447-
static inline bool aarch64_insn_is_barrier(u32 insn)
500+
static __always_inline bool aarch64_insn_is_barrier(u32 insn)
448501
{
449-
return aarch64_insn_is_dmb(insn) || aarch64_insn_is_dsb(insn) ||
450-
aarch64_insn_is_isb(insn) || aarch64_insn_is_sb(insn) ||
451-
aarch64_insn_is_clrex(insn) || aarch64_insn_is_ssbb(insn) ||
502+
return aarch64_insn_is_dmb(insn) ||
503+
aarch64_insn_is_dsb(insn) ||
504+
aarch64_insn_is_isb(insn) ||
505+
aarch64_insn_is_sb(insn) ||
506+
aarch64_insn_is_clrex(insn) ||
507+
aarch64_insn_is_ssbb(insn) ||
452508
aarch64_insn_is_pssbb(insn);
453509
}
454510

455-
static inline bool aarch64_insn_is_store_single(u32 insn)
511+
static __always_inline bool aarch64_insn_is_store_single(u32 insn)
456512
{
457513
return aarch64_insn_is_store_imm(insn) ||
458514
aarch64_insn_is_store_pre(insn) ||
459515
aarch64_insn_is_store_post(insn);
460516
}
461517

462-
static inline bool aarch64_insn_is_store_pair(u32 insn)
518+
static __always_inline bool aarch64_insn_is_store_pair(u32 insn)
463519
{
464520
return aarch64_insn_is_stp(insn) ||
465521
aarch64_insn_is_stp_pre(insn) ||
466522
aarch64_insn_is_stp_post(insn);
467523
}
468524

469-
static inline bool aarch64_insn_is_load_single(u32 insn)
525+
static __always_inline bool aarch64_insn_is_load_single(u32 insn)
470526
{
471527
return aarch64_insn_is_load_imm(insn) ||
472528
aarch64_insn_is_load_pre(insn) ||
473529
aarch64_insn_is_load_post(insn);
474530
}
475531

476-
static inline bool aarch64_insn_is_load_pair(u32 insn)
532+
static __always_inline bool aarch64_insn_is_load_pair(u32 insn)
477533
{
478534
return aarch64_insn_is_ldp(insn) ||
479535
aarch64_insn_is_ldp_pre(insn) ||
480536
aarch64_insn_is_ldp_post(insn);
481537
}
482538

539+
static __always_inline bool aarch64_insn_uses_literal(u32 insn)
540+
{
541+
/* ldr/ldrsw (literal), prfm */
542+
543+
return aarch64_insn_is_ldr_lit(insn) ||
544+
aarch64_insn_is_ldrsw_lit(insn) ||
545+
aarch64_insn_is_adr_adrp(insn) ||
546+
aarch64_insn_is_prfm_lit(insn);
547+
}
548+
483549
enum aarch64_insn_encoding_class aarch64_get_insn_class(u32 insn);
484-
bool aarch64_insn_uses_literal(u32 insn);
485-
bool aarch64_insn_is_branch(u32 insn);
486550
u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn);
487551
u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
488552
u32 insn, u64 imm);

arch/arm64/lib/insn.c

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -44,67 +44,6 @@ enum aarch64_insn_encoding_class __kprobes aarch64_get_insn_class(u32 insn)
4444
return aarch64_insn_encoding_class[(insn >> 25) & 0xf];
4545
}
4646

47-
bool __kprobes aarch64_insn_is_steppable_hint(u32 insn)
48-
{
49-
if (!aarch64_insn_is_hint(insn))
50-
return false;
51-
52-
switch (insn & 0xFE0) {
53-
case AARCH64_INSN_HINT_XPACLRI:
54-
case AARCH64_INSN_HINT_PACIA_1716:
55-
case AARCH64_INSN_HINT_PACIB_1716:
56-
case AARCH64_INSN_HINT_PACIAZ:
57-
case AARCH64_INSN_HINT_PACIASP:
58-
case AARCH64_INSN_HINT_PACIBZ:
59-
case AARCH64_INSN_HINT_PACIBSP:
60-
case AARCH64_INSN_HINT_BTI:
61-
case AARCH64_INSN_HINT_BTIC:
62-
case AARCH64_INSN_HINT_BTIJ:
63-
case AARCH64_INSN_HINT_BTIJC:
64-
case AARCH64_INSN_HINT_NOP:
65-
return true;
66-
default:
67-
return false;
68-
}
69-
}
70-
71-
bool aarch64_insn_is_branch_imm(u32 insn)
72-
{
73-
return (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn) ||
74-
aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn) ||
75-
aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) ||
76-
aarch64_insn_is_bcond(insn));
77-
}
78-
79-
bool __kprobes aarch64_insn_uses_literal(u32 insn)
80-
{
81-
/* ldr/ldrsw (literal), prfm */
82-
83-
return aarch64_insn_is_ldr_lit(insn) ||
84-
aarch64_insn_is_ldrsw_lit(insn) ||
85-
aarch64_insn_is_adr_adrp(insn) ||
86-
aarch64_insn_is_prfm_lit(insn);
87-
}
88-
89-
bool __kprobes aarch64_insn_is_branch(u32 insn)
90-
{
91-
/* b, bl, cb*, tb*, ret*, b.cond, br*, blr* */
92-
93-
return aarch64_insn_is_b(insn) ||
94-
aarch64_insn_is_bl(insn) ||
95-
aarch64_insn_is_cbz(insn) ||
96-
aarch64_insn_is_cbnz(insn) ||
97-
aarch64_insn_is_tbz(insn) ||
98-
aarch64_insn_is_tbnz(insn) ||
99-
aarch64_insn_is_ret(insn) ||
100-
aarch64_insn_is_ret_auth(insn) ||
101-
aarch64_insn_is_br(insn) ||
102-
aarch64_insn_is_br_auth(insn) ||
103-
aarch64_insn_is_blr(insn) ||
104-
aarch64_insn_is_blr_auth(insn) ||
105-
aarch64_insn_is_bcond(insn);
106-
}
107-
10847
static int __kprobes aarch64_get_imm_shift_mask(enum aarch64_insn_imm_type type,
10948
u32 *maskp, int *shiftp)
11049
{

0 commit comments

Comments
 (0)