summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2024-05-11 08:34:27 -0700
committerMaciej Żenczykowski <maze@google.com>2024-05-11 08:34:52 -0700
commite0ffcb902ce7153e7d43397cd041c7a2a1ff5dc4 (patch)
tree9e29962fb99b6599591b2de19a3abef0df4cf4a6
parent73e3f4825383eec688d752910d7409d0e58a45be (diff)
downloadapf-master.tar.gz
v7: implement jnsetHEADmastermain
Test: TreeHugger Signed-off-by: Maciej Żenczykowski <maze@google.com> Change-Id: I5f797c8d86c42be3d03341e14b8100e0e58406e8
-rw-r--r--disassembler.c4
-rw-r--r--v7/apf.h2
-rw-r--r--v7/apf_interpreter.c16
-rw-r--r--v7/apf_interpreter_source.c14
4 files changed, 23 insertions, 13 deletions
diff --git a/disassembler.c b/disassembler.c
index 38b7eb2..2e93c3c 100644
--- a/disassembler.c
+++ b/disassembler.c
@@ -75,6 +75,7 @@ static const char* opcode_names [] = {
[LDDW_OPCODE] = "lddw",
[STDW_OPCODE] = "stdw",
[WRITE_OPCODE] = "write",
+ [JNSET_OPCODE] = "jnset",
};
static void print_jump_target(uint32_t target, uint32_t program_len) {
@@ -174,7 +175,8 @@ const char* apf_disassemble(const uint8_t* program, uint32_t program_len, uint32
case JNE_OPCODE:
case JGT_OPCODE:
case JLT_OPCODE:
- case JSET_OPCODE: {
+ case JSET_OPCODE:
+ case JNSET_OPCODE: {
PRINT_OPCODE();
bprintf("r0, ");
// Load second immediate field.
diff --git a/v7/apf.h b/v7/apf.h
index 29484eb..29f9785 100644
--- a/v7/apf.h
+++ b/v7/apf.h
@@ -210,6 +210,8 @@ typedef union {
*/
#define PKTDATACOPY_OPCODE 25
+#define JNSET_OPCODE 26 // JSET with reverse condition (jump if no bits set)
+
/* ---------------------------------------------------------------------------------------------- */
// Extended opcodes.
diff --git a/v7/apf_interpreter.c b/v7/apf_interpreter.c
index 6fcbf93..c4ef59e 100644
--- a/v7/apf_interpreter.c
+++ b/v7/apf_interpreter.c
@@ -266,6 +266,8 @@ typedef union {
*/
#define PKTDATACOPY_OPCODE 25
+#define JNSET_OPCODE 26 /* JSET with reverse condition (jump if no bits set) */
+
/* ---------------------------------------------------------------------------------------------- */
/* Extended opcodes. */
@@ -806,7 +808,8 @@ static int do_apf_run(apf_context* ctx) {
case JNE_OPCODE:
case JGT_OPCODE:
case JLT_OPCODE:
- case JSET_OPCODE: {
+ case JSET_OPCODE:
+ case JNSET_OPCODE: {
u32 cmp_imm = 0;
/* Load second immediate field. */
if (reg_num == 1) {
@@ -815,11 +818,12 @@ static int do_apf_run(apf_context* ctx) {
cmp_imm = decode_imm(ctx, imm_len); /* 2nd imm, at worst 8 bytes past prog_len */
}
switch (opcode) {
- case JEQ_OPCODE: if (ctx->R[0] == cmp_imm) ctx->pc += imm; break;
- case JNE_OPCODE: if (ctx->R[0] != cmp_imm) ctx->pc += imm; break;
- case JGT_OPCODE: if (ctx->R[0] > cmp_imm) ctx->pc += imm; break;
- case JLT_OPCODE: if (ctx->R[0] < cmp_imm) ctx->pc += imm; break;
- case JSET_OPCODE: if (ctx->R[0] & cmp_imm) ctx->pc += imm; break;
+ case JEQ_OPCODE: if ( ctx->R[0] == cmp_imm ) ctx->pc += imm; break;
+ case JNE_OPCODE: if ( ctx->R[0] != cmp_imm ) ctx->pc += imm; break;
+ case JGT_OPCODE: if ( ctx->R[0] > cmp_imm ) ctx->pc += imm; break;
+ case JLT_OPCODE: if ( ctx->R[0] < cmp_imm ) ctx->pc += imm; break;
+ case JSET_OPCODE: if ( ctx->R[0] & cmp_imm ) ctx->pc += imm; break;
+ case JNSET_OPCODE: if (!(ctx->R[0] & cmp_imm)) ctx->pc += imm; break;
}
break;
}
diff --git a/v7/apf_interpreter_source.c b/v7/apf_interpreter_source.c
index 7259d5e..a36a4ee 100644
--- a/v7/apf_interpreter_source.c
+++ b/v7/apf_interpreter_source.c
@@ -262,7 +262,8 @@ static int do_apf_run(apf_context* ctx) {
case JNE_OPCODE:
case JGT_OPCODE:
case JLT_OPCODE:
- case JSET_OPCODE: {
+ case JSET_OPCODE:
+ case JNSET_OPCODE: {
u32 cmp_imm = 0;
// Load second immediate field.
if (reg_num == 1) {
@@ -271,11 +272,12 @@ static int do_apf_run(apf_context* ctx) {
cmp_imm = decode_imm(ctx, imm_len); // 2nd imm, at worst 8 bytes past prog_len
}
switch (opcode) {
- case JEQ_OPCODE: if (ctx->R[0] == cmp_imm) ctx->pc += imm; break;
- case JNE_OPCODE: if (ctx->R[0] != cmp_imm) ctx->pc += imm; break;
- case JGT_OPCODE: if (ctx->R[0] > cmp_imm) ctx->pc += imm; break;
- case JLT_OPCODE: if (ctx->R[0] < cmp_imm) ctx->pc += imm; break;
- case JSET_OPCODE: if (ctx->R[0] & cmp_imm) ctx->pc += imm; break;
+ case JEQ_OPCODE: if ( ctx->R[0] == cmp_imm ) ctx->pc += imm; break;
+ case JNE_OPCODE: if ( ctx->R[0] != cmp_imm ) ctx->pc += imm; break;
+ case JGT_OPCODE: if ( ctx->R[0] > cmp_imm ) ctx->pc += imm; break;
+ case JLT_OPCODE: if ( ctx->R[0] < cmp_imm ) ctx->pc += imm; break;
+ case JSET_OPCODE: if ( ctx->R[0] & cmp_imm ) ctx->pc += imm; break;
+ case JNSET_OPCODE: if (!(ctx->R[0] & cmp_imm)) ctx->pc += imm; break;
}
break;
}