/** * memcheck.C: Invoke valgrind's memcheck while running. * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. * * * Portions of this file were derived from sources bearing the following license: * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in doc/pod/gplicense.pod. * * $Id: memcheck.C,v 1.6 2007/09/22 14:27:28 pippijn Exp $ */ #include "atheme.h" #include #ifdef HAVE_VALGRIND_MEMCHECK_H #include #endif static char const rcsid[] = "$Id: memcheck.C,v 1.6 2007/09/22 14:27:28 pippijn Exp $"; REGISTER_MODULE ("operserv/memcheck", false, "The Ermyth Team "); #ifdef HAVE_VALGRIND_MEMCHECK_H static void os_cmd_memcheck (sourceinfo_t *si, int parc, char *parv[]) { #ifdef __x86_64__ { unsigned int _qzz_res; { volatile unsigned long int _zzq_args[6]; volatile unsigned long int _zzq_result; _zzq_args[0] = (unsigned long int)(VG_USERREQ__DO_LEAK_CHECK); _zzq_args[1] = (unsigned long int)(0); _zzq_args[2] = (unsigned long int)(0); _zzq_args[3] = (unsigned long int)(0); _zzq_args[4] = (unsigned long int)(0); _zzq_args[5] = (unsigned long int)(0); __asm__ volatile ("rolq $3, %%rdi ; rolq $13, %%rdi\n\t" "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" "xchgq %%rbx,%%rbx" : "=d" (_zzq_result) : "a" (&_zzq_args[0]), "0" (0) : "cc", "memory" ); _qzz_res = _zzq_result; } } #else VALGRIND_DO_LEAK_CHECK; #endif command_success_nodata (si, "Valgrind memcheck invoked."); return; } command_t const os_memcheck = { "MEMCHECK", N_("Invokes the valgrind memcheck."), AC_NONE, 0, os_cmd_memcheck }; E cmdvec os_cmdtree; E helpvec os_helptree; #endif bool _modinit (module *m) { #ifdef HAVE_VALGRIND_MEMCHECK_H os_cmdtree << os_memcheck; help_addentry (os_helptree, "MEMCHECK", "help/operserv/memcheck", NULL); #endif return true; } void _moddeinit () { #ifdef HAVE_VALGRIND_MEMCHECK_H os_cmdtree >> os_memcheck; help_delentry (os_helptree, "MEMCHECK"); #endif }