| File: | dev/dt/dt_prov_static.c |
| Warning: | line 224, column 22 Assigned value is garbage or undefined |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* $OpenBSD: dt_prov_static.c,v 1.22 2023/08/28 14:50:01 bluhm Exp $ */ | |||
| 2 | ||||
| 3 | /* | |||
| 4 | * Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org> | |||
| 5 | * | |||
| 6 | * Permission to use, copy, modify, and distribute this software for any | |||
| 7 | * purpose with or without fee is hereby granted, provided that the above | |||
| 8 | * copyright notice and this permission notice appear in all copies. | |||
| 9 | * | |||
| 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
| 11 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
| 12 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
| 13 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
| 14 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
| 15 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
| 16 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| 17 | */ | |||
| 18 | ||||
| 19 | #include <sys/types.h> | |||
| 20 | #include <sys/systm.h> | |||
| 21 | #include <sys/param.h> | |||
| 22 | #include <sys/tracepoint.h> | |||
| 23 | ||||
| 24 | #include <dev/dt/dtvar.h> | |||
| 25 | ||||
| 26 | int dt_prov_static_alloc(struct dt_probe *, struct dt_softc *, | |||
| 27 | struct dt_pcb_list *, struct dtioc_req *); | |||
| 28 | int dt_prov_static_hook(struct dt_provider *, ...); | |||
| 29 | ||||
| 30 | struct dt_provider dt_prov_static = { | |||
| 31 | .dtpv_name = "tracepoint", | |||
| 32 | .dtpv_alloc = dt_prov_static_alloc, | |||
| 33 | .dtpv_enter = dt_prov_static_hook, | |||
| 34 | .dtpv_dealloc = NULL((void *)0), | |||
| 35 | }; | |||
| 36 | ||||
| 37 | /* | |||
| 38 | * Scheduler | |||
| 39 | */ | |||
| 40 | DT_STATIC_PROBE2(sched, dequeue, "pid_t", "pid_t")struct dt_probe (dt_static_sched_dequeue) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "dequeue", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", ((void *)0 ), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 41 | DT_STATIC_PROBE2(sched, enqueue, "pid_t", "pid_t")struct dt_probe (dt_static_sched_enqueue) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "enqueue", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", ((void *)0 ), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 42 | DT_STATIC_PROBE3(sched, fork, "pid_t", "pid_t", "int")struct dt_probe (dt_static_sched_fork) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "fork", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", "int", ((void *)0), ( (void *)0) }, .dtp_nargs = 3, }; | |||
| 43 | DT_STATIC_PROBE2(sched, off__cpu, "pid_t", "pid_t")struct dt_probe (dt_static_sched_off__cpu) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "off__cpu", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", ((void *)0 ), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 44 | DT_STATIC_PROBE0(sched, on__cpu)struct dt_probe (dt_static_sched_on__cpu) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "on__cpu", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { ((void *)0), ((void *)0), (( void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 0, }; | |||
| 45 | DT_STATIC_PROBE0(sched, remain__cpu)struct dt_probe (dt_static_sched_remain__cpu) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "sched", .dtp_name = "remain__cpu" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { ((void *)0) , ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 0, }; | |||
| 46 | DT_STATIC_PROBE0(sched, sleep)struct dt_probe (dt_static_sched_sleep) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "sleep", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { ((void *)0), ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 0, }; | |||
| 47 | DT_STATIC_PROBE3(sched, steal, "pid_t", "pid_t", "int")struct dt_probe (dt_static_sched_steal) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "steal", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", "int", ((void *)0), ( (void *)0) }, .dtp_nargs = 3, }; | |||
| 48 | DT_STATIC_PROBE2(sched, unsleep, "pid_t", "pid_t")struct dt_probe (dt_static_sched_unsleep) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "unsleep", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", ((void *)0 ), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 49 | DT_STATIC_PROBE3(sched, wakeup, "pid_t", "pid_t", "int")struct dt_probe (dt_static_sched_wakeup) = { .dtp_next = { (( void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "sched", .dtp_name = "wakeup", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "pid_t", "pid_t", "int", ((void *)0), ( (void *)0) }, .dtp_nargs = 3, }; | |||
| 50 | ||||
| 51 | /* | |||
| 52 | * Raw syscalls | |||
| 53 | */ | |||
| 54 | DT_STATIC_PROBE1(raw_syscalls, sys_enter, "register_t")struct dt_probe (dt_static_raw_syscalls_sys_enter) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "raw_syscalls", .dtp_name = "sys_enter" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "register_t" , ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 1, }; | |||
| 55 | DT_STATIC_PROBE1(raw_syscalls, sys_exit, "register_t")struct dt_probe (dt_static_raw_syscalls_sys_exit) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "raw_syscalls", .dtp_name = "sys_exit" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "register_t" , ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 1, }; | |||
| 56 | ||||
| 57 | /* | |||
| 58 | * UVM | |||
| 59 | */ | |||
| 60 | DT_STATIC_PROBE3(uvm, fault, "vaddr_t", "vm_fault_t", "vm_prot_t")struct dt_probe (dt_static_uvm_fault) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "fault", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "vaddr_t", "vm_fault_t", "vm_prot_t", ( (void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 61 | DT_STATIC_PROBE3(uvm, map_insert, "vaddr_t", "vaddr_t", "vm_prot_t")struct dt_probe (dt_static_uvm_map_insert) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "map_insert", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "vaddr_t", "vaddr_t", "vm_prot_t" , ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 62 | DT_STATIC_PROBE3(uvm, map_remove, "vaddr_t", "vaddr_t", "vm_prot_t")struct dt_probe (dt_static_uvm_map_remove) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "map_remove", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "vaddr_t", "vaddr_t", "vm_prot_t" , ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 63 | DT_STATIC_PROBE4(uvm, malloc, "int", "void *", "size_t", "int")struct dt_probe (dt_static_uvm_malloc) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "malloc", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "int", "void *", "size_t", "int", ((void *)0) }, .dtp_nargs = 4, }; | |||
| 64 | DT_STATIC_PROBE3(uvm, free, "int", "void *", "size_t")struct dt_probe (dt_static_uvm_free) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "free", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "int", "void *", "size_t", ((void *)0) , ((void *)0) }, .dtp_nargs = 3, }; | |||
| 65 | DT_STATIC_PROBE3(uvm, pool_get, "void *", "void *", "int")struct dt_probe (dt_static_uvm_pool_get) = { .dtp_next = { (( void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "pool_get", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "void *", "int", ((void *)0) , ((void *)0) }, .dtp_nargs = 3, }; | |||
| 66 | DT_STATIC_PROBE2(uvm, pool_put, "void *", "void *")struct dt_probe (dt_static_uvm_pool_put) = { .dtp_next = { (( void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "uvm", .dtp_name = "pool_put", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "void *", ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 67 | ||||
| 68 | /* | |||
| 69 | * VFS | |||
| 70 | */ | |||
| 71 | DT_STATIC_PROBE3(vfs, bufcache_rel, "long", "int", "int64_t")struct dt_probe (dt_static_vfs_bufcache_rel) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "vfs", .dtp_name = "bufcache_rel" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "long", "int" , "int64_t", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 72 | DT_STATIC_PROBE3(vfs, bufcache_take, "long", "int", "int64_t")struct dt_probe (dt_static_vfs_bufcache_take) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "vfs", .dtp_name = "bufcache_take" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "long", "int" , "int64_t", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 73 | DT_STATIC_PROBE4(vfs, cleaner, "long", "int", "long", "long")struct dt_probe (dt_static_vfs_cleaner) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "vfs", .dtp_name = "cleaner", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "long", "int", "long", "long", ((void * )0) }, .dtp_nargs = 4, }; | |||
| 74 | ||||
| 75 | #ifdef __amd64__1 | |||
| 76 | /* | |||
| 77 | * VMM | |||
| 78 | */ | |||
| 79 | DT_STATIC_PROBE2(vmm, guest_enter, "void *", "void *")struct dt_probe (dt_static_vmm_guest_enter) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "vmm", .dtp_name = "guest_enter", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "void *" , ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 80 | DT_STATIC_PROBE3(vmm, guest_exit, "void *", "void *", "uint64_t")struct dt_probe (dt_static_vmm_guest_exit) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "vmm", .dtp_name = "guest_exit", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "void *", "void *", "uint64_t" , ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 81 | DT_STATIC_PROBE4(vmm, inout, "void *", "uint16_t", "uint8_t", "uint32_t")struct dt_probe (dt_static_vmm_inout) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "vmm", .dtp_name = "inout", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "uint16_t", "uint8_t", "uint32_t" , ((void *)0) }, .dtp_nargs = 4, }; | |||
| 82 | #endif /* __amd64__ */ | |||
| 83 | ||||
| 84 | /* | |||
| 85 | * SMR | |||
| 86 | */ | |||
| 87 | DT_STATIC_PROBE3(smr, call, "void *", "void *", "int")struct dt_probe (dt_static_smr_call) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "smr", .dtp_name = "call", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "void *", "int", ((void *)0) , ((void *)0) }, .dtp_nargs = 3, }; | |||
| 88 | DT_STATIC_PROBE2(smr, called, "void *", "void *")struct dt_probe (dt_static_smr_called) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "smr", .dtp_name = "called", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "void *", ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 89 | DT_STATIC_PROBE1(smr, barrier_enter, "int")struct dt_probe (dt_static_smr_barrier_enter) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "smr", .dtp_name = "barrier_enter" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "int", ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 1 , }; | |||
| 90 | DT_STATIC_PROBE1(smr, barrier_exit, "int")struct dt_probe (dt_static_smr_barrier_exit) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "smr", .dtp_name = "barrier_exit" , .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "int", ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 1 , }; | |||
| 91 | DT_STATIC_PROBE0(smr, wakeup)struct dt_probe (dt_static_smr_wakeup) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "smr", .dtp_name = "wakeup", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { ((void *)0), ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 0, }; | |||
| 92 | DT_STATIC_PROBE2(smr, thread, "uint64_t", "uint64_t")struct dt_probe (dt_static_smr_thread) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "smr", .dtp_name = "thread", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "uint64_t", "uint64_t", ((void *)0), ( (void *)0), ((void *)0) }, .dtp_nargs = 2, }; | |||
| 93 | ||||
| 94 | /* | |||
| 95 | * reference counting, keep in sync with sys/refcnt.h | |||
| 96 | */ | |||
| 97 | DT_STATIC_PROBE0(refcnt, none)struct dt_probe (dt_static_refcnt_none) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "none", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { ((void *)0), ((void *)0), ((void *)0), ((void *)0), ((void *)0) }, .dtp_nargs = 0, }; | |||
| 98 | DT_STATIC_PROBE3(refcnt, ethmulti, "void *", "int", "int")struct dt_probe (dt_static_refcnt_ethmulti) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "refcnt", .dtp_name = "ethmulti", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "int" , "int", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 99 | DT_STATIC_PROBE3(refcnt, ifaddr, "void *", "int", "int")struct dt_probe (dt_static_refcnt_ifaddr) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "ifaddr", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "void *", "int", "int", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 100 | DT_STATIC_PROBE3(refcnt, ifmaddr, "void *", "int", "int")struct dt_probe (dt_static_refcnt_ifmaddr) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "ifmaddr", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "void *", "int", "int", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 101 | DT_STATIC_PROBE3(refcnt, inpcb, "void *", "int", "int")struct dt_probe (dt_static_refcnt_inpcb) = { .dtp_next = { (( void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "inpcb", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "int", "int", ((void *)0), ( (void *)0) }, .dtp_nargs = 3, }; | |||
| 102 | DT_STATIC_PROBE3(refcnt, rtentry, "void *", "int", "int")struct dt_probe (dt_static_refcnt_rtentry) = { .dtp_next = { ( (void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "rtentry", .dtp_pbn = 0, . dtp_sysnum = 0, .dtp_argtype = { "void *", "int", "int", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 103 | DT_STATIC_PROBE3(refcnt, syncache, "void *", "int", "int")struct dt_probe (dt_static_refcnt_syncache) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = & dt_prov_static, .dtp_func = "refcnt", .dtp_name = "syncache", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "int" , "int", ((void *)0), ((void *)0) }, .dtp_nargs = 3, }; | |||
| 104 | DT_STATIC_PROBE3(refcnt, tdb, "void *", "int", "int")struct dt_probe (dt_static_refcnt_tdb) = { .dtp_next = { ((void *)0) }, .dtp_pcbs = { ((void *)0) }, .dtp_prov = &dt_prov_static , .dtp_func = "refcnt", .dtp_name = "tdb", .dtp_pbn = 0, .dtp_sysnum = 0, .dtp_argtype = { "void *", "int", "int", ((void *)0), ( (void *)0) }, .dtp_nargs = 3, }; | |||
| 105 | ||||
| 106 | /* | |||
| 107 | * List of all static probes | |||
| 108 | */ | |||
| 109 | struct dt_probe *const dtps_static[] = { | |||
| 110 | /* Scheduler */ | |||
| 111 | &_DT_STATIC_P(sched, dequeue)(dt_static_sched_dequeue), | |||
| 112 | &_DT_STATIC_P(sched, enqueue)(dt_static_sched_enqueue), | |||
| 113 | &_DT_STATIC_P(sched, fork)(dt_static_sched_fork), | |||
| 114 | &_DT_STATIC_P(sched, off__cpu)(dt_static_sched_off__cpu), | |||
| 115 | &_DT_STATIC_P(sched, on__cpu)(dt_static_sched_on__cpu), | |||
| 116 | &_DT_STATIC_P(sched, remain__cpu)(dt_static_sched_remain__cpu), | |||
| 117 | &_DT_STATIC_P(sched, sleep)(dt_static_sched_sleep), | |||
| 118 | &_DT_STATIC_P(sched, steal)(dt_static_sched_steal), | |||
| 119 | &_DT_STATIC_P(sched, unsleep)(dt_static_sched_unsleep), | |||
| 120 | &_DT_STATIC_P(sched, wakeup)(dt_static_sched_wakeup), | |||
| 121 | /* Raw syscalls */ | |||
| 122 | &_DT_STATIC_P(raw_syscalls, sys_enter)(dt_static_raw_syscalls_sys_enter), | |||
| 123 | &_DT_STATIC_P(raw_syscalls, sys_exit)(dt_static_raw_syscalls_sys_exit), | |||
| 124 | /* UVM */ | |||
| 125 | &_DT_STATIC_P(uvm, fault)(dt_static_uvm_fault), | |||
| 126 | &_DT_STATIC_P(uvm, map_insert)(dt_static_uvm_map_insert), | |||
| 127 | &_DT_STATIC_P(uvm, map_remove)(dt_static_uvm_map_remove), | |||
| 128 | &_DT_STATIC_P(uvm, malloc)(dt_static_uvm_malloc), | |||
| 129 | &_DT_STATIC_P(uvm, free)(dt_static_uvm_free), | |||
| 130 | &_DT_STATIC_P(uvm, pool_get)(dt_static_uvm_pool_get), | |||
| 131 | &_DT_STATIC_P(uvm, pool_put)(dt_static_uvm_pool_put), | |||
| 132 | /* VFS */ | |||
| 133 | &_DT_STATIC_P(vfs, bufcache_rel)(dt_static_vfs_bufcache_rel), | |||
| 134 | &_DT_STATIC_P(vfs, bufcache_take)(dt_static_vfs_bufcache_take), | |||
| 135 | &_DT_STATIC_P(vfs, cleaner)(dt_static_vfs_cleaner), | |||
| 136 | #ifdef __amd64__1 | |||
| 137 | /* VMM */ | |||
| 138 | &_DT_STATIC_P(vmm, guest_enter)(dt_static_vmm_guest_enter), | |||
| 139 | &_DT_STATIC_P(vmm, guest_exit)(dt_static_vmm_guest_exit), | |||
| 140 | &_DT_STATIC_P(vmm, inout)(dt_static_vmm_inout), | |||
| 141 | #endif /* __amd64__ */ | |||
| 142 | /* SMR */ | |||
| 143 | &_DT_STATIC_P(smr, call)(dt_static_smr_call), | |||
| 144 | &_DT_STATIC_P(smr, called)(dt_static_smr_called), | |||
| 145 | &_DT_STATIC_P(smr, barrier_enter)(dt_static_smr_barrier_enter), | |||
| 146 | &_DT_STATIC_P(smr, barrier_exit)(dt_static_smr_barrier_exit), | |||
| 147 | &_DT_STATIC_P(smr, wakeup)(dt_static_smr_wakeup), | |||
| 148 | &_DT_STATIC_P(smr, thread)(dt_static_smr_thread), | |||
| 149 | /* refcnt */ | |||
| 150 | &_DT_STATIC_P(refcnt, none)(dt_static_refcnt_none), | |||
| 151 | &_DT_STATIC_P(refcnt, ethmulti)(dt_static_refcnt_ethmulti), | |||
| 152 | &_DT_STATIC_P(refcnt, ifaddr)(dt_static_refcnt_ifaddr), | |||
| 153 | &_DT_STATIC_P(refcnt, ifmaddr)(dt_static_refcnt_ifmaddr), | |||
| 154 | &_DT_STATIC_P(refcnt, inpcb)(dt_static_refcnt_inpcb), | |||
| 155 | &_DT_STATIC_P(refcnt, rtentry)(dt_static_refcnt_rtentry), | |||
| 156 | &_DT_STATIC_P(refcnt, syncache)(dt_static_refcnt_syncache), | |||
| 157 | &_DT_STATIC_P(refcnt, tdb)(dt_static_refcnt_tdb), | |||
| 158 | }; | |||
| 159 | ||||
| 160 | struct dt_probe *const *dtps_index_refcnt; | |||
| 161 | ||||
| 162 | int | |||
| 163 | dt_prov_static_init(void) | |||
| 164 | { | |||
| 165 | int i; | |||
| 166 | ||||
| 167 | for (i = 0; i < nitems(dtps_static)(sizeof((dtps_static)) / sizeof((dtps_static)[0])); i++) { | |||
| 168 | if (dtps_static[i] == &_DT_STATIC_P(refcnt, none)(dt_static_refcnt_none)) | |||
| 169 | dtps_index_refcnt = &dtps_static[i]; | |||
| 170 | dt_dev_register_probe(dtps_static[i]); | |||
| 171 | } | |||
| 172 | ||||
| 173 | return i; | |||
| 174 | } | |||
| 175 | ||||
| 176 | int | |||
| 177 | dt_prov_static_alloc(struct dt_probe *dtp, struct dt_softc *sc, | |||
| 178 | struct dt_pcb_list *plist, struct dtioc_req *dtrq) | |||
| 179 | { | |||
| 180 | struct dt_pcb *dp; | |||
| 181 | ||||
| 182 | KASSERT(dtioc_req_isvalid(dtrq))((dtioc_req_isvalid(dtrq)) ? (void)0 : __assert("diagnostic " , "/usr/src/sys/dev/dt/dt_prov_static.c", 182, "dtioc_req_isvalid(dtrq)" )); | |||
| 183 | KASSERT(TAILQ_EMPTY(plist))(((((plist)->tqh_first) == ((void *)0))) ? (void)0 : __assert ("diagnostic ", "/usr/src/sys/dev/dt/dt_prov_static.c", 183, "TAILQ_EMPTY(plist)" )); | |||
| 184 | ||||
| 185 | dp = dt_pcb_alloc(dtp, sc); | |||
| 186 | if (dp == NULL((void *)0)) | |||
| 187 | return ENOMEM12; | |||
| 188 | ||||
| 189 | dp->dp_filter = dtrq->dtrq_filter; | |||
| 190 | dp->dp_evtflags = dtrq->dtrq_evtflags; | |||
| 191 | TAILQ_INSERT_HEAD(plist, dp, dp_snext)do { if (((dp)->dp_snext.tqe_next = (plist)->tqh_first) != ((void *)0)) (plist)->tqh_first->dp_snext.tqe_prev = &(dp)->dp_snext.tqe_next; else (plist)->tqh_last = &(dp)->dp_snext.tqe_next; (plist)->tqh_first = (dp ); (dp)->dp_snext.tqe_prev = &(plist)->tqh_first; } while (0); | |||
| 192 | ||||
| 193 | return 0; | |||
| 194 | } | |||
| 195 | ||||
| 196 | int | |||
| 197 | dt_prov_static_hook(struct dt_provider *dtpv, ...) | |||
| 198 | { | |||
| 199 | struct dt_probe *dtp; | |||
| 200 | struct dt_pcb *dp; | |||
| 201 | uintptr_t args[5]; | |||
| 202 | va_list ap; | |||
| 203 | int i; | |||
| 204 | ||||
| 205 | va_start(ap, dtpv)__builtin_va_start((ap), dtpv); | |||
| 206 | dtp = va_arg(ap, struct dt_probe *)__builtin_va_arg((ap), struct dt_probe *); | |||
| 207 | for (i = 0; i < dtp->dtp_nargs; i++) { | |||
| ||||
| 208 | args[i] = va_arg(ap, uintptr_t)__builtin_va_arg((ap), uintptr_t); | |||
| 209 | } | |||
| 210 | va_end(ap)__builtin_va_end((ap)); | |||
| 211 | ||||
| 212 | KASSERT(dtpv == dtp->dtp_prov)((dtpv == dtp->dtp_prov) ? (void)0 : __assert("diagnostic " , "/usr/src/sys/dev/dt/dt_prov_static.c", 212, "dtpv == dtp->dtp_prov" )); | |||
| 213 | ||||
| 214 | smr_read_enter(); | |||
| 215 | SMR_SLIST_FOREACH(dp, &dtp->dtp_pcbs, dp_pnext)for ((dp) = ({ typeof(*&(&dtp->dtp_pcbs)->smr_slh_first ) __tmp = *(volatile typeof(*&(&dtp->dtp_pcbs)-> smr_slh_first) *)&(*&(&dtp->dtp_pcbs)->smr_slh_first ); membar_datadep_consumer(); __tmp; }); (dp) != ((void *)0); (dp) = ({ typeof(*&(dp)->dp_pnext.smr_sle_next) __tmp = *(volatile typeof(*&(dp)->dp_pnext.smr_sle_next) *) &(*&(dp)->dp_pnext.smr_sle_next); membar_datadep_consumer (); __tmp; })) { | |||
| 216 | struct dt_evt *dtev; | |||
| 217 | ||||
| 218 | dtev = dt_pcb_ring_get(dp, 0); | |||
| 219 | if (dtev == NULL((void *)0)) | |||
| 220 | continue; | |||
| 221 | ||||
| 222 | dtev->dtev_args_args.E_entry[0] = args[0]; | |||
| 223 | dtev->dtev_args_args.E_entry[1] = args[1]; | |||
| 224 | dtev->dtev_args_args.E_entry[2] = args[2]; | |||
| ||||
| 225 | dtev->dtev_args_args.E_entry[3] = args[3]; | |||
| 226 | dtev->dtev_args_args.E_entry[4] = args[4]; | |||
| 227 | ||||
| 228 | dt_pcb_ring_consume(dp, dtev); | |||
| 229 | } | |||
| 230 | smr_read_leave(); | |||
| 231 | return 1; | |||
| 232 | } |