From 545ec30ad0592d63cbcff482e877db96739a72f8 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Sun, 14 Jun 2020 14:01:39 +0200 Subject: [PATCH] decode: Return partial error on incomplete opcode --- decode.c | 2 +- tests/decode-jmp.txt | 2 ++ tests/driver.c | 26 +++++++++++++++++--------- tests/prefixes.txt | 3 +++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/decode.c b/decode.c index ad880de..070aad6 100644 --- a/decode.c +++ b/decode.c @@ -416,7 +416,7 @@ fd_decode(const uint8_t* buffer, size_t len_sz, int mode_int, uintptr_t address, } if (UNLIKELY(kind != ENTRY_INSTR)) - return FD_ERR_UD; + return kind == 0 ? FD_ERR_UD : FD_ERR_PARTIAL; struct InstrDesc* desc = (struct InstrDesc*) table; diff --git a/tests/decode-jmp.txt b/tests/decode-jmp.txt index 7999c32..9bc7937 100644 --- a/tests/decode-jmp.txt +++ b/tests/decode-jmp.txt @@ -2,3 +2,5 @@ decode32 e900000000 [JMP off4:eip+0x0] decode32 66e90100 [JMP off2:ip+0x1] decode64 e900000000 [JMP off8:rip+0x0] decode64 66e900000000 [JMP off8:rip+0x0] +decode 66e9000000 PARTIAL +decode 66e9 PARTIAL diff --git a/tests/driver.c b/tests/driver.c index acc44cb..2e1c413 100644 --- a/tests/driver.c +++ b/tests/driver.c @@ -49,6 +49,7 @@ main(int argc, char** argv) struct timespec time_end; FdInstr instr; + int retval = 0; __asm__ volatile("" : : : "memory"); clock_gettime(CLOCK_MONOTONIC, &time_start); @@ -58,18 +59,29 @@ main(int argc, char** argv) while (current_off != length) { size_t remaining = length - current_off; - int retval = fd_decode(code + current_off, remaining, mode, 0, &instr); + retval = fd_decode(code + current_off, remaining, mode, 0, &instr); if (retval < 0) - goto fail; + break; current_off += retval; } } clock_gettime(CLOCK_MONOTONIC, &time_end); __asm__ volatile("" : : : "memory"); - char format_buffer[128]; - fd_format(&instr, format_buffer, sizeof(format_buffer)); - printf("%s\n", format_buffer); + if (retval >= 0) + { + char format_buffer[128]; + fd_format(&instr, format_buffer, sizeof(format_buffer)); + printf("%s\n", format_buffer); + } + else if (retval == FD_ERR_UD) + { + printf("UD\n"); + } + else if (retval == FD_ERR_PARTIAL) + { + printf("PARTIAL\n"); + } if (repetitions > 1) { @@ -80,8 +92,4 @@ main(int argc, char** argv) } return 0; - -fail: - puts("Decoding failed."); - return 1; } diff --git a/tests/prefixes.txt b/tests/prefixes.txt index dc6eb5d..02714d8 100644 --- a/tests/prefixes.txt +++ b/tests/prefixes.txt @@ -14,3 +14,6 @@ decode f266f3660f10c1 [SSE_MOVSS reg4:r0 reg4:r1] decode64 4890 [NOP] decode64 4990 [XCHG reg8:r8 reg8:r0] decode64 6690 [NOP] +decode 66 PARTIAL +decode 0f PARTIAL +decode 80 PARTIAL