From e8d35313ddc917cef506fc066b09fab975a7cc2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Mon, 18 Mar 2024 23:43:54 -0700 Subject: v5: simplify JBSMATCH_OPCODE implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R=1 is not usable due to having *run* time determined encoding length. We'll reuse this for jmp condition negation in an upcoming change. After this: text data bss dec hex filename 3892 0 0 3892 f34 apf_interpreter.arm.o text data bss dec hex filename 4924 0 0 4924 133c apf_interpreter.x86.o Test: TreeHugger Signed-off-by: Maciej Żenczykowski Change-Id: I61ad0f93ae649765e4ab04e65a0a56f2742583e7 --- v5/apf_interpreter.c | 15 ++++++--------- v5/apf_interpreter_source.c | 15 ++++++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/v5/apf_interpreter.c b/v5/apf_interpreter.c index f3b6726..7e31b4d 100644 --- a/v5/apf_interpreter.c +++ b/v5/apf_interpreter.c @@ -594,7 +594,7 @@ extern void APF_TRACE_HOOK(u32 pc, const u32* regs, const u8* program, #define ENFORCE_UNSIGNED(c) ((c)==(u32)(c)) u32 apf_version(void) { - return 20240312; + return 20240313; } typedef struct { @@ -788,19 +788,16 @@ static int do_apf_run(apf_context* ctx) { break; } case JBSMATCH_OPCODE: { + /* with len_field == 0, we have imm == cmp_imm == 0 and thus a jmp +0, ie. a no-op */ + if (len_field == 0) break; /* Load second immediate field. */ - u32 cmp_imm = 0; - if (reg_num == 1) { - cmp_imm = ctx->R[1]; - } else if (len_field != 0) { - u32 cmp_imm_len = 1 << (len_field - 1); - cmp_imm = decode_imm(ctx, cmp_imm_len); /* 2nd imm, at worst 8 bytes past prog_len */ - } + u32 cmp_imm_len = 1 << (len_field - 1); + u32 cmp_imm = decode_imm(ctx, cmp_imm_len); /* 2nd imm, at worst 4 bytes past prog_len */ /* cmp_imm is size in bytes of data to compare. */ /* pc is offset of program bytes to compare. */ /* imm is jump target offset. */ /* REG is offset of packet bytes to compare. */ - if (len_field > 2) return PASS_PACKET; /* guarantees cmp_imm <= 0xFFFF */ + if (cmp_imm > 0xFFFF) return PASS_PACKET; /* pc < program_len < ram_len < 2GiB, thus pc + cmp_imm cannot wrap */ if (!IN_RAM_BOUNDS(ctx->pc + cmp_imm - 1)) return PASS_PACKET; ASSERT_IN_PACKET_BOUNDS(REG); diff --git a/v5/apf_interpreter_source.c b/v5/apf_interpreter_source.c index 5b8b4cc..67d11ec 100644 --- a/v5/apf_interpreter_source.c +++ b/v5/apf_interpreter_source.c @@ -61,7 +61,7 @@ extern void APF_TRACE_HOOK(u32 pc, const u32* regs, const u8* program, #define ENFORCE_UNSIGNED(c) ((c)==(u32)(c)) u32 apf_version(void) { - return 20240312; + return 20240313; } typedef struct { @@ -255,19 +255,16 @@ static int do_apf_run(apf_context* ctx) { break; } case JBSMATCH_OPCODE: { + // with len_field == 0, we have imm == cmp_imm == 0 and thus a jmp +0, ie. a no-op + if (len_field == 0) break; // Load second immediate field. - u32 cmp_imm = 0; - if (reg_num == 1) { - cmp_imm = ctx->R[1]; - } else if (len_field != 0) { - u32 cmp_imm_len = 1 << (len_field - 1); - cmp_imm = decode_imm(ctx, cmp_imm_len); // 2nd imm, at worst 8 bytes past prog_len - } + u32 cmp_imm_len = 1 << (len_field - 1); + u32 cmp_imm = decode_imm(ctx, cmp_imm_len); // 2nd imm, at worst 4 bytes past prog_len // cmp_imm is size in bytes of data to compare. // pc is offset of program bytes to compare. // imm is jump target offset. // REG is offset of packet bytes to compare. - if (len_field > 2) return PASS_PACKET; // guarantees cmp_imm <= 0xFFFF + if (cmp_imm > 0xFFFF) return PASS_PACKET; // pc < program_len < ram_len < 2GiB, thus pc + cmp_imm cannot wrap if (!IN_RAM_BOUNDS(ctx->pc + cmp_imm - 1)) return PASS_PACKET; ASSERT_IN_PACKET_BOUNDS(REG); -- cgit v1.2.3