static int ipmi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) { if (cmd != DDI_ATTACH) return (DDI_FAILURE); /* this driver only supports one device instance */ if (ddi_get_instance(dip) != 0) { cmn_err(CE_WARN, "!not attaching to non-zero device instance %d", ddi_get_instance(dip)); return (DDI_FAILURE); } if (get_smbios_ipmi_info() == DDI_FAILURE) return (DDI_FAILURE); /* * Support for the other types (SMIC, SSIF) should be added here. */ switch (sc->ipmi_io_type) { case SMB_IPMI_T_KCS: if (ipmi_kcs_attach(sc) != 0) return (DDI_FAILURE); break; default: return (DDI_FAILURE); } ipmi_found = B_TRUE; if (ddi_create_minor_node(dip, "ipmi", S_IFCHR, 0, DDI_PSEUDO, 0) == DDI_FAILURE) { cmn_err(CE_WARN, "!attach could not create minor node"); ddi_remove_minor_node(dip, NULL); return (DDI_FAILURE); } ipmi_dip = dip; list_create(&dev_list, sizeof (ipmi_device_t), offsetof(ipmi_device_t, ipmi_node)); /* Create ID space for open devs. ID 0 is reserved. */ minor_ids = id_space_create("ipmi_id_space", 1, 128); if (ipmi_startup(sc) != B_TRUE) { ipmi_cleanup(dip); return (DDI_FAILURE); } ipmi_attached = B_TRUE; return (DDI_SUCCESS); }
void log_init(void) { int log_maxzones; /* * Create a backlog queue to consume console messages during periods * when there is no console reader (e.g. before syslogd(1M) starts). */ log_backlogq = log_consq = log_makeq(0, LOG_HIWAT, NULL); /* * Create a queue to hold free message of size <= LOG_MSGSIZE. * Calls from high-level interrupt handlers will do a getq_noenab() * from this queue, so its q_lock must be a maximum SPL spin lock. */ log_freeq = log_makeq(LOG_MINFREE, LOG_MAXFREE, (void *)ipltospl(SPL8)); /* * Create a queue for messages from high-level interrupt context. * These messages are drained via softcall, or explicitly by panic(). */ log_intrq = log_makeq(0, LOG_HIWAT, (void *)ipltospl(SPL8)); /* * Create a queue to hold the most recent 8K of console messages. * Useful for debugging. Required by the "$<msgbuf" adb macro. */ log_recentq = log_makeq(0, LOG_RECENTSIZE, NULL); /* * Create an id space for clone devices opened via /dev/log. * Need to limit the number of zones to avoid exceeding the * available minor number space. */ log_maxzones = (L_MAXMIN32 - LOG_LOGMIN) / LOG_NUMCLONES - 1; if (log_maxzones < maxzones) maxzones = log_maxzones; log_minorspace = id_space_create("logminor_space", LOG_LOGMIN + 1, L_MAXMIN32); /* * Put ourselves on the ZSD list. Note that zones have not been * initialized yet, but our constructor will be called on the global * zone when they are. */ zone_key_create(&log_zone_key, log_zoneinit, NULL, log_zonefree); /* * Initialize backlog structure. */ log_backlog.log_zoneid = GLOBAL_ZONEID; log_backlog.log_minor = LOG_BACKLOG; /* Allocate kmem cache for conslog's log structures */ log_cons_cache = kmem_cache_create("log_cons_cache", sizeof (struct log), 0, log_cons_constructor, log_cons_destructor, NULL, NULL, NULL, 0); /* * Let the logging begin. */ log_update(&log_backlog, log_backlogq, SL_CONSOLE, log_console); /* * Now that logging is enabled, emit the OS banner. */ printf("\rSunOS Release %s Version %s %u-bit\n", utsname.release, utsname.version, NBBY * (uint_t)sizeof (void *)); printf("Copyright (c) 1983, 2010, Oracle and/or its affiliates. " "All rights reserved.\n"); printf("Copyright 2015 Nexenta Systems, Inc. All rights reserved.\n"); #ifdef DEBUG printf("DEBUG enabled\n"); #endif }
/* * void task_init(void) * * Overview * task_init() initializes task-related hashes, caches, and the task id * space. Additionally, task_init() establishes p0 as a member of task0. * Called by main(). * * Return values * None. * * Caller's context * task_init() must be called prior to MP startup. */ void task_init(void) { proc_t *p = &p0; mod_hash_hndl_t hndl; rctl_set_t *set; rctl_alloc_gp_t *gp; rctl_entity_p_t e; /* * Initialize task_cache and taskid_space. */ task_cache = kmem_cache_create("task_cache", sizeof (task_t), 0, NULL, NULL, NULL, NULL, NULL, 0); taskid_space = id_space_create("taskid_space", 0, MAX_TASKID); /* * Initialize task hash table. */ task_hash = mod_hash_create_idhash("task_hash", task_hash_size, mod_hash_null_valdtor); /* * Initialize task-based rctls. */ rc_task_lwps = rctl_register("task.max-lwps", RCENTITY_TASK, RCTL_GLOBAL_NOACTION | RCTL_GLOBAL_COUNT, INT_MAX, INT_MAX, &task_lwps_ops); rc_task_nprocs = rctl_register("task.max-processes", RCENTITY_TASK, RCTL_GLOBAL_NOACTION | RCTL_GLOBAL_COUNT, INT_MAX, INT_MAX, &task_procs_ops); rc_task_cpu_time = rctl_register("task.max-cpu-time", RCENTITY_TASK, RCTL_GLOBAL_NOACTION | RCTL_GLOBAL_DENY_NEVER | RCTL_GLOBAL_CPU_TIME | RCTL_GLOBAL_INFINITE | RCTL_GLOBAL_UNOBSERVABLE | RCTL_GLOBAL_SECONDS, UINT64_MAX, UINT64_MAX, &task_cpu_time_ops); /* * Create task0 and place p0 in it as a member. */ task0p = kmem_cache_alloc(task_cache, KM_SLEEP); bzero(task0p, sizeof (task_t)); task0p->tk_tkid = id_alloc(taskid_space); task0p->tk_usage = kmem_zalloc(sizeof (task_usage_t), KM_SLEEP); task0p->tk_inherited = kmem_zalloc(sizeof (task_usage_t), KM_SLEEP); task0p->tk_proj = project_hold_by_id(0, &zone0, PROJECT_HOLD_INSERT); task0p->tk_flags = TASK_NORMAL; task0p->tk_nlwps = p->p_lwpcnt; task0p->tk_nprocs = 1; task0p->tk_zone = global_zone; task0p->tk_commit_next = NULL; set = rctl_set_create(); gp = rctl_set_init_prealloc(RCENTITY_TASK); mutex_enter(&curproc->p_lock); e.rcep_p.task = task0p; e.rcep_t = RCENTITY_TASK; task0p->tk_rctls = rctl_set_init(RCENTITY_TASK, curproc, &e, set, gp); mutex_exit(&curproc->p_lock); rctl_prealloc_destroy(gp); (void) mod_hash_reserve(task_hash, &hndl); mutex_enter(&task_hash_lock); ASSERT(task_find(task0p->tk_tkid, GLOBAL_ZONEID) == NULL); if (mod_hash_insert_reserve(task_hash, (mod_hash_key_t)(uintptr_t)task0p->tk_tkid, (mod_hash_val_t *)task0p, hndl) != 0) { mod_hash_cancel(task_hash, &hndl); panic("unable to insert task %d(%p)", task0p->tk_tkid, (void *)task0p); } mutex_exit(&task_hash_lock); task0p->tk_memb_list = p; task0p->tk_nprocs_kstat = task_kstat_create(task0p, task0p->tk_zone); /* * Initialize task pointers for p0, including doubly linked list of task * members. */ p->p_task = task0p; p->p_taskprev = p->p_tasknext = p; task_hold(task0p); }