summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2024-03-18 23:43:54 -0700
committerMaciej Żenczykowski <maze@google.com>2024-03-19 07:00:58 +0000
commite8d35313ddc917cef506fc066b09fab975a7cc2f (patch)
tree5c4910f67569ba12cf9931a12e0ba212de034ea1
parent8fed45be8461369c7aafa777521f62700cb23593 (diff)
downloadapf-e8d35313ddc917cef506fc066b09fab975a7cc2f.tar.gz
v5: simplify JBSMATCH_OPCODE implementation
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 <maze@google.com> Change-Id: I61ad0f93ae649765e4ab04e65a0a56f2742583e7
-rw-r--r--v5/apf_interpreter.c15
-rw-r--r--v5/apf_interpreter_source.c15
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);