From e21c08bcbefc99ab1c0c9bc73fe19e7620081f55 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Mon, 15 Apr 2013 22:48:10 +0000
Subject: [PATCH] Added support for missing registers in utility functions

Former-commit-id: 3361d500096e10cf0d1276472b32ba7fb21cc6ab
---
 libtransform/src/integertransform.cpp | 17 +++++----
 libtransform/src/transform.cpp        | 52 +++++++++++++++++++++++++--
 2 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/libtransform/src/integertransform.cpp b/libtransform/src/integertransform.cpp
index ff87b900a..5e35a7c98 100644
--- a/libtransform/src/integertransform.cpp
+++ b/libtransform/src/integertransform.cpp
@@ -565,16 +565,20 @@ void IntegerTransform::addOverflowCheckNoFlag_RegTimesConstant(Instruction_t *p_
 
 void IntegerTransform::handleTruncation(Instruction_t *p_instruction, const MEDS_InstructionCheckAnnotation& p_annotation, int p_policy)
 {
-	if (p_annotation.getTruncationFromWidth() == 32 && (p_annotation.getTruncationToWidth() == 16 || p_annotation.getTruncationToWidth() == 8))
+	if (p_annotation.getTruncationFromWidth() == 32)
 	{
-		addTruncationCheck(p_instruction, p_annotation, p_policy);
-	}
-	else
-	{
-		cerr << "integertransform: TRUNCATION annotation not yet handled: " << p_annotation.toString() << "fromWidth: " << p_annotation.getTruncationFromWidth() << " toWidth: " << p_annotation.getTruncationToWidth() << endl;
+		if (p_annotation.getTruncationToWidth() == 8 || p_annotation.getTruncationToWidth() == 16)
+		{
+			addTruncationCheck(p_instruction, p_annotation, p_policy);
+		}
+		else
+		{
+			cerr << "integertransform: TRUNCATION annotation not yet handled: " << p_annotation.toString() << "fromWidth: " << p_annotation.getTruncationFromWidth() << " toWidth: " << p_annotation.getTruncationToWidth() << endl;
+		}
 	}
 }
 
+
 //
 // before:       after:
 // <inst>        nop (with callback handler)
@@ -869,6 +873,7 @@ void IntegerTransform::addTruncationCheck(Instruction_t *p_instruction, const ME
 	assert(getFileIR() && p_instruction);
 	assert(p_annotation.getTruncationFromWidth() == 32 && p_annotation.getTruncationToWidth() == 8 || p_annotation.getTruncationToWidth() == 16);
 
+//	cerr << "IntegerTransform::addTruncationCheck(): instr: [" << p_instruction->getDisassembly() << "] address: " << p_instruction->GetAddress() << " annotation: " << p_annotation.toString() << " policy: " << p_policy << endl;
 	cerr << "IntegerTransform::addTruncationCheck(): instr: " << p_instruction->getDisassembly() << " address: " << p_instruction->GetAddress() << " annotation: " << p_annotation.toString() << " policy: " << p_policy << endl;
 	string detector; 
 
diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp
index b4b9c22fd..f5c9eb418 100644
--- a/libtransform/src/transform.cpp
+++ b/libtransform/src/transform.cpp
@@ -3,6 +3,9 @@
 using namespace libTransform;
 using namespace MEDS_Annotation;
 
+// 20130415 Anh added support for additional registers for various utility functions
+// 20130415 Anh added assert() statements for unhandled registers
+
 Transform::Transform(VariantID_t *p_variantID, FileIR_t *p_fileIR, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions)
 {
 	m_variantID = p_variantID;                  // Current variant ID
@@ -100,7 +103,8 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p
 	}
 	else
 	{
-		cerr << "Transform::addPushRegister: unhandled register";
+		cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl;
+		assert(0);
 		return;
 	}
 
@@ -147,6 +151,7 @@ void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_
 	else
 	{
 		cerr << "Transform::addPopRegister: unhandled register";
+		assert(0);
 		return;
 	}
 
@@ -458,6 +463,7 @@ void Transform::addTestRegister8(Instruction_t *p_instr, Register::RegisterName
 	else
 	{
 		cerr << "Transform::addTestRegister8(): unhandled register" << endl;
+		assert(0);
 		return;
 	}
 
@@ -492,9 +498,26 @@ void Transform::addTestRegister16(Instruction_t *p_instr, Register::RegisterName
 		dataBits[1] = 0x85;
 		dataBits[2] = 0xd2;
 	}
+	else if (p_reg == Register::BP)
+	{
+		assert(0);
+	}
+	else if (p_reg == Register::SP)
+	{
+		assert(0);
+	}
+	else if (p_reg == Register::SI)
+	{
+		assert(0);
+	}
+	else if (p_reg == Register::DI)
+	{
+		assert(0);
+	}
 	else
 	{
 		cerr << "Transform::addTestRegister16(): unhandled register" << endl;
+		assert(0);
 		return;
 	}
 
@@ -549,6 +572,7 @@ void Transform::addTestRegister32(Instruction_t *p_instr, Register::RegisterName
 	else
 	{
 		cerr << "Transform::addTestRegister32(): unhandled register" << endl;
+		assert(0);
 		return;
 	}
 
@@ -620,9 +644,24 @@ void Transform::addTestRegisterMask32(Instruction_t *p_instr, Register::Register
 		tmp = (unsigned *) &dataBits[2];
 		*tmp = p_mask;
 	}
+	else if (p_reg == Register::EBP)
+	{
+		dataBits[0] = 0xf7;
+		dataBits[1] = 0xc5;
+		tmp = (unsigned *) &dataBits[2];
+		*tmp = p_mask;
+	}
+	else if (p_reg == Register::ESP)
+	{
+		dataBits[0] = 0xf7;
+		dataBits[1] = 0xc4;
+		tmp = (unsigned *) &dataBits[2];
+		*tmp = p_mask;
+	}
 	else
 	{
-		cerr << "Transform::addTestRegisterMask32(): unhandled register" << endl;
+		cerr << "Transform::addTestRegisterMask32(): unhandled register: " << p_reg << endl;
+		assert(0);
 		return;
 	}
 
@@ -680,6 +719,7 @@ void Transform::addCmpRegisterMask32(Instruction_t *p_instr, Register::RegisterN
      else
      {
        cerr << "Transform::addCmpRegisterMask32(): unhandled register" << endl;
+		assert(0);
        return;
      }
    }
@@ -838,6 +878,7 @@ void Transform::addNot(Instruction_t *p_instr, Register::RegisterName p_reg, Ins
 	else
 	{
 		cerr << "Transform::addNot(): unhandled register" << endl;
+		assert(0);
 		return;
 	}
 
@@ -852,6 +893,7 @@ void Transform::addAddRegisters(Instruction_t *p_instr, Register::RegisterName p
 	if (!p_instr->Assemble(assembly))
 	{
 		cerr << "addAddRegisters(): error in assembling instruction: " << assembly << endl;
+		assert(0);
 		return;
 	}
 
@@ -868,6 +910,7 @@ void Transform::addAddRegisterConstant(Instruction_t *p_instr, Register::Registe
 	if (!p_instr->Assemble(assembly))
 	{
 		cerr << "Transform::addAddConstant(): error in assembling instruction: " << assembly << endl;
+		assert(0);
 		return;
 	}
 
@@ -885,6 +928,7 @@ void Transform::addMulRegisterConstant(Instruction_t *p_instr, Register::Registe
 	if (!p_instr->Assemble(assembly))
 	{
 		cerr << "Transform::addMulRegisterConstant(): error in assembling instruction: " << assembly << endl;
+		assert(0);
 		return;
 	}
 
@@ -901,6 +945,7 @@ void Transform::addMovRegisters(Instruction_t *p_instr, Register::RegisterName p
 	if (!p_instr->Assemble(assembly))
 	{
 		cerr << "addMovRegisters(): error in assembling instruction: " << assembly << endl;
+		assert(0);
 		return;
 	}
 	p_instr->SetFallthrough(p_fallThrough);
@@ -918,6 +963,7 @@ void Transform::addMovRegisterSignedConstant(Instruction_t *p_instr, Register::R
     if (!p_instr->Assemble(assembly))
     {
         cerr << "addMovRegisterSignedConstant(): error in assembling instruction: " << assembly << endl;
+		assert(0);
         return;
     }
 
@@ -936,6 +982,7 @@ void Transform::addMovRegisterUnsignedConstant(Instruction_t *p_instr, Register:
     if (!p_instr->Assemble(assembly))
     {
         cerr << "addMovRegisterSignedConstant(): error in assembling instruction: " << assembly << endl;
+		assert(0);
         return;
     }
 
@@ -955,6 +1002,7 @@ void Transform::addAndRegister32Mask(Instruction_t *p_instr, Register::RegisterN
     if (!p_instr->Assemble(assembly))
     {
         cerr << "addAndRegisterMask(): error in assembling instruction: " << assembly << endl;
+		assert(0);
         return;
     }
 
-- 
GitLab