From 713231f2639a39d44a9954e7f85b2c1b81f1cfa3 Mon Sep 17 00:00:00 2001 From: nkennedy <nkennedy@git.zephyr-software.com> Date: Fri, 3 Jan 2014 18:10:55 +0000 Subject: [PATCH] Some x64 register support. Anh, please review if this needs changing. ok nkennedy@ ip:peasoup Former-commit-id: 7b3cef9f9539b9114c52b07f1c94b34d76b3ecc6 --- libMEDSannotation/include/MEDS_Register.hpp | 2 +- libtransform/src/transform.cpp | 118 ++++++++++++++++---- 2 files changed, 97 insertions(+), 23 deletions(-) diff --git a/libMEDSannotation/include/MEDS_Register.hpp b/libMEDSannotation/include/MEDS_Register.hpp index 5452489f0..6e57372cd 100644 --- a/libMEDSannotation/include/MEDS_Register.hpp +++ b/libMEDSannotation/include/MEDS_Register.hpp @@ -8,7 +8,7 @@ namespace MEDS_Annotation class Register { public: - enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL }; + enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL, RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W, SIL, DIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B }; static RegisterName getRegister(std::string); static RegisterName getRegister(char *str); static bool is32bit(RegisterName); diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp index a744d63d7..f00cda0de 100644 --- a/libtransform/src/transform.cpp +++ b/libtransform/src/transform.cpp @@ -83,43 +83,80 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p string dataBits; dataBits.resize(1); - if (p_reg == Register::EAX) + if (p_reg == Register::EAX || p_reg == Register::RAX) { dataBits[0] = 0x50; } - else if (p_reg == Register::EBX) + else if (p_reg == Register::EBX || p_reg == Register::RBX) { dataBits[0] = 0x53; } - else if (p_reg == Register::ECX) + else if (p_reg == Register::ECX || p_reg == Register::RCX) { dataBits[0] = 0x51; } - else if (p_reg == Register::EDX) + else if (p_reg == Register::EDX || p_reg == Register::RDX) { dataBits[0] = 0x52; } - else if (p_reg == Register::ESI) + else if (p_reg == Register::ESI || p_reg == Register::RSI) { dataBits[0] = 0x56; } - else if (p_reg == Register::EDI) + else if (p_reg == Register::EDI || p_reg == Register::RDI) { dataBits[0] = 0x57; } - else if (p_reg == Register::EBP) + else if (p_reg == Register::EBP || p_reg == Register::RBP) { dataBits[0] = 0x55; } - else if (p_reg == Register::ESP) + else if (p_reg == Register::ESP || p_reg == Register::RSP) { dataBits[0] = 0x54; } else { - cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl; - assert(0); - return; + dataBits.resize(2); + dataBits[0] = 0x41; + if (p_reg == Register::R8) + { + dataBits[1] = 0x50; + } + else if (p_reg == Register::R9) + { + dataBits[1] = 0x51; + } + else if (p_reg == Register::R10) + { + dataBits[1] = 0x52; + } + else if (p_reg == Register::R11) + { + dataBits[1] = 0x53; + } + else if (p_reg == Register::R12) + { + dataBits[1] = 0x54; + } + else if (p_reg == Register::R13) + { + dataBits[1] = 0x55; + } + else if (p_reg == Register::R14) + { + dataBits[1] = 0x56; + } + else if (p_reg == Register::R15) + { + dataBits[1] = 0x57; + } + else + { + cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl; + assert(0); + return; + } } addInstruction(p_instr, dataBits, p_fallThrough, NULL); @@ -130,43 +167,80 @@ void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_ string dataBits; dataBits.resize(1); - if (p_reg == Register::EAX) + if (p_reg == Register::EAX || p_reg == Register::RAX) { dataBits[0] = 0x58; } - else if (p_reg == Register::EBX) + else if (p_reg == Register::EBX || p_reg == Register::RBX) { dataBits[0] = 0x5b; } - else if (p_reg == Register::ECX) + else if (p_reg == Register::ECX || p_reg == Register::RCX) { dataBits[0] = 0x59; } - else if (p_reg == Register::EDX) + else if (p_reg == Register::EDX || p_reg == Register::RDX) { dataBits[0] = 0x5a; } - else if (p_reg == Register::ESI) + else if (p_reg == Register::ESI || p_reg == Register::RSI) { dataBits[0] = 0x5e; } - else if (p_reg == Register::EDI) + else if (p_reg == Register::EDI || p_reg == Register::RDI) { dataBits[0] = 0x5f; } - else if (p_reg == Register::EBP) + else if (p_reg == Register::EBP || p_reg == Register::RBP) { dataBits[0] = 0x5d; } - else if (p_reg == Register::ESP) + else if (p_reg == Register::ESP || p_reg == Register::RSP) { dataBits[0] = 0x5c; } else { - cerr << "Transform::addPopRegister: unhandled register"; - assert(0); - return; + dataBits.resize(2); + dataBits[0] = 0x41; + if (p_reg == Register::R8) + { + dataBits[1] = 0x58; + } + else if (p_reg == Register::R9) + { + dataBits[1] = 0x59; + } + else if (p_reg == Register::R10) + { + dataBits[1] = 0x5a; + } + else if (p_reg == Register::R11) + { + dataBits[1] = 0x5b; + } + else if (p_reg == Register::R12) + { + dataBits[1] = 0x5c; + } + else if (p_reg == Register::R13) + { + dataBits[1] = 0x5d; + } + else if (p_reg == Register::R14) + { + dataBits[1] = 0x5e; + } + else if (p_reg == Register::R15) + { + dataBits[1] = 0x5f; + } + else + { + cerr << "Transform::addPopRegister: unhandled register"; + assert(0); + return; + } } addInstruction(p_instr, dataBits, p_fallThrough, NULL); -- GitLab