run_dump_test jump-relax-ja
run_dump_test jump-relax-jump
+ run_dump_test jcond
+ run_dump_test jcond-pseudoc
+
# Big-endian BPF tests
run_dump_test call-be
run_dump_test exit-be
run_dump_test jump-relax-ja-be
run_dump_test jump-relax-jump-be
+ run_dump_test jcond-be
+ run_dump_test jcond-be-pseudoc
+
# Overflow tests
run_dump_test offset16-overflow
run_dump_test disp16-overflow
--- /dev/null
+#as: -EB -mdialect=pseudoc
+#objdump: -dr -M dec,pseudoc
+#source: jcond-pseudoc.s
+#name: BPF conditional pseudo-jump instruction, pseudoc syntax, big-endian
+
+.*: +file format .*bpf.*
+
+Disassembly of section .text:
+
+0+ <.text>:
+ 0: e5 00 00 00 00 00 00 00 may_goto 0
+ 8: e5 00 00 01 00 00 00 00 may_goto 1
+ 10: e5 00 ff fe 00 00 00 00 may_goto -2
+ 18: e5 00 ff fd 00 00 00 00 may_goto -3
--- /dev/null
+#as: -EB -mdialect=normal
+#objdump: -dr -M dec
+#source: jcond.s
+#name: BPF conditional pseudo-jump instruction, normal syntax, big-endian
+
+.*: +file format .*bpf.*
+
+Disassembly of section .text:
+
+0+ <.text>:
+ 0: e5 00 00 00 00 00 00 00 jcond 0
+ 8: e5 00 00 01 00 00 00 00 jcond 1
+ 10: e5 00 ff fe 00 00 00 00 jcond -2
+ 18: e5 00 ff fd 00 00 00 00 jcond -3
--- /dev/null
+#as: -EL -mdialect=pseudoc
+#objdump: -dr -M dec,pseudoc
+#source: jcond-pseudoc.s
+#name: BPF conditional pseudo-jump instruction, pseudoc syntax
+
+.*: +file format .*bpf.*
+
+Disassembly of section .text:
+
+0+ <.text>:
+ 0: e5 00 00 00 00 00 00 00 may_goto 0
+ 8: e5 00 01 00 00 00 00 00 may_goto 1
+ 10: e5 00 fe ff 00 00 00 00 may_goto -2
+ 18: e5 00 fd ff 00 00 00 00 may_goto -3
--- /dev/null
+# Test for conditional pseudo-jump instruction in pseudo-c syntax
+ .text
+ may_goto 1f
+1:
+ may_goto 2f
+ may_goto 1b
+2:
+ may_goto 1b
--- /dev/null
+#as: -EL -mdialect=normal
+#objdump: -dr -M dec
+#source: jcond.s
+#name: BPF conditional pseudo-jump instruction, normal syntax, little-endian
+
+.*: +file format .*bpf.*
+
+Disassembly of section .text:
+
+0+ <.text>:
+ 0: e5 00 00 00 00 00 00 00 jcond 0
+ 8: e5 00 01 00 00 00 00 00 jcond 1
+ 10: e5 00 fe ff 00 00 00 00 jcond -2
+ 18: e5 00 fd ff 00 00 00 00 jcond -3
--- /dev/null
+# Test for conditional pseudo-jump instruction
+ .text
+ jcond 1f
+1:
+ jcond 2f
+ jcond 1b
+2:
+ jcond 1b
#define BPF_CODE_JLE ((uint64_t)0xb0 << 56)
#define BPF_CODE_JSLT ((uint64_t)0xc0 << 56)
#define BPF_CODE_JSLE ((uint64_t)0xd0 << 56)
+#define BPF_CODE_JCOND ((uint64_t)0xe0 << 56)
#define BPF_MODE_IMM ((uint64_t)0x00 << 56)
#define BPF_MODE_ABS ((uint64_t)0x20 << 56)
BPF_INSN_ACMP, BPF_INSN_AXCHG,
/* Atomic compare-and-swap, atomic exchange (32-bit). */
BPF_INSN_ACMP32, BPF_INSN_AXCHG32,
+ /* Conditional pseudo-jump "may_goto". A NOP until the BPF runtime
+ decides it isn't. */
+ BPF_INSN_JCOND,
/* GNU simulator specific instruction. */
BPF_INSN_BRKPT,
};
{BPF_INSN_AADD32, "xaddw%W[ %dr %o16 ] , %sr", "* ( u32 * ) ( %dr %o16 ) += %sr",
BPF_V1, BPF_CODE|BPF_IMM32, BPF_CLASS_STX|BPF_SIZE_W|BPF_MODE_ATOMIC|BPF_IMM32_AADD},
+ /* The "conditional pseudo-jump" instruction, a.k.a. "may_goto". */
+ {BPF_INSN_JCOND, "jcond%W%d16", "may_goto%w%d16",
+ BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_JMP|BPF_CODE_JCOND|BPF_SRC_K},
+
/* the brkpt instruction is used by the BPF simulator and it doesn't
really belong to the BPF instruction set. */
{BPF_INSN_BRKPT, "brkpt", "brkpt",