linux/tools/include/linux/filter.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Linux Socket Filter Data Structures
   4 */
   5#ifndef __TOOLS_LINUX_FILTER_H
   6#define __TOOLS_LINUX_FILTER_H
   7
   8#include <linux/bpf.h>
   9
  10/* ArgX, context and stack frame pointer register positions. Note,
  11 * Arg1, Arg2, Arg3, etc are used as argument mappings of function
  12 * calls in BPF_CALL instruction.
  13 */
  14#define BPF_REG_ARG1    BPF_REG_1
  15#define BPF_REG_ARG2    BPF_REG_2
  16#define BPF_REG_ARG3    BPF_REG_3
  17#define BPF_REG_ARG4    BPF_REG_4
  18#define BPF_REG_ARG5    BPF_REG_5
  19#define BPF_REG_CTX     BPF_REG_6
  20#define BPF_REG_FP      BPF_REG_10
  21
  22/* Additional register mappings for converted user programs. */
  23#define BPF_REG_A       BPF_REG_0
  24#define BPF_REG_X       BPF_REG_7
  25#define BPF_REG_TMP     BPF_REG_8
  26
  27/* BPF program can access up to 512 bytes of stack space. */
  28#define MAX_BPF_STACK   512
  29
  30/* Helper macros for filter block array initializers. */
  31
  32/* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */
  33
  34#define BPF_ALU64_REG(OP, DST, SRC)                             \
  35        ((struct bpf_insn) {                                    \
  36                .code  = BPF_ALU64 | BPF_OP(OP) | BPF_X,        \
  37                .dst_reg = DST,                                 \
  38                .src_reg = SRC,                                 \
  39                .off   = 0,                                     \
  40                .imm   = 0 })
  41
  42#define BPF_ALU32_REG(OP, DST, SRC)                             \
  43        ((struct bpf_insn) {                                    \
  44                .code  = BPF_ALU | BPF_OP(OP) | BPF_X,          \
  45                .dst_reg = DST,                                 \
  46                .src_reg = SRC,                                 \
  47                .off   = 0,                                     \
  48                .imm   = 0 })
  49
  50/* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */
  51
  52#define BPF_ALU64_IMM(OP, DST, IMM)                             \
  53        ((struct bpf_insn) {                                    \
  54                .code  = BPF_ALU64 | BPF_OP(OP) | BPF_K,        \
  55                .dst_reg = DST,                                 \
  56                .src_reg = 0,                                   \
  57                .off   = 0,                                     \
  58                .imm   = IMM })
  59
  60#define BPF_ALU32_IMM(OP, DST, IMM)                             \
  61        ((struct bpf_insn) {                                    \
  62                .code  = BPF_ALU | BPF_OP(OP) | BPF_K,          \
  63                .dst_reg = DST,                                 \
  64                .src_reg = 0,                                   \
  65                .off   = 0,                                     \
  66                .imm   = IMM })
  67
  68/* Endianess conversion, cpu_to_{l,b}e(), {l,b}e_to_cpu() */
  69
  70#define BPF_ENDIAN(TYPE, DST, LEN)                              \
  71        ((struct bpf_insn) {                                    \
  72                .code  = BPF_ALU | BPF_END | BPF_SRC(TYPE),     \
  73                .dst_reg = DST,                                 \
  74                .src_reg = 0,                                   \
  75                .off   = 0,                                     \
  76                .imm   = LEN })
  77
  78/* Short form of mov, dst_reg = src_reg */
  79
  80#define BPF_MOV64_REG(DST, SRC)                                 \
  81        ((struct bpf_insn) {                                    \
  82                .code  = BPF_ALU64 | BPF_MOV | BPF_X,           \
  83                .dst_reg = DST,                                 \
  84                .src_reg = SRC,                                 \
  85                .off   = 0,                                     \
  86                .imm   = 0 })
  87
  88#define BPF_MOV32_REG(DST, SRC)                                 \
  89        ((struct bpf_insn) {                                    \
  90                .code  = BPF_ALU | BPF_MOV | BPF_X,             \
  91                .dst_reg = DST,                                 \
  92                .src_reg = SRC,                                 \
  93                .off   = 0,                                     \
  94                .imm   = 0 })
  95
  96/* Short form of mov, dst_reg = imm32 */
  97
  98#define BPF_MOV64_IMM(DST, IMM)                                 \
  99        ((struct bpf_insn) {                                    \
 100                .code  = BPF_ALU64 | BPF_MOV | BPF_K,           \
 101                .dst_reg = DST,                                 \
 102                .src_reg = 0,                                   \
 103                .off   = 0,                                     \
 104                .imm   = IMM })
 105
 106#define BPF_MOV32_IMM(DST, IMM)                                 \
 107        ((struct bpf_insn) {                                    \
 108                .code  = BPF_ALU | BPF_MOV | BPF_K,             \
 109                .dst_reg = DST,                                 \
 110                .src_reg = 0,                                   \
 111                .off   = 0,                                     \
 112                .imm   = IMM })
 113
 114/* Short form of mov based on type,  BPF_X: dst_reg = src_reg, BPF_K: dst_reg = imm32 */
 115
 116#define BPF_MOV64_RAW(TYPE, DST, SRC, IMM)                      \
 117        ((struct bpf_insn) {                                    \
 118                .code  = BPF_ALU64 | BPF_MOV | BPF_SRC(TYPE),   \
 119                .dst_reg = DST,                                 \
 120                .src_reg = SRC,                                 \
 121                .off   = 0,                                     \
 122                .imm   = IMM })
 123
 124#define BPF_MOV32_RAW(TYPE, DST, SRC, IMM)                      \
 125        ((struct bpf_insn) {                                    \
 126                .code  = BPF_ALU | BPF_MOV | BPF_SRC(TYPE),     \
 127                .dst_reg = DST,                                 \
 128                .src_reg = SRC,                                 \
 129                .off   = 0,                                     \
 130                .imm   = IMM })
 131
 132/* Direct packet access, R0 = *(uint *) (skb->data + imm32) */
 133
 134#define BPF_LD_ABS(SIZE, IMM)                                   \
 135        ((struct bpf_insn) {                                    \
 136                .code  = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS,     \
 137                .dst_reg = 0,                                   \
 138                .src_reg = 0,                                   \
 139                .off   = 0,                                     \
 140                .imm   = IMM })
 141
 142/* Indirect packet access, R0 = *(uint *) (skb->data + src_reg + imm32) */
 143
 144#define BPF_LD_IND(SIZE, SRC, IMM)                              \
 145        ((struct bpf_insn) {                                    \
 146                .code  = BPF_LD | BPF_SIZE(SIZE) | BPF_IND,     \
 147                .dst_reg = 0,                                   \
 148                .src_reg = SRC,                                 \
 149                .off   = 0,                                     \
 150                .imm   = IMM })
 151
 152/* Memory load, dst_reg = *(uint *) (src_reg + off16) */
 153
 154#define BPF_LDX_MEM(SIZE, DST, SRC, OFF)                        \
 155        ((struct bpf_insn) {                                    \
 156                .code  = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM,    \
 157                .dst_reg = DST,                                 \
 158                .src_reg = SRC,                                 \
 159                .off   = OFF,                                   \
 160                .imm   = 0 })
 161
 162/* Memory store, *(uint *) (dst_reg + off16) = src_reg */
 163
 164#define BPF_STX_MEM(SIZE, DST, SRC, OFF)                        \
 165        ((struct bpf_insn) {                                    \
 166                .code  = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM,    \
 167                .dst_reg = DST,                                 \
 168                .src_reg = SRC,                                 \
 169                .off   = OFF,                                   \
 170                .imm   = 0 })
 171
 172/* Atomic memory add, *(uint *)(dst_reg + off16) += src_reg */
 173
 174#define BPF_STX_XADD(SIZE, DST, SRC, OFF)                       \
 175        ((struct bpf_insn) {                                    \
 176                .code  = BPF_STX | BPF_SIZE(SIZE) | BPF_XADD,   \
 177                .dst_reg = DST,                                 \
 178                .src_reg = SRC,                                 \
 179                .off   = OFF,                                   \
 180                .imm   = 0 })
 181
 182/* Memory store, *(uint *) (dst_reg + off16) = imm32 */
 183
 184#define BPF_ST_MEM(SIZE, DST, OFF, IMM)                         \
 185        ((struct bpf_insn) {                                    \
 186                .code  = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM,     \
 187                .dst_reg = DST,                                 \
 188                .src_reg = 0,                                   \
 189                .off   = OFF,                                   \
 190                .imm   = IMM })
 191
 192/* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */
 193
 194#define BPF_JMP_REG(OP, DST, SRC, OFF)                          \
 195        ((struct bpf_insn) {                                    \
 196                .code  = BPF_JMP | BPF_OP(OP) | BPF_X,          \
 197                .dst_reg = DST,                                 \
 198                .src_reg = SRC,                                 \
 199                .off   = OFF,                                   \
 200                .imm   = 0 })
 201
 202/* Like BPF_JMP_REG, but with 32-bit wide operands for comparison. */
 203
 204#define BPF_JMP32_REG(OP, DST, SRC, OFF)                        \
 205        ((struct bpf_insn) {                                    \
 206                .code  = BPF_JMP32 | BPF_OP(OP) | BPF_X,        \
 207                .dst_reg = DST,                                 \
 208                .src_reg = SRC,                                 \
 209                .off   = OFF,                                   \
 210                .imm   = 0 })
 211
 212/* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */
 213
 214#define BPF_JMP_IMM(OP, DST, IMM, OFF)                          \
 215        ((struct bpf_insn) {                                    \
 216                .code  = BPF_JMP | BPF_OP(OP) | BPF_K,          \
 217                .dst_reg = DST,                                 \
 218                .src_reg = 0,                                   \
 219                .off   = OFF,                                   \
 220                .imm   = IMM })
 221
 222/* Like BPF_JMP_IMM, but with 32-bit wide operands for comparison. */
 223
 224#define BPF_JMP32_IMM(OP, DST, IMM, OFF)                        \
 225        ((struct bpf_insn) {                                    \
 226                .code  = BPF_JMP32 | BPF_OP(OP) | BPF_K,        \
 227                .dst_reg = DST,                                 \
 228                .src_reg = 0,                                   \
 229                .off   = OFF,                                   \
 230                .imm   = IMM })
 231
 232/* Unconditional jumps, goto pc + off16 */
 233
 234#define BPF_JMP_A(OFF)                                          \
 235        ((struct bpf_insn) {                                    \
 236                .code  = BPF_JMP | BPF_JA,                      \
 237                .dst_reg = 0,                                   \
 238                .src_reg = 0,                                   \
 239                .off   = OFF,                                   \
 240                .imm   = 0 })
 241
 242/* Function call */
 243
 244#define BPF_EMIT_CALL(FUNC)                                     \
 245        ((struct bpf_insn) {                                    \
 246                .code  = BPF_JMP | BPF_CALL,                    \
 247                .dst_reg = 0,                                   \
 248                .src_reg = 0,                                   \
 249                .off   = 0,                                     \
 250                .imm   = ((FUNC) - BPF_FUNC_unspec) })
 251
 252/* Raw code statement block */
 253
 254#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM)                  \
 255        ((struct bpf_insn) {                                    \
 256                .code  = CODE,                                  \
 257                .dst_reg = DST,                                 \
 258                .src_reg = SRC,                                 \
 259                .off   = OFF,                                   \
 260                .imm   = IMM })
 261
 262/* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */
 263
 264#define BPF_LD_IMM64(DST, IMM)                                  \
 265        BPF_LD_IMM64_RAW(DST, 0, IMM)
 266
 267#define BPF_LD_IMM64_RAW(DST, SRC, IMM)                         \
 268        ((struct bpf_insn) {                                    \
 269                .code  = BPF_LD | BPF_DW | BPF_IMM,             \
 270                .dst_reg = DST,                                 \
 271                .src_reg = SRC,                                 \
 272                .off   = 0,                                     \
 273                .imm   = (__u32) (IMM) }),                      \
 274        ((struct bpf_insn) {                                    \
 275                .code  = 0, /* zero is reserved opcode */       \
 276                .dst_reg = 0,                                   \
 277                .src_reg = 0,                                   \
 278                .off   = 0,                                     \
 279                .imm   = ((__u64) (IMM)) >> 32 })
 280
 281#define BPF_LD_IMM64_RAW_FULL(DST, SRC, OFF1, OFF2, IMM1, IMM2) \
 282        ((struct bpf_insn) {                                    \
 283                .code  = BPF_LD | BPF_DW | BPF_IMM,             \
 284                .dst_reg = DST,                                 \
 285                .src_reg = SRC,                                 \
 286                .off   = OFF1,                                  \
 287                .imm   = IMM1 }),                               \
 288        ((struct bpf_insn) {                                    \
 289                .code  = 0, /* zero is reserved opcode */       \
 290                .dst_reg = 0,                                   \
 291                .src_reg = 0,                                   \
 292                .off   = OFF2,                                  \
 293                .imm   = IMM2 })
 294
 295/* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */
 296
 297#define BPF_LD_MAP_FD(DST, MAP_FD)                              \
 298        BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_FD, 0, 0,     \
 299                              MAP_FD, 0)
 300
 301#define BPF_LD_MAP_VALUE(DST, MAP_FD, VALUE_OFF)                \
 302        BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_VALUE, 0, 0,  \
 303                              MAP_FD, VALUE_OFF)
 304
 305/* Relative call */
 306
 307#define BPF_CALL_REL(TGT)                                       \
 308        ((struct bpf_insn) {                                    \
 309                .code  = BPF_JMP | BPF_CALL,                    \
 310                .dst_reg = 0,                                   \
 311                .src_reg = BPF_PSEUDO_CALL,                     \
 312                .off   = 0,                                     \
 313                .imm   = TGT })
 314
 315/* Program exit */
 316
 317#define BPF_EXIT_INSN()                                         \
 318        ((struct bpf_insn) {                                    \
 319                .code  = BPF_JMP | BPF_EXIT,                    \
 320                .dst_reg = 0,                                   \
 321                .src_reg = 0,                                   \
 322                .off   = 0,                                     \
 323                .imm   = 0 })
 324
 325#endif /* __TOOLS_LINUX_FILTER_H */
 326