drivers/net/ethernet/netronome/nfp/bpf/jit.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/netronome/nfp/bpf/jit.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/netronome/nfp/bpf/jit.c- Extension
.c- Size
- 128063 bytes
- Lines
- 4626
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bug.hlinux/bpf.hlinux/filter.hlinux/kernel.hlinux/pkt_cls.hlinux/reciprocal_div.hlinux/unistd.hmain.h../nfp_asm.h../nfp_net_ctrl.h
Detected Declarations
function nfp_meta_has_prevfunction nfp_prog_pushfunction nfp_prog_current_offsetfunction nfp_prog_confirm_current_offsetfunction __emit_cmdfunction emit_cmd_anyfunction emit_cmdfunction emit_cmd_indirfunction __emit_brfunction emit_br_relofunction emit_brfunction __emit_br_bitfunction emit_br_bit_relofunction emit_br_bsetfunction __emit_br_alufunction emit_rtnfunction __emit_immedfunction emit_immedfunction __emit_shffunction emit_shffunction emit_shf_indirfunction __emit_alufunction emit_alufunction __emit_mulfunction emit_mulfunction __emit_ld_fieldfunction emit_ld_field_anyfunction emit_ld_fieldfunction __emit_lcsrfunction emit_csr_wrfunction __emit_csr_rdfunction emit_nopfunction pack_immedfunction wrp_immedfunction wrp_zextfunction wrp_immed_relofunction ur_load_imm_anyfunction re_load_imm_anyfunction wrp_nopsfunction wrp_movfunction wrp_reg_movfunction wrp_reg_subpartfunction wrp_reg_or_subpartfunction addr40_offsetfunction nfp_cpp_memcpyfunction data_ldfunction data_ld_host_orderfunction data_ld_host_order_addr32
Annotated Snippet
if (gpr_byte >= 4) {
gpr_byte -= 4;
gpr++;
}
size -= slice_size;
off += slice_size;
}
return 0;
}
static void
wrp_alu_imm(struct nfp_prog *nfp_prog, u8 dst, enum alu_op alu_op, u32 imm)
{
swreg tmp_reg;
if (alu_op == ALU_OP_AND) {
if (!imm)
wrp_immed(nfp_prog, reg_both(dst), 0);
if (!imm || !~imm)
return;
}
if (alu_op == ALU_OP_OR) {
if (!~imm)
wrp_immed(nfp_prog, reg_both(dst), ~0U);
if (!imm || !~imm)
return;
}
if (alu_op == ALU_OP_XOR) {
if (!~imm)
emit_alu(nfp_prog, reg_both(dst), reg_none(),
ALU_OP_NOT, reg_b(dst));
if (!imm || !~imm)
return;
}
tmp_reg = ur_load_imm_any(nfp_prog, imm, imm_b(nfp_prog));
emit_alu(nfp_prog, reg_both(dst), reg_a(dst), alu_op, tmp_reg);
}
static int
wrp_alu64_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
enum alu_op alu_op, bool skip)
{
const struct bpf_insn *insn = &meta->insn;
u64 imm = insn->imm; /* sign extend */
if (skip) {
meta->flags |= FLAG_INSN_SKIP_NOOP;
return 0;
}
wrp_alu_imm(nfp_prog, insn->dst_reg * 2, alu_op, imm & ~0U);
wrp_alu_imm(nfp_prog, insn->dst_reg * 2 + 1, alu_op, imm >> 32);
return 0;
}
static int
wrp_alu64_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
enum alu_op alu_op)
{
u8 dst = meta->insn.dst_reg * 2, src = meta->insn.src_reg * 2;
emit_alu(nfp_prog, reg_both(dst), reg_a(dst), alu_op, reg_b(src));
emit_alu(nfp_prog, reg_both(dst + 1),
reg_a(dst + 1), alu_op, reg_b(src + 1));
return 0;
}
static int
wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
enum alu_op alu_op)
{
const struct bpf_insn *insn = &meta->insn;
u8 dst = insn->dst_reg * 2;
wrp_alu_imm(nfp_prog, dst, alu_op, insn->imm);
wrp_zext(nfp_prog, meta, dst);
return 0;
}
static int
wrp_alu32_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
enum alu_op alu_op)
{
u8 dst = meta->insn.dst_reg * 2, src = meta->insn.src_reg * 2;
Annotation
- Immediate include surface: `linux/bug.h`, `linux/bpf.h`, `linux/filter.h`, `linux/kernel.h`, `linux/pkt_cls.h`, `linux/reciprocal_div.h`, `linux/unistd.h`, `main.h`.
- Detected declarations: `function nfp_meta_has_prev`, `function nfp_prog_push`, `function nfp_prog_current_offset`, `function nfp_prog_confirm_current_offset`, `function __emit_cmd`, `function emit_cmd_any`, `function emit_cmd`, `function emit_cmd_indir`, `function __emit_br`, `function emit_br_relo`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.