From: Nicholas Dudar <main.kalliope@gmail.com>
To: ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
eddyz87@gmail.com, memxor@gmail.com, deller@gmx.de,
James.Bottomley@HansenPartnership.com
Cc: bpf@vger.kernel.org, linux-parisc@vger.kernel.org,
linux-kernel@vger.kernel.org, visitorckw@gmail.com
Subject: [PATCH bpf-next 2/2] bpf, parisc: Add support for BPF_SDIV and BPF_SMOD in the parisc32 JIT
Date: Fri, 17 Jul 2026 15:05:44 -0400 [thread overview]
Message-ID: <20260717190544.257306-3-main.kalliope@gmail.com> (raw)
In-Reply-To: <20260717190544.257306-1-main.kalliope@gmail.com>
emit_alu_r32() and emit_alu_r64() call the unsigned millicode
($$divU/$$remU) and libgcc-style (hppa_div64()/hppa_div64_rem())
divide/remainder helpers for BPF_DIV and BPF_MOD regardless of the
BPF instruction's signedness, so the parisc32 JIT does not implement
signed BPF_SDIV and BPF_SMOD (off == 1). Signed ALU32 and ALU64
div/mod get an unsigned quotient and remainder rather than the
verifier's and the interpreter's signed result for negative operands.
Thread is_signed = (insn->off == 1) through emit_alu_r32()/
emit_alu_r64(), and on the signed path use the $$divI/$$remI signed
millicode routines (32-bit) or the hppa_sdiv64()/hppa_sdiv64_rem()
helpers added in patch 1 (64-bit) instead of their unsigned
counterparts. $$divI and $$remI are extern-declared and exported next
to $$divU/$$remU in arch/parisc/kernel/parisc_ksyms.c.
bpf_do_misc_fixups() rewrites the zero-divisor and INT_MIN/-1 cases out
of the instruction stream before the JIT runs.
Signed-off-by: Nicholas Dudar <main.kalliope@gmail.com>
Assisted-by: Claude:claude-opus-4-8
---
arch/parisc/net/bpf_jit_comp32.c | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/arch/parisc/net/bpf_jit_comp32.c b/arch/parisc/net/bpf_jit_comp32.c
index 5ff0cf925fe9..eea0a34a3bfe 100644
--- a/arch/parisc/net/bpf_jit_comp32.c
+++ b/arch/parisc/net/bpf_jit_comp32.c
@@ -321,6 +321,8 @@ static void bpf_put_reg32(const s8 *reg, const s8 *src,
extern void $$mulI(void);
extern void $$divU(void);
extern void $$remU(void);
+extern void $$divI(void);
+extern void $$remI(void);
static void emit_call_millicode(void *func, const s8 arg0,
const s8 arg1, u8 opcode, struct hppa_jit_context *ctx)
@@ -562,12 +564,14 @@ static void emit_alu_i32(const s8 *dst, s32 imm,
}
static void emit_alu_r64(const s8 *dst, const s8 *src,
- struct hppa_jit_context *ctx, const u8 op)
+ struct hppa_jit_context *ctx, const u8 op,
+ bool is_signed)
{
const s8 *tmp1 = regmap[TMP_REG_1];
const s8 *tmp2 = regmap[TMP_REG_2];
const s8 *rd;
const s8 *rs = bpf_get_reg64(src, tmp2, ctx);
+ void *func;
if (op == BPF_MOV)
rd = bpf_get_reg64_ref(dst, tmp1, false, ctx);
@@ -604,10 +608,12 @@ static void emit_alu_r64(const s8 *dst, const s8 *src,
emit_call_libgcc_ll(__muldi3, rd, rs, op, ctx);
break;
case BPF_DIV:
- emit_call_libgcc_ll(&hppa_div64, rd, rs, op, ctx);
+ func = is_signed ? &hppa_sdiv64 : &hppa_div64;
+ emit_call_libgcc_ll(func, rd, rs, op, ctx);
break;
case BPF_MOD:
- emit_call_libgcc_ll(&hppa_div64_rem, rd, rs, op, ctx);
+ func = is_signed ? &hppa_sdiv64_rem : &hppa_div64_rem;
+ emit_call_libgcc_ll(func, rd, rs, op, ctx);
break;
case BPF_LSH:
emit_call_libgcc_ll(__ashldi3, rd, rs, op, ctx);
@@ -630,7 +636,8 @@ static void emit_alu_r64(const s8 *dst, const s8 *src,
}
static void emit_alu_r32(const s8 *dst, const s8 *src,
- struct hppa_jit_context *ctx, const u8 op)
+ struct hppa_jit_context *ctx, const u8 op,
+ bool is_signed)
{
const s8 *tmp1 = regmap[TMP_REG_1];
const s8 *tmp2 = regmap[TMP_REG_2];
@@ -666,10 +673,12 @@ static void emit_alu_r32(const s8 *dst, const s8 *src,
emit_call_millicode($$mulI, lo(rd), lo(rs), op, ctx);
break;
case BPF_DIV:
- emit_call_millicode($$divU, lo(rd), lo(rs), op, ctx);
+ emit_call_millicode(is_signed ? $$divI : $$divU,
+ lo(rd), lo(rs), op, ctx);
break;
case BPF_MOD:
- emit_call_millicode($$remU, lo(rd), lo(rs), op, ctx);
+ emit_call_millicode(is_signed ? $$remI : $$remU,
+ lo(rd), lo(rs), op, ctx);
break;
case BPF_LSH:
emit(hppa_subi(0x1f, lo(rs), HPPA_REG_T0), ctx);
@@ -1163,12 +1172,12 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
emit_imm32(tmp2, imm, ctx);
src = tmp2;
}
- emit_alu_r64(dst, src, ctx, BPF_OP(code));
+ emit_alu_r64(dst, src, ctx, BPF_OP(code), off == 1);
break;
/* dst = -dst */
case BPF_ALU64 | BPF_NEG:
- emit_alu_r64(dst, tmp2, ctx, BPF_OP(code));
+ emit_alu_r64(dst, tmp2, ctx, BPF_OP(code), false);
break;
case BPF_ALU64 | BPF_MOV | BPF_K:
@@ -1211,7 +1220,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
emit_imm32(tmp2, imm, ctx);
src = tmp2;
}
- emit_alu_r32(dst, src, ctx, BPF_OP(code));
+ emit_alu_r32(dst, src, ctx, BPF_OP(code), off == 1);
break;
/* dst = dst OP imm */
@@ -1236,7 +1245,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct hppa_jit_context *ctx,
* src is ignored---choose tmp2 as a dummy register since it
* is not on the stack.
*/
- emit_alu_r32(dst, tmp2, ctx, BPF_OP(code));
+ emit_alu_r32(dst, tmp2, ctx, BPF_OP(code), false);
break;
/* dst = BSWAP##imm(dst) */
--
2.34.1
next prev parent reply other threads:[~2026-07-17 19:06 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-17 19:05 [PATCH bpf-next 0/2] bpf, parisc: Add support for BPF_SDIV and BPF_SMOD in the parisc JITs Nicholas Dudar
2026-07-17 19:05 ` [PATCH bpf-next 1/2] bpf, parisc: Add support for BPF_SDIV and BPF_SMOD in the parisc64 JIT Nicholas Dudar
2026-07-17 19:16 ` sashiko-bot
2026-07-17 22:36 ` Nicholas Dudar
2026-07-17 19:52 ` bot+bpf-ci
2026-07-17 20:58 ` Nicholas Dudar
2026-07-17 22:27 ` Nicholas Dudar
2026-07-17 19:05 ` Nicholas Dudar [this message]
2026-07-17 19:27 ` [PATCH bpf-next 2/2] bpf, parisc: Add support for BPF_SDIV and BPF_SMOD in the parisc32 JIT sashiko-bot
2026-07-17 23:01 ` Nicholas Dudar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260717190544.257306-3-main.kalliope@gmail.com \
--to=main.kalliope@gmail.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=deller@gmx.de \
--cc=eddyz87@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-parisc@vger.kernel.org \
--cc=memxor@gmail.com \
--cc=visitorckw@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.