Skip to content

Commit 248b190

Browse files
peilin-yeAlexei Starovoitov
authored andcommitted
arm64: insn: Add load-acquire and store-release instructions
Add load-acquire ("load_acq", LDAR{,B,H}) and store-release ("store_rel", STLR{,B,H}) instructions. Breakdown of encoding: size L (Rs) o0 (Rt2) Rn Rt mask (0x3fdffc00): 00 111111 1 1 0 11111 1 11111 00000 00000 value, load_acq (0x08dffc00): 00 001000 1 1 0 11111 1 11111 00000 00000 value, store_rel (0x089ffc00): 00 001000 1 0 0 11111 1 11111 00000 00000 As suggested by Xu [1], include all Should-Be-One (SBO) bits ("Rs" and "Rt2" fields) in the "mask" and "value" numbers. It is worth noting that we are adding the "no offset" variant of STLR instead of the "pre-index" variant, which has a different encoding. Reference: Arm Architecture Reference Manual (ARM DDI 0487K.a, ID032224), * C6.2.161 LDAR * C6.2.353 STLR [1] https://lore.kernel.org/bpf/[email protected]/ Acked-by: Xu Kuohai <[email protected]> Signed-off-by: Peilin Ye <[email protected]> Link: https://lore.kernel.org/r/ba92057b7502ce4c9c9b03b7d637abe5e178134e.1741049567.git.yepeilin@google.com Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 4170a60 commit 248b190

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

arch/arm64/include/asm/insn.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,10 @@ enum aarch64_insn_ldst_type {
188188
AARCH64_INSN_LDST_STORE_PAIR_PRE_INDEX,
189189
AARCH64_INSN_LDST_LOAD_PAIR_POST_INDEX,
190190
AARCH64_INSN_LDST_STORE_PAIR_POST_INDEX,
191+
AARCH64_INSN_LDST_LOAD_ACQ,
191192
AARCH64_INSN_LDST_LOAD_EX,
192193
AARCH64_INSN_LDST_LOAD_ACQ_EX,
194+
AARCH64_INSN_LDST_STORE_REL,
193195
AARCH64_INSN_LDST_STORE_EX,
194196
AARCH64_INSN_LDST_STORE_REL_EX,
195197
AARCH64_INSN_LDST_SIGNED_LOAD_IMM_OFFSET,
@@ -351,6 +353,8 @@ __AARCH64_INSN_FUNCS(ldr_imm, 0x3FC00000, 0x39400000)
351353
__AARCH64_INSN_FUNCS(ldr_lit, 0xBF000000, 0x18000000)
352354
__AARCH64_INSN_FUNCS(ldrsw_lit, 0xFF000000, 0x98000000)
353355
__AARCH64_INSN_FUNCS(exclusive, 0x3F800000, 0x08000000)
356+
__AARCH64_INSN_FUNCS(load_acq, 0x3FDFFC00, 0x08DFFC00)
357+
__AARCH64_INSN_FUNCS(store_rel, 0x3FDFFC00, 0x089FFC00)
354358
__AARCH64_INSN_FUNCS(load_ex, 0x3FC00000, 0x08400000)
355359
__AARCH64_INSN_FUNCS(store_ex, 0x3FC00000, 0x08000000)
356360
__AARCH64_INSN_FUNCS(mops, 0x3B200C00, 0x19000400)
@@ -602,6 +606,10 @@ u32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1,
602606
int offset,
603607
enum aarch64_insn_variant variant,
604608
enum aarch64_insn_ldst_type type);
609+
u32 aarch64_insn_gen_load_acq_store_rel(enum aarch64_insn_register reg,
610+
enum aarch64_insn_register base,
611+
enum aarch64_insn_size_type size,
612+
enum aarch64_insn_ldst_type type);
605613
u32 aarch64_insn_gen_load_store_ex(enum aarch64_insn_register reg,
606614
enum aarch64_insn_register base,
607615
enum aarch64_insn_register state,

arch/arm64/lib/insn.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,35 @@ u32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1,
540540
offset >> shift);
541541
}
542542

543+
u32 aarch64_insn_gen_load_acq_store_rel(enum aarch64_insn_register reg,
544+
enum aarch64_insn_register base,
545+
enum aarch64_insn_size_type size,
546+
enum aarch64_insn_ldst_type type)
547+
{
548+
u32 insn;
549+
550+
switch (type) {
551+
case AARCH64_INSN_LDST_LOAD_ACQ:
552+
insn = aarch64_insn_get_load_acq_value();
553+
break;
554+
case AARCH64_INSN_LDST_STORE_REL:
555+
insn = aarch64_insn_get_store_rel_value();
556+
break;
557+
default:
558+
pr_err("%s: unknown load-acquire/store-release encoding %d\n",
559+
__func__, type);
560+
return AARCH64_BREAK_FAULT;
561+
}
562+
563+
insn = aarch64_insn_encode_ldst_size(size, insn);
564+
565+
insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn,
566+
reg);
567+
568+
return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
569+
base);
570+
}
571+
543572
u32 aarch64_insn_gen_load_store_ex(enum aarch64_insn_register reg,
544573
enum aarch64_insn_register base,
545574
enum aarch64_insn_register state,

0 commit comments

Comments
 (0)