From 6df7e7b215c7573cd2b1160bf6711717e1f8d489 Mon Sep 17 00:00:00 2001 From: Yuyang Huang Date: Fri, 26 Apr 2024 17:58:20 +0900 Subject: Extend disassembler's JBSMATCH support for multi-byte sequences Updated the disassembler to enable the JBSMATCH opcode to handle matching against multiple byte sequences. Test: TH Change-Id: Ice21643d9bc144073a75a283262a4721ae5b1196 --- disassembler.c | 25 +++++++++++++++++++------ 1 file 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; } -- cgit v1.2.3