/** * Gets the index into the context for the register * * @param reg the register * * @return the register index * @return -2 if the register is unknown * @return -1 if the register corresponds to a FP register */ static int get_udi_reg_context_offset(udi_register_e reg) { switch (reg) { REG_CASE(X86_GS); REG_CASE(X86_FS); REG_CASE(X86_ES); REG_CASE(X86_DS); REG_CASE(X86_EDI); REG_CASE(X86_ESI); REG_CASE(X86_EBP); REG_CASE(X86_ESP); REG_CASE(X86_EBX); REG_CASE(X86_EDX); REG_CASE(X86_ECX); REG_CASE(X86_EAX); REG_CASE(X86_CS); REG_CASE(X86_SS); REG_CASE(X86_EIP); REG_CASE(X86_FLAGS); REG_CASE(X86_64_R8); REG_CASE(X86_64_R9); REG_CASE(X86_64_R10); REG_CASE(X86_64_R11); REG_CASE(X86_64_R12); REG_CASE(X86_64_R13); REG_CASE(X86_64_R14); REG_CASE(X86_64_R15); REG_CASE(X86_64_RDI); REG_CASE(X86_64_RSI); REG_CASE(X86_64_RBP); REG_CASE(X86_64_RBX); REG_CASE(X86_64_RDX); REG_CASE(X86_64_RAX); REG_CASE(X86_64_RCX); REG_CASE(X86_64_RSP); REG_CASE(X86_64_RIP); REG_CASE(X86_64_CSGSFS); REG_CASE(X86_64_FLAGS); case UDI_X86_ST0: case UDI_X86_ST1: case UDI_X86_ST2: case UDI_X86_ST3: case UDI_X86_ST4: case UDI_X86_ST5: case UDI_X86_ST6: case UDI_X86_ST7: case UDI_X86_64_ST0: case UDI_X86_64_ST1: case UDI_X86_64_ST2: case UDI_X86_64_ST3: case UDI_X86_64_ST4: case UDI_X86_64_ST5: case UDI_X86_64_ST6: case UDI_X86_64_ST7: case UDI_X86_64_XMM0: case UDI_X86_64_XMM1: case UDI_X86_64_XMM2: case UDI_X86_64_XMM3: case UDI_X86_64_XMM4: case UDI_X86_64_XMM5: case UDI_X86_64_XMM6: case UDI_X86_64_XMM7: case UDI_X86_64_XMM8: case UDI_X86_64_XMM9: case UDI_X86_64_XMM10: case UDI_X86_64_XMM11: case UDI_X86_64_XMM12: case UDI_X86_64_XMM13: case UDI_X86_64_XMM14: case UDI_X86_64_XMM15: return -1; default: return -2; } }
/** * Returns the FailBochs equivalent to a UDIS86 GPR identifier. * Attention: this only returns either 32-bit or 64-bit registers, no general IDs * @param udisReg the udis86 GPR ID * @returns the FailBochs GPR ID, usable with the BochsRegisterManager class */ static inline fail::GPRegisterId udisGPRToFailBochsGPR(ud_type_t udisReg) { #define REG_CASE(REG) case UD_R_##REG: return fail::RID_##REG switch (udisReg) { #if BX_SUPPORT_X86_64 // 64 bit register id's: REG_CASE(RAX); REG_CASE(RCX); REG_CASE(RDX); REG_CASE(RBX); REG_CASE(RSP); REG_CASE(RBP); REG_CASE(RSI); REG_CASE(RDI); REG_CASE(R8); REG_CASE(R9); REG_CASE(R10); REG_CASE(R11); REG_CASE(R12); REG_CASE(R13); REG_CASE(R14); REG_CASE(R15); #else REG_CASE(EAX); REG_CASE(ECX); REG_CASE(EDX); REG_CASE(EBX); REG_CASE(ESP); REG_CASE(EBP); REG_CASE(ESI); REG_CASE(EDI); #endif default: return fail::RID_LAST_GP_ID; } #undef REG_CASE }