aboutsummaryrefslogtreecommitdiffstats
path: root/executor/executor_bsd.h
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2025-08-01 12:12:42 +0200
committerAlexander Potapenko <glider@google.com>2025-08-05 13:16:45 +0000
commit77ff614fa0319f7b4e99df29822d0590128bf00c (patch)
tree8103f61472890a7b8f9eaf417b3f185fa0d1c537 /executor/executor_bsd.h
parent0931f9bfa8eacf9840a2bd3f9def3cfb4349431e (diff)
executor: decouple kcov memory allocation from the trace
On different platforms and in different coverage collection modes the pointer to the beginning of kcov buffer may or may not differ from the pointer to the region that mmap() returned. Decouple these two pointers, so that the memory is always allocated and deallocated with cov->mmap_alloc_ptr and cov->mmap_alloc_size, and the buffer is accessed via cov->data and cov->data_size. I tried my best to not break Darwin and BSD, but I did not test them.
Diffstat (limited to 'executor/executor_bsd.h')
-rw-r--r--executor/executor_bsd.h22
1 files changed, 12 insertions, 10 deletions
diff --git a/executor/executor_bsd.h b/executor/executor_bsd.h
index b7cbdd4f5..88e1f46cb 100644
--- a/executor/executor_bsd.h
+++ b/executor/executor_bsd.h
@@ -71,7 +71,7 @@ static void cover_open(cover_t* cov, bool extra)
#if GOOS_freebsd
if (ioctl(cov->fd, KIOSETBUFSIZE, kCoverSize))
fail("ioctl init trace write failed");
- cov->mmap_alloc_size = kCoverSize * KCOV_ENTRY_SIZE;
+ cov->data_size = kCoverSize * KCOV_ENTRY_SIZE;
#elif GOOS_openbsd
unsigned long cover_size = kCoverSize;
if (ioctl(cov->fd, KIOSETBUFSIZE, &cover_size))
@@ -83,7 +83,7 @@ static void cover_open(cover_t* cov, bool extra)
if (ioctl(cov->fd, KIOREMOTEATTACH, &args))
fail("ioctl remote attach failed");
}
- cov->mmap_alloc_size = kCoverSize * (is_kernel_64_bit ? 8 : 4);
+ cov->data_size = kCoverSize * (is_kernel_64_bit ? 8 : 4);
#elif GOOS_netbsd
uint64_t cover_size;
if (extra) {
@@ -100,18 +100,20 @@ static void cover_open(cover_t* cov, bool extra)
if (ioctl(cov->fd, KCOV_IOC_SETBUFSIZE, &cover_size))
fail("ioctl init trace write failed");
}
- cov->mmap_alloc_size = cover_size * KCOV_ENTRY_SIZE;
+ cov->data_size = cover_size * KCOV_ENTRY_SIZE;
#endif
}
static void cover_mmap(cover_t* cov)
{
- if (cov->data != NULL)
+ if (cov->mmap_alloc_ptr != NULL)
fail("cover_mmap invoked on an already mmapped cover_t object");
+ cov->mmap_alloc_size = cov->data_size;
void* mmap_ptr = mmap(NULL, cov->mmap_alloc_size, PROT_READ | PROT_WRITE,
MAP_SHARED, cov->fd, 0);
if (mmap_ptr == MAP_FAILED)
fail("cover mmap failed");
+ cov->mmap_alloc_ptr = (char*)mmap_ptr;
cov->data = (char*)mmap_ptr;
cov->data_end = cov->data + cov->mmap_alloc_size;
cov->data_offset = is_kernel_64_bit ? sizeof(uint64_t) : sizeof(uint32_t);
@@ -120,13 +122,13 @@ static void cover_mmap(cover_t* cov)
static void cover_protect(cover_t* cov)
{
- if (cov->data == NULL)
+ if (cov->mmap_alloc_ptr == NULL)
fail("cover_protect invoked on an unmapped cover_t object");
#if GOOS_freebsd
size_t mmap_alloc_size = kCoverSize * KCOV_ENTRY_SIZE;
long page_size = sysconf(_SC_PAGESIZE);
if (page_size > 0)
- mprotect(cov->data + page_size, mmap_alloc_size - page_size,
+ mprotect(cov->mmap_alloc_ptr + page_size, mmap_alloc_size - page_size,
PROT_READ);
#elif GOOS_openbsd
int mib[2], page_size;
@@ -135,20 +137,20 @@ static void cover_protect(cover_t* cov)
mib[1] = HW_PAGESIZE;
size_t len = sizeof(page_size);
if (sysctl(mib, ARRAY_SIZE(mib), &page_size, &len, NULL, 0) != -1)
- mprotect(cov->data + page_size, mmap_alloc_size - page_size, PROT_READ);
+ mprotect(cov->mmap_alloc_ptr + page_size, mmap_alloc_size - page_size, PROT_READ);
#endif
}
static void cover_unprotect(cover_t* cov)
{
- if (cov->data == NULL)
+ if (cov->mmap_alloc_ptr == NULL)
fail("cover_unprotect invoked on an unmapped cover_t object");
#if GOOS_freebsd
size_t mmap_alloc_size = kCoverSize * KCOV_ENTRY_SIZE;
- mprotect(cov->data, mmap_alloc_size, PROT_READ | PROT_WRITE);
+ mprotect(cov->mmap_alloc_ptr, mmap_alloc_size, PROT_READ | PROT_WRITE);
#elif GOOS_openbsd
size_t mmap_alloc_size = kCoverSize * sizeof(uintptr_t);
- mprotect(cov->data, mmap_alloc_size, PROT_READ | PROT_WRITE);
+ mprotect(cov->mmap_alloc_ptr, mmap_alloc_size, PROT_READ | PROT_WRITE);
#endif
}