kctl
i_get_num_kinstances(kstat_ctl_t *kctl)
for (kp = kctl->kc_chain; kp != NULL; kp = kp->ks_next) {
i_get_server_descs(ilbst_arg_t *sta, kstat_ctl_t *kctl)
for (kp = kctl->kc_chain; kp != NULL; kp = kp->ks_next) {
(void) kstat_read(kctl, kp, NULL);
i_get_rule_descs(ilbst_arg_t *sta, kstat_ctl_t *kctl)
for (i = 0, kp = kctl->kc_chain; i < rcount && kp != NULL;
(void) kstat_read(kctl, kp, NULL);
kstat_ctl_t *kctl;
if ((kctl = kstat_open()) == NULL) {
rcount = i_get_num_kinstances(kctl);
rc = i_get_rule_descs(sta, kctl);
rc = i_get_server_descs(sta, kctl);
nkid = kstat_chain_update(kctl);
rcount = i_get_num_kinstances(kctl);
(void) kstat_close(kctl);
extern kctl_t kctl;
kav->kav_dseg = kctl.kctl_dseg;
kav->kav_dseg_size = kctl.kctl_dseg_size;
if (kctl.kctl_boot_loaded) {
if (kctl.kctl_flags & KMDB_F_TRAP_NOSWITCH)
if (kctl.kctl_boot_ops == NULL)
if (kctl.kctl_boot_ops == NULL)
if (kctl.kctl_boot_ops != NULL)
if (kctl.kctl_flags & KMDB_F_DRV_DEBUG) {
if (kctl.kctl_boot_ops == NULL) {
BOP_PUTSARG(kctl.kctl_boot_ops, "WARNING: ", NULL);
BOP_PUTSARG(kctl.kctl_boot_ops, "NOTE: ", NULL);
BOP_PUTSARG(kctl.kctl_boot_ops, "%s\n", buf);
if (!(kctl.kctl_flags & KMDB_F_DRV_DEBUG))
mutex_destroy(&kctl.kctl_lock);
cv_destroy(&kctl.kctl_wr_cv);
mutex_destroy(&kctl.kctl_wr_lock);
sema_destroy(&kctl.kctl_wr_avail_sem);
uint_t ostate = kctl.kctl_state;
kctl.kctl_state = state;
if (BOP_ALLOC(kctl.kctl_boot_ops, dsegaddr, sz, BO_NO_ALIGN) !=
needed = P2ROUNDUP(kctl.kctl_memgoalsz <= kctl.kctl_dseg_size ? 0 :
kctl.kctl_memgoalsz - kctl.kctl_dseg_size, PAGESIZE);
kctl.kctl_mrbase = base;
kctl.kctl_mrsize = needed;
ASSERT(kctl.kctl_boot_loaded == 0);
if (curthread != kctl.kctl_wr_thr) {
kctl_dseg_free(kctl.kctl_dseg, kctl.kctl_dseg_size);
if (kctl.kctl_mrbase != NULL)
kmem_free(kctl.kctl_mrbase, kctl.kctl_mrsize);
kctl.kctl_state = KCTL_ST_INACTIVE;
rc = kmdb_init(kctl.kctl_execname, &kav);
else if (kctl.kctl_state > KCTL_ST_INACTIVE &&
kctl.kctl_state < KCTL_ST_ACTIVE)
else if (kctl.kctl_state == KCTL_ST_ACTIVE)
else if (kctl.kctl_state == KCTL_ST_DEACTIVATING)
mutex_enter(&kctl.kctl_lock);
if (kctl.kctl_boot_loaded) {
if ((rc = kctl_state_check(kctl.kctl_state, KCTL_ST_ACTIVE)) != 0)
mutex_exit(&kctl.kctl_lock);
kctl_t kctl;
kctl.kctl_boot_ops = ops; /* must be set before kctl_init */
kctl.kctl_boot_loaded = 1;
kctl.kctl_dseg = kdi_segdebugbase;
kctl.kctl_dseg_size =
kctl.kctl_memgoalsz = memsz;
if (kctl_boot_dseg_alloc(kctl.kctl_dseg, kctl.kctl_dseg_size) < 0) {
"%p", kctl.kctl_dseg_size, (void *)kctl.kctl_dseg);
kctl.kctl_boot_ops = NULL;
mutex_enter(&kctl.kctl_lock);
if ((rc = kctl_state_check(kctl.kctl_state, KCTL_ST_INACTIVE)) != 0) {
mutex_exit(&kctl.kctl_lock);
kctl.kctl_flags = flags;
kctl.kctl_dseg = kdi_segdebugbase;
kctl.kctl_dseg_size =
kctl.kctl_memgoalsz = memsz;
if ((rc = kctl_dseg_alloc(kctl.kctl_dseg, kctl.kctl_dseg_size)) != 0)
if (kctl.kctl_flags & KMDB_F_AUTO_ENTRY)
mutex_exit(&kctl.kctl_lock);
mutex_exit(&kctl.kctl_lock);
kctl.kctl_drv_dip = dip;
return (kctl.kctl_state == KCTL_ST_INACTIVE ? 0 : EBUSY);
sema_init(&kctl.kctl_wr_avail_sem, 0, NULL, SEMA_DRIVER, NULL);
mutex_init(&kctl.kctl_wr_lock, NULL, MUTEX_DRIVER, NULL);
cv_init(&kctl.kctl_wr_cv, NULL, CV_DRIVER, NULL);
mutex_init(&kctl.kctl_lock, NULL, MUTEX_DRIVER, NULL);
kctl.kctl_execname = KCTL_EXECNAME; /* XXX get from modctl? */
kctl.kctl_state = KCTL_ST_INACTIVE;
kctl.kctl_dseg = kctl.kctl_mrbase = NULL;
kctl.kctl_dseg_size = kctl.kctl_mrsize = 0;
ASSERT(kctl.kctl_boot_ops == NULL);
kctl.kctl_wr_avail = 0;
sema_v(&kctl.kctl_wr_avail_sem);
kctl.kctl_wr_avail = 1;
sema_p(&kctl.kctl_wr_avail_sem);
kctl.kctl_wr_state != KCTL_WR_ST_RUN) {
kctl.kctl_wr_state = KCTL_WR_ST_STOPPED;
kctl.kctl_wr_avail = 0;
kctl.kctl_wr_state = KCTL_WR_ST_RUN;
kctl.kctl_wr_thr = thread_create(NULL, 0, kctl_wr_thread, NULL, 0, &p0,
ASSERT(kctl.kctl_wr_state == KCTL_WR_ST_RUN);
kctl.kctl_wr_state = KCTL_WR_ST_STOP;
sema_v(&kctl.kctl_wr_avail_sem);
thread_join(kctl.kctl_wr_thr->t_did);
if (!kctl.kctl_boot_loaded)
struct bootops *ops = kctl.kctl_boot_ops;
if (kctl.kctl_boot_loaded) {
private long kctl;
Kstat(long kctl, long ksp)
this.kctl = kctl;
public KstatChainUpdateException(KstatCtl kctl)
private long kctl;
kctl = open();
assert(kctl != 0);
close(kctl);
kctl = 0;
private native int close(long kctl);
jlong kctl)
if (kctl)
return (kstat_close((kstat_ctl_t *)(uintptr_t)kctl));
kstat_ctl_t *kctl =
if (!ksp || !kctl)
kid = kstat_read((kstat_ctl_t *)kctl, (kstat_t *)ksp, NULL);
kstat_ctl_t *kctl;
kctl = (kstat_ctl_t *)(uintptr_t)(*env)->GetLongField(env, obj,
ksp = kstat_lookup(kctl, (char *)module, instance, (char *)name);
(jlong)(uintptr_t)kctl, (jlong)(uintptr_t)ksp);
kstat_ctl_t *kctl;
kctl = (kstat_ctl_t *)(uintptr_t)(*env)->GetLongField(env, obj,
(void) kstat_chain_update(kctl);
static kstat_ctl_t *kctl; /* kstat chain */
if (kstat_chain_update(kctl) == -1) {
for (ksp = kctl->kc_chain; ksp != NULL; ksp = ksp->ks_next) {
if (kstat_read(kctl, ksp, NULL) != -1) {
kctl = kstat_open();
if (kctl == NULL)
safe_kstat_read(kstat_ctl_t *kctl, kstat_t *ksp, void *data)
kid_t kstat_chain_id = kstat_read(kctl, ksp, data);
fail(1, "kstat_read(%x, '%s') failed", kctl, ksp->ks_name);
safe_kstat_lookup(kstat_ctl_t *kctl, char *ks_module, int ks_instance,
kstat_t *ksp = kstat_lookup(kctl, ks_module, ks_instance, ks_name);