On Tue, 2024-03-05 at 19:19 -0800, Alexei Starovoitov wrote: > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Use may_goto instruction to implement cond_break macro. > Ideally the macro should be written as: > asm volatile goto(".byte 0xe5; > .byte 0; > .short %l[l_break] ... > .long 0; > but LLVM doesn't recognize fixup of 2 byte PC relative yet. > Hence use > asm volatile goto(".byte 0xe5; > .byte 0; > .long %l[l_break] ... > .short 0; > that produces correct asm on little endian. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx> I tried rewriting with offset +1 and an additional goto: ({ __label__ l_break, l_continue; \ asm volatile goto("%[jcond]; goto %l[l_break];"\ :: __imm_insn(jcond, BPF_RAW_INSN(BPF_JMP | BPF_JCOND, 0, 0, 1, 0)) \ :: l_break); \ goto l_continue; \ l_break: break; \ l_continue:; \ }) But BPF_RAW_INSN needs filter.h, which can't be included because of vmlinux.h, unfortunate :(