From 58cec31b9a45a641716b6a92044233287558ba07 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 17 Apr 2011 15:34:08 +0000 Subject: [PATCH] Added the "fchs", "fclex" and "fnclex" instructions --- src/arch/i386.h | 13 +++++++++++++ src/arch/i386.ins | 11 +++++++++++ test/i386.S | 3 +++ 3 files changed, 27 insertions(+) diff --git a/src/arch/i386.h b/src/arch/i386.h index ec918f2..de1d01a 100644 --- a/src/arch/i386.h +++ b/src/arch/i386.h @@ -34,6 +34,7 @@ static int _write_immediate(ArchPlugin * plugin, ArchOperandDefinition definition, ArchOperand * operand); static int _write_immediate8(ArchPlugin * plugin, uint8_t value); static int _write_immediate16(ArchPlugin * plugin, uint16_t value); +static int _write_immediate24(ArchPlugin * plugin, uint32_t value); static int _write_immediate32(ArchPlugin * plugin, uint32_t value); static int _write_opcode(ArchPlugin * plugin, ArchInstruction * instruction); static int _write_operand(ArchPlugin * plugin, uint32_t * i, @@ -136,6 +137,8 @@ static int _write_immediate(ArchPlugin * plugin, return _write_immediate8(plugin, value); case sizeof(uint16_t): return _write_immediate16(plugin, value); + case 3: + return _write_immediate24(plugin, value); case sizeof(uint32_t): return _write_immediate32(plugin, value); default: @@ -160,6 +163,15 @@ static int _write_immediate16(ArchPlugin * plugin, uint16_t value) return 0; } +static int _write_immediate24(ArchPlugin * plugin, uint32_t value) +{ + value = _htol32(value) >> 8; + if(fwrite(&value, 3, 1, plugin->helper->fp) != 1) + return -error_set_code(1, "%s: %s", plugin->helper->filename, + strerror(errno)); + return 0; +} + static int _write_immediate32(ArchPlugin * plugin, uint32_t value) { value = _htol32(value); @@ -188,6 +200,7 @@ static int _write_opcode(ArchPlugin * plugin, ArchInstruction * instruction) operand.value.immediate.value = _htob16( instruction->opcode); break; + case 3: case sizeof(uint32_t): operand.value.immediate.value = _htob32( instruction->opcode); diff --git a/src/arch/i386.ins b/src/arch/i386.ins index 1839c6a..710c4bc 100644 --- a/src/arch/i386.ins +++ b/src/arch/i386.ins @@ -43,6 +43,7 @@ /* opcodes */ #define OP1F (8 << AOD_SIZE) #define OP2F (16 << AOD_SIZE) +#define OP3F (24 << AOD_SIZE) /* operands */ /* registers */ @@ -399,9 +400,19 @@ { "faddp", 0xdec5, OP2F, OP_st5, OP_st0, AOT_NONE }, { "faddp", 0xdec6, OP2F, OP_st6, OP_st0, AOT_NONE }, { "faddp", 0xdec7, OP2F, OP_st7, OP_st0, AOT_NONE }, +/* FBLD 0xdf /4 1 m80dec */ +/* FIXME implement */ +/* FBSTP 0xdf /6 1 m80bcd */ +/* FCHS 0xd9e0 2 */ +{ "fchs", 0xd9e0, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* FCLEX 0x9bdbe2 3 */ +{ "fclex", 0x9bdbe2, OP3F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* FIXME implement */ /* FIADD 0xda /0 1 m32int */ /* FIXME implement */ /* FIADD 0xde /0 1 m64int */ +/* FNCLEX 0xdbe2 2 */ +{ "fnclex", 0xdbe2, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, /* FIXME implement */ /* NOP 0x90 1 */ { "nop", 0x90, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, diff --git a/test/i386.S b/test/i386.S index f0369ad..9e29714 100644 --- a/test/i386.S +++ b/test/i386.S @@ -141,4 +141,7 @@ faddp %st5, %st0 faddp %st6, %st0 faddp %st7, %st0 + fchs + fclex + fnclex nop /* 0x90 */