Skip to content
Snippets Groups Projects
Commit 1224d433 authored by whh8b's avatar whh8b
Browse files

Add support for nop-ing fallthrough patches

Any patch whose target immediately follows can be
turned into a five byte nop. This is not 100% ideal
but it is a good start to test whether this optimization
is worthwhile.
parent 23a4f93e
Branches 1-zipr-induces-dlopen-bug
Tags CfarJuly2018Eval
No related merge requests found
......@@ -50,6 +50,7 @@ class ZiprImpl_t : public Zipr_t
m_objcopy("objcopy", "/usr/bin/objcopy"),
m_replop("replop", false),
m_verbose("verbose", true),
m_apply_nop("apply_nop", false),
m_variant("variant"),
m_architecture("architecture"),
m_seed("seed", 0)
......@@ -96,6 +97,7 @@ class ZiprImpl_t : public Zipr_t
void PatchInstruction(RangeAddress_t addr, libIRDB::Instruction_t* insn);
void RewritePCRelOffset(RangeAddress_t from_addr,RangeAddress_t to_addr, int insn_length, int offset_pos);
void ApplyPatch(RangeAddress_t from_addr, RangeAddress_t to_addr);
void ApplyNopToPatch(RangeAddress_t addr);
void PatchCall(RangeAddress_t at_addr, RangeAddress_t to_addr);
void CallToNop(RangeAddress_t at_addr);
......@@ -175,7 +177,7 @@ class ZiprImpl_t : public Zipr_t
// Options
ZiprOptions_t m_zipr_options;
ZiprStringOption_t m_output_filename, m_callbacks, m_objcopy;
ZiprBooleanOption_t m_replop, m_verbose;
ZiprBooleanOption_t m_replop, m_verbose, m_apply_nop;
ZiprIntegerOption_t m_variant, m_architecture, m_seed;
};
......
......@@ -166,6 +166,7 @@ ZiprOptionsNamespace_t *ZiprImpl_t::RegisterOptions(ZiprOptionsNamespace_t *glob
m_variant.SetRequired(true);
m_verbose.SetDescription("Enable verbose output");
m_apply_nop.SetDescription("Apply NOP to patches that fallthrough.");
m_variant.SetDescription("Variant ID.");
m_output_filename.SetDescription("Output file name.");
m_architecture.SetDescription("Override default system "
......@@ -189,6 +190,7 @@ ZiprOptionsNamespace_t *ZiprImpl_t::RegisterOptions(ZiprOptionsNamespace_t *glob
global->AddOption(&m_variant);
global->AddOption(&m_verbose);
global->AddOption(&m_apply_nop);
zipr_namespace->MergeNamespace(memory_space.RegisterOptions(global));
return zipr_namespace;
......@@ -1441,6 +1443,10 @@ void ZiprImpl_t::ApplyPatches(Instruction_t* to_insn)
// Patch instruction
//
ApplyPatch(from_addr, to_addr);
if ((from_addr + 5) == to_addr) {
cout << "NOP conversion applicable." << endl;
ApplyNopToPatch(from_addr);
}
}
// removing resolved patches
......@@ -1694,6 +1700,29 @@ void ZiprImpl_t::RewritePCRelOffset(RangeAddress_t from_addr,RangeAddress_t to_a
memory_space[from_addr+offset_pos+3]=(new_offset>>24)&0xff;
}
void ZiprImpl_t::ApplyNopToPatch(RangeAddress_t addr)
{
/*
* TODO: Add assertion that this is really a patch.
*/
if (!m_apply_nop)
{
if (m_verbose)
cout << "Skipping chance to apply nop to fallthrough patch." << endl;
return;
}
assert(true);
/*
* 0F 1F 44 00 00H
*/
memory_space[addr] = (unsigned char)0x0F;
memory_space[addr+1] = (unsigned char)0x1F;
memory_space[addr+2] = (unsigned char)0x44;
memory_space[addr+3] = (unsigned char)0x00;
memory_space[addr+4] = (unsigned char)0x00;
}
void ZiprImpl_t::ApplyPatch(RangeAddress_t from_addr, RangeAddress_t to_addr)
{
unsigned char insn_first_byte=memory_space[from_addr];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment