arch/loongarch/net/bpf_jit.c

Source file repositories/reference/linux-study-clean/arch/loongarch/net/bpf_jit.c

File Facts

System
Linux kernel
Corpus path
arch/loongarch/net/bpf_jit.c
Extension
.c
Size
64985 bytes
Lines
2370
Domain
Architecture Layer
Bucket
arch/loongarch
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (BPF_SIZE(insn->code)) {
		case BPF_B:
			if (!cpu_has_lam_bh) {
				pr_err_once("bpf-jit: amadd.b instruction is not supported\n");
				return -EINVAL;
			}
			emit_insn(ctx, amaddb, t2, t1, src);
			break;
		case BPF_H:
			if (!cpu_has_lam_bh) {
				pr_err_once("bpf-jit: amadd.h instruction is not supported\n");
				return -EINVAL;
			}
			emit_insn(ctx, amaddh, t2, t1, src);
			break;
		case BPF_W:
			emit_insn(ctx, amaddw, t2, t1, src);
			break;
		case BPF_DW:
			emit_insn(ctx, amaddd, t2, t1, src);
			break;
		}
		break;
	case BPF_AND:
		if (isdw)
			emit_insn(ctx, amandd, t2, t1, src);
		else
			emit_insn(ctx, amandw, t2, t1, src);
		break;
	case BPF_OR:
		if (isdw)
			emit_insn(ctx, amord, t2, t1, src);
		else
			emit_insn(ctx, amorw, t2, t1, src);
		break;
	case BPF_XOR:
		if (isdw)
			emit_insn(ctx, amxord, t2, t1, src);
		else
			emit_insn(ctx, amxorw, t2, t1, src);
		break;
	/* src = atomic_fetch_<op>(dst + off, src) */
	case BPF_ADD | BPF_FETCH:
		switch (BPF_SIZE(insn->code)) {
		case BPF_B:
			if (!cpu_has_lam_bh) {
				pr_err_once("bpf-jit: amadd.b instruction is not supported\n");
				return -EINVAL;
			}
			emit_insn(ctx, amaddb, src, t1, t3);
			emit_zext_32(ctx, src, true);
			break;
		case BPF_H:
			if (!cpu_has_lam_bh) {
				pr_err_once("bpf-jit: amadd.h instruction is not supported\n");
				return -EINVAL;
			}
			emit_insn(ctx, amaddh, src, t1, t3);
			emit_zext_32(ctx, src, true);
			break;
		case BPF_W:
			emit_insn(ctx, amaddw, src, t1, t3);
			emit_zext_32(ctx, src, true);
			break;
		case BPF_DW:
			emit_insn(ctx, amaddd, src, t1, t3);
			break;
		}
		break;
	case BPF_AND | BPF_FETCH:
		if (isdw) {
			emit_insn(ctx, amandd, src, t1, t3);
		} else {
			emit_insn(ctx, amandw, src, t1, t3);
			emit_zext_32(ctx, src, true);
		}
		break;
	case BPF_OR | BPF_FETCH:
		if (isdw) {
			emit_insn(ctx, amord, src, t1, t3);
		} else {
			emit_insn(ctx, amorw, src, t1, t3);
			emit_zext_32(ctx, src, true);
		}
		break;
	case BPF_XOR | BPF_FETCH:
		if (isdw) {
			emit_insn(ctx, amxord, src, t1, t3);
		} else {
			emit_insn(ctx, amxorw, src, t1, t3);

Annotation

Implementation Notes