decode: Return partial error on incomplete opcode
This commit is contained in:
2
decode.c
2
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))
|
if (UNLIKELY(kind != ENTRY_INSTR))
|
||||||
return FD_ERR_UD;
|
return kind == 0 ? FD_ERR_UD : FD_ERR_PARTIAL;
|
||||||
|
|
||||||
struct InstrDesc* desc = (struct InstrDesc*) table;
|
struct InstrDesc* desc = (struct InstrDesc*) table;
|
||||||
|
|
||||||
|
|||||||
@@ -2,3 +2,5 @@ decode32 e900000000 [JMP off4:eip+0x0]
|
|||||||
decode32 66e90100 [JMP off2:ip+0x1]
|
decode32 66e90100 [JMP off2:ip+0x1]
|
||||||
decode64 e900000000 [JMP off8:rip+0x0]
|
decode64 e900000000 [JMP off8:rip+0x0]
|
||||||
decode64 66e900000000 [JMP off8:rip+0x0]
|
decode64 66e900000000 [JMP off8:rip+0x0]
|
||||||
|
decode 66e9000000 PARTIAL
|
||||||
|
decode 66e9 PARTIAL
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ main(int argc, char** argv)
|
|||||||
struct timespec time_end;
|
struct timespec time_end;
|
||||||
|
|
||||||
FdInstr instr;
|
FdInstr instr;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
__asm__ volatile("" : : : "memory");
|
__asm__ volatile("" : : : "memory");
|
||||||
clock_gettime(CLOCK_MONOTONIC, &time_start);
|
clock_gettime(CLOCK_MONOTONIC, &time_start);
|
||||||
@@ -58,18 +59,29 @@ main(int argc, char** argv)
|
|||||||
while (current_off != length)
|
while (current_off != length)
|
||||||
{
|
{
|
||||||
size_t remaining = length - current_off;
|
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)
|
if (retval < 0)
|
||||||
goto fail;
|
break;
|
||||||
current_off += retval;
|
current_off += retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clock_gettime(CLOCK_MONOTONIC, &time_end);
|
clock_gettime(CLOCK_MONOTONIC, &time_end);
|
||||||
__asm__ volatile("" : : : "memory");
|
__asm__ volatile("" : : : "memory");
|
||||||
|
|
||||||
char format_buffer[128];
|
if (retval >= 0)
|
||||||
fd_format(&instr, format_buffer, sizeof(format_buffer));
|
{
|
||||||
printf("%s\n", format_buffer);
|
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)
|
if (repetitions > 1)
|
||||||
{
|
{
|
||||||
@@ -80,8 +92,4 @@ main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
|
||||||
puts("Decoding failed.");
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,3 +14,6 @@ decode f266f3660f10c1 [SSE_MOVSS reg4:r0 reg4:r1]
|
|||||||
decode64 4890 [NOP]
|
decode64 4890 [NOP]
|
||||||
decode64 4990 [XCHG reg8:r8 reg8:r0]
|
decode64 4990 [XCHG reg8:r8 reg8:r0]
|
||||||
decode64 6690 [NOP]
|
decode64 6690 [NOP]
|
||||||
|
decode 66 PARTIAL
|
||||||
|
decode 0f PARTIAL
|
||||||
|
decode 80 PARTIAL
|
||||||
|
|||||||
Reference in New Issue
Block a user