diff options
Diffstat (limited to 'executor')
| -rw-r--r-- | executor/executor.cc | 19 | ||||
| -rw-r--r-- | executor/executor_linux.h | 6 | ||||
| -rw-r--r-- | executor/test.h | 4 |
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 || |
