31#include <sys/kernel.h>
32#include <sys/linker.h>
33#include <sys/malloc.h>
36#include <sys/sysctl.h>
40#include <machine/atomic.h>
41#include <machine/cpu.h>
44#define TSLOGSIZE 262144
57tslog(
void * td,
int type,
const char * f,
const char * s)
59 uint64_t tsc = get_cyclecount();
63 pos = atomic_fetchadd_long(&
nrecs, 1);
82 void * loader_tslog_buf;
83 size_t loader_tslog_len;
97 if (loader_tslog != NULL) {
100 sbuf_bcat(sb, loader_tslog_buf, loader_tslog_len);
105 for (i = 0; i < limit; i++) {
150 uint64_t tsc = get_cyclecount();
153 if (
procs[pid].reused)
157 if (ppid != (pid_t)(-1)) {
159 if (
procs[pid].ppid) {
171 if (execname != NULL) {
172 if (
procs[pid].execname != NULL)
199 for (pid = 0; pid <= PID_MAX; pid++) {
203 (
unsigned long long)
procs[pid].tsc_forked);
205 (
unsigned long long)
procs[pid].tsc_exited);
207 procs[pid].execname :
"");
219 "",
"Dump recorded userland event timestamps");
device_property_type_t type
void free(void *addr, struct malloc_type *mtp)
struct sbuf * sbuf_new_for_sysctl(struct sbuf *s, char *buf, int length, struct sysctl_req *req)
static struct procdata procs[PID_MAX+1]
static int sysctl_debug_tslog(SYSCTL_HANDLER_ARGS)
static int sysctl_debug_tslog_user(SYSCTL_HANDLER_ARGS)
void tslog(void *td, int type, const char *f, const char *s)
static volatile long nrecs
void tslog_user(pid_t pid, pid_t ppid, const char *execname, const char *namei)
MALLOC_DEFINE(M_TSLOGUSER, "tsloguser", "Strings used by userland tslog")
static struct timestamp timestamps[TSLOGSIZE]
SYSCTL_PROC(_debug, OID_AUTO, tslog, CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE, 0, 0, sysctl_debug_tslog, "", "Dump recorded event timestamps")
size_t preload_fetch_size(caddr_t mod)
caddr_t preload_search_by_type(const char *type)
void * preload_fetch_addr(caddr_t mod)
int sbuf_finish(struct sbuf *s)
void sbuf_delete(struct sbuf *s)
int sbuf_printf(struct sbuf *s, const char *fmt,...)
int sbuf_bcat(struct sbuf *s, const void *buf, size_t len)
int namei(struct nameidata *ndp)