From 0f6c8313b78b9bc292a36388b23436d0e71a8fd9 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Mon, 18 Jun 2012 15:19:24 +0300 Subject: [PATCH] Port crasher to FreeBSD. --- tests/crasher.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tests/crasher.c b/tests/crasher.c index 65e1b7ee..72cd54d6 100644 --- a/tests/crasher.c +++ b/tests/crasher.c @@ -3,11 +3,17 @@ #include #include #include +#include +#ifdef __FreeBSD__ +#include +#include +#include +#endif void a(void) __attribute__((noinline)); void b(int x) __attribute__((noinline)); -#ifdef __linux__ +#if defined(__linux__) void write_maps(char *fname) { char buf[512], path[128]; @@ -35,6 +41,48 @@ void write_maps(char *fname) fclose(out); fclose(maps); } +#elif defined(__FreeBSD__) +void +write_maps(char *fname) +{ + FILE *out; + char *buf, *bp, *eb; + struct kinfo_vmentry *kv; + int mib[4], error; + size_t len; + + out = fopen(fname, "w"); + if (out == NULL) + exit(EXIT_FAILURE); + + len = 0; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_VMMAP; + mib[3] = getpid(); + error = sysctl(mib, 4, NULL, &len, NULL, 0); + if (error == -1) + exit(EXIT_FAILURE); + len = len * 4 / 3; + buf = malloc(len); + if (buf == NULL) + exit(EXIT_FAILURE); + error = sysctl(mib, 4, buf, &len, NULL, 0); + if (error == -1) + exit(EXIT_FAILURE); + + for (bp = buf, eb = buf + len; bp < eb; bp += kv->kve_structsize) { + kv = (struct kinfo_vmentry *)(uintptr_t)bp; + if (kv->kve_type == KVME_TYPE_VNODE && + (kv->kve_protection & KVME_PROT_EXEC) != 0) { + fprintf(out, "0x%jx:%s ", kv->kve_start, kv->kve_path); + } + } + + fprintf(out, "\n"); + fclose(out); + free(buf); +} #else #error Port me #endif