summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2024-04-26 18:10:36 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-26 18:10:36 +0000
commita13437415fa9f39a0a5389ce4b4de35563bb4fce (patch)
treef9d43b51808c2594f71e32545c42fddec933af7d
parent80b60d05a1e96dd1b60bfb634293c742042db107 (diff)
parent6df7e7b215c7573cd2b1160bf6711717e1f8d489 (diff)
downloadapf-a13437415fa9f39a0a5389ce4b4de35563bb4fce.tar.gz
Merge "Extend disassembler's JBSMATCH support for multi-byte sequences" into main
-rw-r--r--disassembler.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/disassembler.c b/disassembler.c
index 2de62e2..0929333 100644
--- a/disassembler.c
+++ b/disassembler.c
@@ -196,13 +196,26 @@ const char* apf_disassemble(const uint8_t* program, uint32_t program_len, uint32
print_opcode("jbseq");
}
bprintf("r0, ");
- uint32_t cmp_imm = DECODE_IMM(1 << (len_field - 1));
- bprintf("0x%x, ", cmp_imm);
- print_jump_target(*ptr2pc + imm + cmp_imm, program_len);
+ const uint32_t cmp_imm = DECODE_IMM(1 << (len_field - 1));
+ const uint32_t cnt = (cmp_imm >> 11) + 1; // 1+, up to 32 fits in u16
+ const uint32_t len = cmp_imm & 2047; // 0..2047
+ bprintf("0x%x, ", len);
+ print_jump_target(*ptr2pc + imm + cnt * len, program_len);
bprintf(", ");
- while (cmp_imm--) {
- uint8_t byte = program[(*ptr2pc)++];
- bprintf("%02x", byte);
+ if (cnt > 1) {
+ bprintf("{ ");
+ }
+ for (uint32_t i = 0; i < cnt; ++i) {
+ for (uint32_t j = 0; j < len; ++j) {
+ uint8_t byte = program[(*ptr2pc)++];
+ bprintf("%02x", byte);
+ }
+ if (i != cnt - 1) {
+ bprintf(", ");
+ }
+ }
+ if (cnt > 1) {
+ bprintf(" }");
}
break;
}