36#include <sys/kernel.h>
38#include <sys/module.h>
45#include <xen/xen-os.h>
46#include <xen/xen_intr.h>
47#include <xen/hypervisor.h>
58static struct sbuf *
buf;
64 HYPERVISOR_console_write(__DECONST(
char *, str), len);
74#if defined(STACK) && defined(DDB)
82 xc_printf(
"Printing stack trace vCPU%d\n", PCPU_GET(vcpu_id));
83 stack_sbuf_print_ddb(
buf, &st);
85 mtx_unlock_spin(&
lock);
88 return (FILTER_HANDLED);
96 (
"Trying to add Xen debug device to non-xen guest"));
98 if (!xen_has_percpu_evtchn())
101 if (BUS_ADD_CHILD(parent, 0,
"debug", 0) == NULL)
102 panic(
"Unable to add Xen debug device.");
109 device_set_desc(dev,
"Xen debug handler");
110 return (BUS_PROBE_NOWILDCARD);
118 mtx_init(&
lock,
"xen-dbg", NULL, MTX_SPIN);
119 buf = sbuf_new(NULL, NULL, 1024, SBUF_FIXEDLEN);
121 panic(
"Unable to create sbuf for stack dump");
127 NULL, NULL, INTR_TYPE_TTY,
128 DPCPU_ID_PTR(i, xendebug_handler));
130 printf(
"Failed to bind VIRQ_DEBUG to vCPU %d: %d",
134 xen_intr_describe(DPCPU_ID_GET(i, xendebug_handler),
"d%d", i);
MODULE_DEPEND(xendebug, xenpv, 1, 1, 1)
static int xendebug_probe(device_t dev)
static void xendebug_identify(driver_t *driver, device_t parent)
static int xendebug_attach(device_t dev)
static int xendebug_drain(void *arg, const char *str, int len)
DPCPU_DEFINE(xen_intr_handle_t, xendebug_handler)
static device_method_t xendebug_methods[]
devclass_t xendebug_devclass
static int xendebug_filter(void *arg __unused)
DRIVER_MODULE(xendebug, xenpv, xendebug_driver, xendebug_devclass, 0, 0)
void stack_capture(struct stack *st, register_t rbp)
static driver_t xendebug_driver
void xc_printf(const char *fmt,...)