From 9365c9528cd67cb44e6bf88ed6e325dcd8b18b41 Mon Sep 17 00:00:00 2001
From: Will Hawkins <whh8b@virginia.edu>
Date: Tue, 24 Jul 2018 07:13:35 +0000
Subject: [PATCH] Match gap-filling scoop's perm with adjacent scoop

Fixes #8. This will match the gap-filling scoop's perms
with those of the adjacent scoop. Then, for any
gap-filling scoops that are not executable, fill their
contents with f4s.
---
 src/zipr.cpp | 64 ++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 49 insertions(+), 15 deletions(-)

diff --git a/src/zipr.cpp b/src/zipr.cpp
index 2439c5d..e1c832d 100644
--- a/src/zipr.cpp
+++ b/src/zipr.cpp
@@ -579,13 +579,16 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 			cout << "There's a scoop between " << std::hex
 			     << this_scoop->GetStart()->GetVirtualOffset()
 			     << " and " << std::hex << this_scoop->GetEnd()->GetVirtualOffset()
+			     << " with permissions " << std::hex << this_scoop->getRawPerms()
 			     << endl;
 
 		if (std::next(it,1) != sorted_scoop_set.end())
 		{
 			next_scoop = *std::next(it,1);
 			next_start = next_scoop->GetStart()->GetVirtualOffset();
-
+			unsigned int new_padding_scoop_size = 0;
+			RangeAddress_t new_padding_scoop_start = this_end + 1;
+			RangeAddress_t new_padding_scoop_end = next_start - 1;
 
 			if (this_end > next_start) {
 				/*
@@ -600,27 +603,53 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 				continue;
 			}
 
-			if ((next_start - this_end) > (unsigned int)m_paddable_minimum_distance)
+			if (m_verbose)
+				cout << "Considering a gap between: 0x" << std::hex 
+				     << new_padding_scoop_start << "-0x"
+				     << std::hex << new_padding_scoop_end
+				     << endl;
+
+			if (this_scoop->isWriteable())
+			{
+				new_padding_scoop_start = page_round_up(new_padding_scoop_start);
+
+				if (m_verbose)
+					cout << "Adjacent scoop is writable. Adjusting start up to 0x"
+					     << std::hex << new_padding_scoop_start << "." << endl;
+			}
+
+			if (next_scoop->isWriteable())
+			{
+				new_padding_scoop_end = page_round_down(new_padding_scoop_end);
+
+				if (m_verbose)
+					cout << "Next scoop is writable. Adjusting end down to 0x"
+					     << std::hex << new_padding_scoop_end << "." << endl;
+			}
+
+			new_padding_scoop_size = new_padding_scoop_start - new_padding_scoop_end;
+			if ((new_padding_scoop_size>(unsigned int)m_paddable_minimum_distance) &&
+			    (!this_scoop->isWriteable() || !next_scoop->isWriteable())
+				 )
 			{
 				DataScoop_t *new_padding_scoop = nullptr;
-				AddressID_t *new_padding_scoop_start_addr = new AddressID_t(),
-				            *new_padding_scoop_end_addr = new AddressID_t();
-				RangeAddress_t new_padding_scoop_start, new_padding_scoop_end;
 				string new_padding_scoop_contents, new_padding_scoop_name;
-
-				//new_padding_scoop_start = page_round_up(this_end + 1);
-				new_padding_scoop_start = this_end + 1;
-				//new_padding_scoop_end = page_round_down(next_start - 1);
-				new_padding_scoop_end = next_start - 1;
+				int new_padding_scoop_perms = 0x5;
+				AddressID_t *new_padding_scoop_start_addr = nullptr,
+				            *new_padding_scoop_end_addr = nullptr;
 
 				new_padding_scoop_name = "zipr_scoop_"+
 				                         to_string(new_padding_scoop_start);
 
+				new_padding_scoop_start_addr = new AddressID_t();
+				new_padding_scoop_end_addr = new AddressID_t();
 				new_padding_scoop_start_addr->SetVirtualOffset(new_padding_scoop_start);
 				new_padding_scoop_end_addr->SetVirtualOffset(new_padding_scoop_end);
+				m_firp->GetAddresses().insert(new_padding_scoop_start_addr);
+				m_firp->GetAddresses().insert(new_padding_scoop_end_addr);
 
-				cout << "New free space: 0x" << std::hex << new_padding_scoop_start
-				     << "-0x"
+				cout << "Gap filling with a scoop between 0x"
+				     << std::hex << new_padding_scoop_start << " and 0x"
 				     << std::hex << new_padding_scoop_end
 				     << endl;
 
@@ -629,16 +658,20 @@ void ZiprImpl_t::FindFreeRanges(const std::string &name)
 				                                    new_padding_scoop_start_addr,
 				                                    new_padding_scoop_end_addr,
 				                                    NULL,
-				                                    5,
+				                                    new_padding_scoop_perms,
 				                                    false,
 				                                    new_padding_scoop_contents);
 				new_padding_scoop_contents.resize(new_padding_scoop->GetSize());
 				new_padding_scoop->SetContents(new_padding_scoop_contents);
 
+				/*
+				 * Insert this scoop into a list of scoops that Zipr added.
+				 */
 				m_zipr_scoops.insert(new_padding_scoop);
-				m_firp->GetAddresses().insert(new_padding_scoop_start_addr);
-				m_firp->GetAddresses().insert(new_padding_scoop_end_addr);
 
+				/*
+				 * Tell Zipr that it can put executable code in this section.
+				 */
 				memory_space.AddFreeRange(Range_t(new_padding_scoop_start,
 				                                  new_padding_scoop_end), true);
 			}
@@ -4244,6 +4277,7 @@ void ZiprImpl_t::UpdateScoops()
 			++it;
 			continue;
 		}
+
 		assert(m_zipr_scoops.find(scoop)!=m_zipr_scoops.end());
 
 		/*
-- 
GitLab