0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef _BPF_JIT_COMP_H
0015 #define _BPF_JIT_COMP_H
0016
0017
0018 #define MIPS_R_ZERO 0
0019 #define MIPS_R_AT 1
0020 #define MIPS_R_V0 2
0021 #define MIPS_R_V1 3
0022 #define MIPS_R_A0 4
0023 #define MIPS_R_A1 5
0024 #define MIPS_R_A2 6
0025 #define MIPS_R_A3 7
0026 #define MIPS_R_A4 8
0027 #define MIPS_R_A5 9
0028 #define MIPS_R_A6 10
0029 #define MIPS_R_A7 11
0030 #define MIPS_R_T0 8
0031 #define MIPS_R_T1 9
0032 #define MIPS_R_T2 10
0033 #define MIPS_R_T3 11
0034 #define MIPS_R_T4 12
0035 #define MIPS_R_T5 13
0036 #define MIPS_R_T6 14
0037 #define MIPS_R_T7 15
0038 #define MIPS_R_S0 16
0039 #define MIPS_R_S1 17
0040 #define MIPS_R_S2 18
0041 #define MIPS_R_S3 19
0042 #define MIPS_R_S4 20
0043 #define MIPS_R_S5 21
0044 #define MIPS_R_S6 22
0045 #define MIPS_R_S7 23
0046 #define MIPS_R_T8 24
0047 #define MIPS_R_T9 25
0048
0049
0050 #define MIPS_R_GP 28
0051 #define MIPS_R_SP 29
0052 #define MIPS_R_FP 30
0053 #define MIPS_R_RA 31
0054
0055
0056
0057
0058
0059 #define MIPS_JMP_MASK 0x0fffffffUL
0060
0061
0062 #define JIT_MAX_ITERATIONS 8
0063
0064
0065
0066
0067
0068 #define JIT_JNSET 0xe0
0069 #define JIT_JNOP 0xf0
0070
0071
0072 #define JIT_DESC_CONVERT BIT(31)
0073
0074
0075 struct jit_context {
0076 struct bpf_prog *program;
0077 u32 *descriptors;
0078 u32 *target;
0079 u32 bpf_index;
0080 u32 jit_index;
0081 u32 changes;
0082 u32 accessed;
0083 u32 clobbered;
0084 u32 stack_size;
0085 u32 saved_size;
0086 u32 stack_used;
0087 };
0088
0089
0090 #define __emit(ctx, func, ...) \
0091 do { \
0092 if ((ctx)->target != NULL) { \
0093 u32 *p = &(ctx)->target[ctx->jit_index]; \
0094 uasm_i_##func(&p, ##__VA_ARGS__); \
0095 } \
0096 (ctx)->jit_index++; \
0097 } while (0)
0098 #define emit(...) __emit(__VA_ARGS__)
0099
0100
0101 #ifdef CONFIG_WAR_R10000_LLSC
0102 #define LLSC_beqz beqzl
0103 #else
0104 #define LLSC_beqz beqz
0105 #endif
0106
0107
0108 #ifdef CONFIG_CPU_LOONGSON3_WORKAROUNDS
0109 #define LLSC_sync(ctx) emit(ctx, sync, 0)
0110 #define LLSC_offset 4
0111 #else
0112 #define LLSC_sync(ctx)
0113 #define LLSC_offset 0
0114 #endif
0115
0116
0117 #ifdef CONFIG_CPU_JUMP_WORKAROUNDS
0118 #define JALR_MASK 0xffffffffcfffffffULL
0119 #else
0120 #define JALR_MASK (~0ULL)
0121 #endif
0122
0123
0124
0125
0126
0127 static inline void access_reg(struct jit_context *ctx, u8 reg)
0128 {
0129 ctx->accessed |= BIT(reg);
0130 }
0131
0132
0133
0134
0135
0136 static inline void clobber_reg(struct jit_context *ctx, u8 reg)
0137 {
0138 ctx->clobbered |= BIT(reg);
0139 }
0140
0141
0142
0143
0144
0145 int push_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth);
0146
0147
0148
0149
0150
0151 int pop_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth);
0152
0153
0154 int get_target(struct jit_context *ctx, u32 loc);
0155
0156
0157 int get_offset(const struct jit_context *ctx, int off);
0158
0159
0160 void emit_mov_i(struct jit_context *ctx, u8 dst, s32 imm);
0161
0162
0163 void emit_mov_r(struct jit_context *ctx, u8 dst, u8 src);
0164
0165
0166 bool valid_alu_i(u8 op, s32 imm);
0167
0168
0169 bool rewrite_alu_i(u8 op, s32 imm, u8 *alu, s32 *val);
0170
0171
0172 void emit_alu_i(struct jit_context *ctx, u8 dst, s32 imm, u8 op);
0173
0174
0175 void emit_alu_r(struct jit_context *ctx, u8 dst, u8 src, u8 op);
0176
0177
0178 void emit_atomic_r(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 code);
0179
0180
0181 void emit_cmpxchg_r(struct jit_context *ctx, u8 dst, u8 src, u8 res, s16 off);
0182
0183
0184 void emit_bswap_r(struct jit_context *ctx, u8 dst, u32 width);
0185
0186
0187 bool valid_jmp_i(u8 op, s32 imm);
0188
0189
0190 void setup_jmp_i(struct jit_context *ctx, s32 imm, u8 width,
0191 u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off);
0192
0193
0194 void setup_jmp_r(struct jit_context *ctx, bool same_reg,
0195 u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off);
0196
0197
0198 int finish_jmp(struct jit_context *ctx, u8 jit_op, s16 bpf_off);
0199
0200
0201 void emit_jmp_i(struct jit_context *ctx, u8 dst, s32 imm, s32 off, u8 op);
0202
0203
0204 void emit_jmp_r(struct jit_context *ctx, u8 dst, u8 src, s32 off, u8 op);
0205
0206
0207 int emit_ja(struct jit_context *ctx, s16 off);
0208
0209
0210 int emit_exit(struct jit_context *ctx);
0211
0212
0213
0214
0215
0216 void build_prologue(struct jit_context *ctx);
0217
0218
0219
0220
0221
0222 void build_epilogue(struct jit_context *ctx, int dest_reg);
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233 int build_insn(const struct bpf_insn *insn, struct jit_context *ctx);
0234
0235 #endif