From fd0962aa32f91839750333747a764b13d427c6f0 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Sun, 4 Dec 2011 15:14:35 +0000
Subject: [PATCH] Added exit policy for each callback

Former-commit-id: 7d3690fb30ebba4f1a0231d2ad204eb3e0906e9c
---
 libtransform/src/integertransform.cpp |  8 +++++--
 libtransform/src/transform.cpp        | 30 +++++++++++++++++++++++++--
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/libtransform/src/integertransform.cpp b/libtransform/src/integertransform.cpp
index b493eb224..e25ee02e9 100644
--- a/libtransform/src/integertransform.cpp
+++ b/libtransform/src/integertransform.cpp
@@ -211,7 +211,12 @@ void IntegerTransform::addOverflowCheckNoFlag(Instruction_t *p_instruction, cons
 		int value = leaPattern.getConstant();
 		Register::RegisterName target = getTargetRegister(p_instruction);
 
-		if (reg1 == Register::UNKNOWN || target == Register::UNKNOWN)
+		if (p_annotation.isUnsigned() && value < 0)
+		{
+			cerr << "IntegerTransform::addOverflowCheckNoFlag(): lea reg+neg constant pattern: skip this annotation type (prone to false positives)" << endl;
+			return;
+		}
+		else if (reg1 == Register::UNKNOWN || target == Register::UNKNOWN)
 		{
 			cerr << "IntegerTransform::addOverflowCheckNoFlag(): lea reg+constant pattern: error retrieving register:" << "reg1: " << Register::toString(reg1) << " target: " << Register::toString(target) << endl;
 			return;
@@ -634,7 +639,6 @@ void IntegerTransform::addTruncationCheck(Instruction_t *p_instruction, const ME
 	}
 
 	addNop(nop_i, popf_i);
-	nop_i->SetComment(string("NOP NOP"));
 	addCallbackHandler(detector, originalInstrumentInstr, nop_i, popf_i, p_instruction->GetAddress());
 	addPopf(popf_i, originalInstrumentInstr);
 }
diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp
index b99651e20..dca156d61 100644
--- a/libtransform/src/transform.cpp
+++ b/libtransform/src/transform.cpp
@@ -3,6 +3,11 @@
 using namespace libTransform;
 using namespace MEDS_Annotation;
 
+// make sure these match values in detector_handlers.h in the strata library
+#define POLICY_DEFAULT  0   // use default strata policy
+#define POLICY_CONTINUE 1   // override strata policy 
+#define POLICY_EXIT     2   // override strata policy
+
 Transform::Transform(VariantID_t *p_variantID, VariantIR_t *p_variantIR, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions)
 {
 	m_variantID = p_variantID;                  // Current variant ID
@@ -248,9 +253,11 @@ void Transform::addCallbackHandler(string p_detector, Instruction_t *p_instrumen
  	// create and register new instructions (and addresses)
 	Instruction_t* pusha_i = allocateNewInstruction(fileID, func);
 	Instruction_t* pushf_i = allocateNewInstruction(fileID, func);
+	Instruction_t* pushPolicy_i = allocateNewInstruction(fileID, func);
 	Instruction_t* pusharg_i = allocateNewInstruction(fileID, func);
 	Instruction_t* pushret_i = allocateNewInstruction(fileID, func);
 	Instruction_t* poparg_i = allocateNewInstruction(fileID, func);
+	Instruction_t* popPolicy_i = allocateNewInstruction(fileID, func);
 	Instruction_t* popf_i = allocateNewInstruction(fileID, func);
 	Instruction_t* popa_i = allocateNewInstruction(fileID, func);
 
@@ -267,7 +274,20 @@ void Transform::addCallbackHandler(string p_detector, Instruction_t *p_instrumen
 	pusha_i->SetComment(pusha_i->GetComment() + " -- start of callback handler sequence");
 
 	// pushf   
-	addPushf(pushf_i, pusharg_i);
+	addPushf(pushf_i, pushPolicy_i);
+
+	// push detector exit policy
+	//     0 - default
+	//     1 - continue
+	//     2 - exit
+	dataBits.resize(5);
+	dataBits[0] = 0x68;
+	int policy = POLICY_DEFAULT; 
+	int *tmpi = (int *) &dataBits[1];
+	*tmpi = policy;
+	pushPolicy_i->SetDataBits(dataBits);
+	pushPolicy_i->SetComment(pushPolicy_i->getDisassembly());
+	pushPolicy_i->SetFallthrough(pusharg_i); 
 
 	// push (PC of instrumented instruction)
 	dataBits.resize(5);
@@ -295,10 +315,16 @@ void Transform::addCallbackHandler(string p_detector, Instruction_t *p_instrumen
 	dataBits[0] = 0x58;
 	poparg_i->SetDataBits(dataBits);
 	poparg_i->SetComment(poparg_i->getDisassembly() + " -- with callback to " + p_detector + " orig: " + p_instruction->GetComment()) ;
-	poparg_i->SetFallthrough(popf_i); 
+	poparg_i->SetFallthrough(popPolicy_i); 
 	poparg_i->SetIndirectBranchTargetAddress(poparg_i->GetAddress());  
 	poparg_i->SetCallback(p_detector); 
 
+	// popPolicy
+	dataBits.resize(1);
+	dataBits[0] = 0x58;
+	popPolicy_i->SetDataBits(dataBits);
+	popPolicy_i->SetFallthrough(popf_i); 
+
 	// popf   
 	addPopf(popf_i, popa_i);
 
-- 
GitLab