bpf: Support new unconditional bswap instruction
The existing 'be' and 'le' insns will do conditional bswap depends on host endianness. This patch implements unconditional bswap insns. Acked-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20230728011213.3712808-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
1f1e864b65
commit
0845c3db7b
@@ -1524,6 +1524,7 @@ EXPORT_SYMBOL_GPL(__bpf_call_base);
|
||||
INSN_3(ALU64, DIV, X), \
|
||||
INSN_3(ALU64, MOD, X), \
|
||||
INSN_2(ALU64, NEG), \
|
||||
INSN_3(ALU64, END, TO_LE), \
|
||||
/* Immediate based. */ \
|
||||
INSN_3(ALU64, ADD, K), \
|
||||
INSN_3(ALU64, SUB, K), \
|
||||
@@ -1848,6 +1849,19 @@ select_insn:
|
||||
break;
|
||||
}
|
||||
CONT;
|
||||
ALU64_END_TO_LE:
|
||||
switch (IMM) {
|
||||
case 16:
|
||||
DST = (__force u16) __swab16(DST);
|
||||
break;
|
||||
case 32:
|
||||
DST = (__force u32) __swab32(DST);
|
||||
break;
|
||||
case 64:
|
||||
DST = (__force u64) __swab64(DST);
|
||||
break;
|
||||
}
|
||||
CONT;
|
||||
|
||||
/* CALL */
|
||||
JMP_CALL:
|
||||
|
||||
Reference in New Issue
Block a user