mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-22 11:14:18 +01:00
70c712a86d
SDT calls dtrace_probe() directly, and this can be used to pass up to five probe arguments directly. To pass the sixth argument (SDT currently doesn't support more than this), we use a hack: just add additional parameters to the call and cast dtrace_probe accordingly. This happens to work on amd64, but doesn't work in general. Modify SDT to call dtrace_probe() after storing arguments beyond the first five in thread-local storage. Implement sdt_getargval() to fetch extra argument values this way. An alternative would be to use invop handlers instead and make sdt_probe_func point to a breakpoint instruction, so that one can extract arguments using the breakpoint exception trapframe, but this makes the providers more expensive when enabled and doesn't seem justified. This approach works well unless we want to add more than one or two more parameters to SDT probes, which seems unlikely at present. In particular, this fixes fetching the last argument of most ip and tcp probes on arm64. Reported by: rwatson Reviewed by: Domagoj Stolfa MFC after: 1 month Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D45648
70 lines
2.5 KiB
C
70 lines
2.5 KiB
C
/*-
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright 2006-2008 John Birrell <jb@FreeBSD.org>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <sys/param.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/kdb.h>
|
|
#include <sys/proc.h>
|
|
#include <sys/sdt.h>
|
|
|
|
SDT_PROVIDER_DEFINE(sdt);
|
|
|
|
/*
|
|
* Hook for the DTrace probe function. The SDT provider will set this to
|
|
* dtrace_probe() when it loads.
|
|
*/
|
|
sdt_probe_func_t sdt_probe_func = sdt_probe_stub;
|
|
volatile bool __read_frequently sdt_probes_enabled;
|
|
|
|
/*
|
|
* This is a stub for probe calls in case kernel DTrace support isn't
|
|
* enabled. It should never get called because there is no DTrace support
|
|
* to enable it.
|
|
*/
|
|
void
|
|
sdt_probe_stub(uint32_t id __unused, uintptr_t arg0 __unused,
|
|
uintptr_t arg1 __unused, uintptr_t arg2 __unused, uintptr_t arg3 __unused,
|
|
uintptr_t arg4 __unused, uintptr_t arg5 __unused)
|
|
{
|
|
printf("sdt_probe_stub: unexpectedly called\n");
|
|
kdb_backtrace();
|
|
}
|
|
|
|
void
|
|
sdt_probe(uint32_t id, uintptr_t arg0, uintptr_t arg1,
|
|
uintptr_t arg2, uintptr_t arg3, uintptr_t arg4)
|
|
{
|
|
sdt_probe_func(id, arg0, arg1, arg2, arg3, arg4, 0);
|
|
}
|
|
|
|
void
|
|
sdt_probe6(uint32_t id, uintptr_t arg0, uintptr_t arg1,
|
|
uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5)
|
|
{
|
|
sdt_probe_func(id, arg0, arg1, arg2, arg3, arg4, arg5);
|
|
}
|