mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-26 18:05:55 +08:00
Merge remote-tracking branch
'origin/GP-6182_ghidorahrex_PR-8721_niooss-ledger_ebpf-fix-disassembly-atomic-instructions' into patch (Closes #8721)
This commit is contained in:
@@ -272,38 +272,38 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
# BPF_ADD:
|
||||
|
||||
# BPF_STX | BPF_ATOMIC | BPF_W
|
||||
:STXXADDW [dst + off], src is imm=0x0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) + src:4; }
|
||||
:AADD32 [dst + off], src is imm=0x0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) + src:4; }
|
||||
|
||||
# BPF_STX | BPF_ATOMIC | BPF_DW
|
||||
:STXXADDDW [dst + off], src is imm=0x0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) + src; }
|
||||
:AADD [dst + off], src is imm=0x0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) + src; }
|
||||
|
||||
# BPF_OR:
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0x40 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) | src:4; }
|
||||
:AOR32 [dst + off], src is imm=0x40 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) | src:4; }
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0x40 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) | src; }
|
||||
:AOR [dst + off], src is imm=0x40 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) | src; }
|
||||
|
||||
# BPF_AND:
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0x50 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) & src:4; }
|
||||
:AAND32 [dst + off], src is imm=0x50 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) & src:4; }
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0x50 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) & src; }
|
||||
:AAND [dst + off], src is imm=0x50 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) & src; }
|
||||
|
||||
# BPF_XOR:
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0xa0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) ^ src:4; }
|
||||
:AXOR32 [dst + off], src is imm=0xa0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 { *:4 (dst + off) = *:4 (dst + off) ^ src:4; }
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0xa0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) ^ src; }
|
||||
:AXOR [dst + off], src is imm=0xa0 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 { *:8 (dst + off) = *:8 (dst + off) ^ src; }
|
||||
|
||||
# BPF_ADD | BPF_FETCH -> src = atomic_fetch_add(dst + off, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0x1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:AFADD32 [dst + off], src is imm=0x1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
*:4 (dst + off) = *:4 (dst + off) + src:4;
|
||||
src = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0x1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:AFADD [dst + off], src is imm=0x1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
*:8 (dst + off) = *:8 (dst + off) + src;
|
||||
src = tmp;
|
||||
@@ -311,13 +311,13 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
|
||||
# BPF_OR | BPF_FETCH -> src = atomic_fetch_or(dst + off, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0x41 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:AFOR32 [dst + off], src is imm=0x41 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
*:4 (dst + off) = *:4 (dst + off) | src:4;
|
||||
src = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0x41 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:AFOR [dst + off], src is imm=0x41 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
*:8 (dst + off) = *:8 (dst + off) | src;
|
||||
src = tmp;
|
||||
@@ -325,13 +325,13 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
|
||||
# BPF_AND | BPF_FETCH -> src = atomic_fetch_and(dst + off, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0x51 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:AFAND32 [dst + off], src is imm=0x51 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
*:4 (dst + off) = *:4 (dst + off) & src:4;
|
||||
src = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0x51 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:AFAND [dst + off], src is imm=0x51 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
*:8 (dst + off) = *:8 (dst + off) & src;
|
||||
src = tmp;
|
||||
@@ -339,13 +339,13 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
|
||||
# BPF_XOR | BPF_FETCH -> src = atomic_fetch_xor(dst + off, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0xa1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:AFXOR32 [dst + off], src is imm=0xa1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
*:4 (dst + off) = *:4 (dst + off) ^ src:4;
|
||||
src = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0xa1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:AFXOR [dst + off], src is imm=0xa1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
*:8 (dst + off) = *:8 (dst + off) ^ src;
|
||||
src = tmp;
|
||||
@@ -353,13 +353,13 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
|
||||
# BPF_XCHG -> src_reg = atomic_xchg(dst + off, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0xe1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:AXCHG32 [dst + off], src is imm=0xe1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
*:4 (dst + off) = src:4;
|
||||
src = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0xe1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:AXCHG [dst + off], src is imm=0xe1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
*:8 (dst + off) = src;
|
||||
src = tmp;
|
||||
@@ -367,20 +367,21 @@ DST4: dst is dst { local tmp:4 = dst:4; export tmp; }
|
||||
|
||||
# BPF_CMPXCHG -> R0 = atomic_cmpxchg(dst + off, R0, src):
|
||||
|
||||
:STXXADDW [dst + off], src is imm=0xf1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
:ACMP32 [dst + off], src is imm=0xf1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x0 & op_insn_class=0x3 {
|
||||
local tmp:4 = *:4 (dst + off);
|
||||
if (R0:4 == tmp) goto <equal>;
|
||||
R0 = zext(tmp);
|
||||
<equal>
|
||||
if (R0:4 != tmp) goto <notEqual>;
|
||||
*:4 (dst + off) = src:4;
|
||||
<notEqual>
|
||||
R0 = zext(tmp);
|
||||
}
|
||||
|
||||
:STXXADDDW [dst + off], src is imm=0xf1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
:ACMP [dst + off], src is imm=0xf1 & off & src & dst & op_ld_st_mode=0x6 & op_ld_st_size=0x3 & op_insn_class=0x3 {
|
||||
local tmp:8 = *:8 (dst + off);
|
||||
if (R0 == tmp) goto <equal>;
|
||||
R0 = tmp;
|
||||
<equal>
|
||||
*:8 (dst + off) = src;
|
||||
if (R0 != tmp) goto <notEqual>;
|
||||
*:8 (dst + off) = src;
|
||||
goto inst_next;
|
||||
<notEqual>
|
||||
R0 = tmp;
|
||||
}
|
||||
|
||||
#Jump instructions (BPF_JMP, BPF_JMP32)
|
||||
|
||||
Reference in New Issue
Block a user