aboutsummaryrefslogtreecommitdiffstats
path: root/executor
diff options
context:
space:
mode:
Diffstat (limited to 'executor')
-rw-r--r--executor/executor.cc19
-rw-r--r--executor/executor_linux.h6
-rw-r--r--executor/test.h4
3 files changed, 19 insertions, 10 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index ab8ae3d6c..19aa45e81 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -95,6 +95,7 @@ const int kOutFd = 4;
static uint32* output_data;
static uint32* output_pos;
static uint32* write_output(uint32 v);
+static uint32* write_output_64(uint64 v);
static void write_completed(uint32 completed);
static uint32 hash(uint32 a);
static bool dedup(uint32 sig);
@@ -1308,6 +1309,15 @@ uint32* write_output(uint32 v)
return output_pos++;
}
+uint32* write_output_64(uint64 v)
+{
+ if (output_pos < output_data || (char*)(output_pos + 1) >= (char*)output_data + kMaxOutput)
+ fail("output overflow: pos=%p region=[%p:%p]",
+ output_pos, output_data, (char*)output_data + kMaxOutput);
+ *(uint64*)output_pos = v;
+ return output_pos + 2;
+}
+
void write_completed(uint32 completed)
{
__atomic_store_n(output_data, completed, __ATOMIC_RELEASE);
@@ -1344,13 +1354,10 @@ void kcov_comparison_t::write()
if (!is_size_8) {
write_output((uint32)arg1);
write_output((uint32)arg2);
- return;
+ } else {
+ write_output_64(arg1);
+ write_output_64(arg2);
}
- // If we have 64 bits arguments then write them in Little-endian.
- write_output((uint32)(arg1 & 0xFFFFFFFF));
- write_output((uint32)(arg1 >> 32));
- write_output((uint32)(arg2 & 0xFFFFFFFF));
- write_output((uint32)(arg2 >> 32));
}
bool kcov_comparison_t::ignore() const
diff --git a/executor/executor_linux.h b/executor/executor_linux.h
index 47804f4f4..98b89fc9a 100644
--- a/executor/executor_linux.h
+++ b/executor/executor_linux.h
@@ -167,8 +167,10 @@ static void cover_reset(cover_t* cov)
static void cover_collect(cover_t* cov)
{
- // Note: this assumes little-endian kernel.
- cov->size = *(uint32*)cov->data;
+ if (is_kernel_64_bit)
+ cov->size = *(uint64*)cov->data;
+ else
+ cov->size = *(uint32*)cov->data;
}
static bool cover_check(uint32 pc)
diff --git a/executor/test.h b/executor/test.h
index 1f940eb71..0d3587b84 100644
--- a/executor/test.h
+++ b/executor/test.h
@@ -8,7 +8,7 @@
static int test_copyin()
{
static uint16 buf[3];
- STORE_BY_BITMASK(uint16, , &buf[1], 0x1234, 0, 16);
+ STORE_BY_BITMASK(uint16, htole16, &buf[1], 0x1234, 0, 16);
unsigned char x[sizeof(buf)];
memcpy(x, buf, sizeof(x));
if (x[0] != 0 || x[1] != 0 ||
@@ -18,7 +18,7 @@ static int test_copyin()
x[0], x[1], x[2], x[3], x[4], x[5]);
return 1;
}
- STORE_BY_BITMASK(uint16, , &buf[1], 0x555a, 5, 4);
+ STORE_BY_BITMASK(uint16, htole16, &buf[1], 0x555a, 5, 4);
memcpy(x, buf, sizeof(x));
if (x[0] != 0 || x[1] != 0 ||
x[2] != 0x54 || x[3] != 0x13 ||