int bios_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { bios_diskinfo_t *pdi; extern dev_t bootdev; int biosdev; /* all sysctl names at this level except diskinfo are terminal */ if (namelen != 1 && name[0] != BIOS_DISKINFO) return (ENOTDIR); /* overloaded */ if (!(bootapiver & BAPIV_VECTOR)) return EOPNOTSUPP; switch (name[0]) { case BIOS_DEV: if ((pdi = bios_getdiskinfo(bootdev)) == NULL) return ENXIO; biosdev = pdi->bios_number; return sysctl_rdint(oldp, oldlenp, newp, biosdev); case BIOS_DISKINFO: if (namelen != 2) return ENOTDIR; if ((pdi = bios_getdiskinfo(name[1])) == NULL) return ENXIO; return sysctl_rdstruct(oldp, oldlenp, newp, pdi, sizeof(*pdi)); case BIOS_CKSUMLEN: return sysctl_rdint(oldp, oldlenp, newp, bios_cksumlen); default: return EOPNOTSUPP; } /* NOTREACHED */ }
/* * machine dependent system variables. */ int cpu_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { dev_t consdev; dev_t dev; switch (name[0]) { case CPU_CONSDEV: if (namelen != 1) return (ENOTDIR); /* overloaded */ if (cn_tab != NULL) consdev = cn_tab->cn_dev; else consdev = NODEV; return (sysctl_rdstruct(oldp, oldlenp, newp, &consdev, sizeof consdev)); case CPU_CHR2BLK: if (namelen != 2) return (ENOTDIR); /* overloaded */ dev = chrtoblk((dev_t)name[1]); return sysctl_rdstruct(oldp, oldlenp, newp, &dev, sizeof(dev)); case CPU_BIOS: return bios_sysctl(name + 1, namelen - 1, oldp, oldlenp, newp, newlen, p); case CPU_CPUVENDOR: return (sysctl_rdstring(oldp, oldlenp, newp, cpu_vendor)); case CPU_CPUFEATURE: return (sysctl_rdint(oldp, oldlenp, newp, cpu_feature)); case CPU_KBDRESET: if (securelevel > 0) return (sysctl_rdint(oldp, oldlenp, newp, kbd_reset)); else return (sysctl_int(oldp, oldlenp, newp, newlen, &kbd_reset)); case CPU_ALLOWAPERTURE: if (namelen != 1) return (ENOTDIR); /* overloaded */ #ifdef APERTURE if (securelevel > 0) return (sysctl_int_lower(oldp, oldlenp, newp, newlen, &allowaperture)); else return (sysctl_int(oldp, oldlenp, newp, newlen, &allowaperture)); #else return (sysctl_rdint(oldp, oldlenp, newp, 0)); #endif default: return (EOPNOTSUPP); } /* NOTREACHED */ }
/* * Return pty-related information. */ int sysctl_pty(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { int error, oldmax; if (namelen != 1) return (ENOTDIR); switch (name[0]) { case KERN_TTY_MAXPTYS: if (!newp) return (sysctl_rdint(oldp, oldlenp, newp, maxptys)); rw_enter_write(&pt_softc_lock); oldmax = maxptys; error = sysctl_int(oldp, oldlenp, newp, newlen, &maxptys); /* * We can't set the max lower than the current active * value or to a value bigger than NPTY_MAX. */ if (error == 0 && (maxptys > NPTY_MAX || maxptys < npty)) { maxptys = oldmax; error = ERANGE; } rw_exit_write(&pt_softc_lock); return (error); case KERN_TTY_NPTYS: return (sysctl_rdint(oldp, oldlenp, newp, npty)); #ifdef notyet case KERN_TTY_GID: return (sysctl_int(oldp, oldlenp, newp, newlen, &tty_gid)); #endif default: return (EOPNOTSUPP); } /* NOTREACHED */ }
/* * Return timecounter-related information. */ int sysctl_tc(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { if (namelen != 1) return (ENOTDIR); switch (name[0]) { case KERN_TIMECOUNTER_TICK: return (sysctl_rdint(oldp, oldlenp, newp, tc_tick)); case KERN_TIMECOUNTER_TIMESTEPWARNINGS: return (sysctl_int(oldp, oldlenp, newp, newlen, ×tepwarnings)); case KERN_TIMECOUNTER_HARDWARE: return (sysctl_tc_hardware(oldp, oldlenp, newp, newlen)); case KERN_TIMECOUNTER_CHOICE: return (sysctl_tc_choice(oldp, oldlenp, newp, newlen)); default: return (EOPNOTSUPP); } /* NOTREACHED */ }
int cpu_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { int oldval, ret; /* all sysctl names at this level are terminal */ if (namelen != 1) return (ENOTDIR); /* overloaded */ switch (name[0]) { case CPU_CONSDEV: { dev_t consdev; if (cn_tab != NULL) consdev = cn_tab->cn_dev; else consdev = NODEV; return (sysctl_rdstruct(oldp, oldlenp, newp, &consdev, sizeof consdev)); } case CPU_KBDRESET: if (securelevel > 0) return (sysctl_rdint(oldp, oldlenp, newp, kbd_reset)); return (sysctl_int(oldp, oldlenp, newp, newlen, &kbd_reset)); case CPU_LED_BLINK: oldval = led_blink; ret = sysctl_int(oldp, oldlenp, newp, newlen, &led_blink); if (oldval != led_blink) blink_led(NULL); return (ret); default: return (EOPNOTSUPP); } /* NOTREACHED */ }
/* * fast filesystem related variables. */ int ffs_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { extern int doclusterread, doclusterwrite, doreallocblks, doasyncfree; #ifdef FFS_SOFTUPDATES extern int max_softdeps, tickdelay, stat_worklist_push; extern int stat_blk_limit_push, stat_ino_limit_push, stat_blk_limit_hit; extern int stat_ino_limit_hit, stat_sync_limit_hit, stat_indir_blk_ptrs; extern int stat_inode_bitmap, stat_direct_blk_ptrs, stat_dir_entry; #endif /* all sysctl names at this level are terminal */ if (namelen != 1) return (ENOTDIR); /* overloaded */ switch (name[0]) { case FFS_CLUSTERREAD: return (sysctl_int(oldp, oldlenp, newp, newlen, &doclusterread)); case FFS_CLUSTERWRITE: return (sysctl_int(oldp, oldlenp, newp, newlen, &doclusterwrite)); case FFS_REALLOCBLKS: return (sysctl_int(oldp, oldlenp, newp, newlen, &doreallocblks)); case FFS_ASYNCFREE: return (sysctl_int(oldp, oldlenp, newp, newlen, &doasyncfree)); #ifdef FFS_SOFTUPDATES case FFS_MAX_SOFTDEPS: return (sysctl_int(oldp, oldlenp, newp, newlen, &max_softdeps)); case FFS_SD_TICKDELAY: return (sysctl_int(oldp, oldlenp, newp, newlen, &tickdelay)); case FFS_SD_WORKLIST_PUSH: return (sysctl_rdint(oldp, oldlenp, newp, stat_worklist_push)); case FFS_SD_BLK_LIMIT_PUSH: return (sysctl_rdint(oldp, oldlenp, newp, stat_blk_limit_push)); case FFS_SD_INO_LIMIT_PUSH: return (sysctl_rdint(oldp, oldlenp, newp, stat_ino_limit_push)); case FFS_SD_BLK_LIMIT_HIT: return (sysctl_rdint(oldp, oldlenp, newp, stat_blk_limit_hit)); case FFS_SD_INO_LIMIT_HIT: return (sysctl_rdint(oldp, oldlenp, newp, stat_ino_limit_hit)); case FFS_SD_SYNC_LIMIT_HIT: return (sysctl_rdint(oldp, oldlenp, newp, stat_sync_limit_hit)); case FFS_SD_INDIR_BLK_PTRS: return (sysctl_rdint(oldp, oldlenp, newp, stat_indir_blk_ptrs)); case FFS_SD_INODE_BITMAP: return (sysctl_rdint(oldp, oldlenp, newp, stat_inode_bitmap)); case FFS_SD_DIRECT_BLK_PTRS: return (sysctl_rdint(oldp, oldlenp, newp, stat_direct_blk_ptrs)); case FFS_SD_DIR_ENTRY: return (sysctl_rdint(oldp, oldlenp, newp, stat_dir_entry)); #endif #ifdef UFS_DIRHASH case FFS_DIRHASH_DIRSIZE: return (sysctl_int(oldp, oldlenp, newp, newlen, &ufs_mindirhashsize)); case FFS_DIRHASH_MAXMEM: return (sysctl_int(oldp, oldlenp, newp, newlen, &ufs_dirhashmaxmem)); case FFS_DIRHASH_MEM: return (sysctl_rdint(oldp, oldlenp, newp, ufs_dirhashmem)); #endif default: return (EOPNOTSUPP); } /* NOTREACHED */ }
int ddb_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { int error, ctlval; /* All sysctl names at this level are terminal. */ if (namelen != 1) return (ENOTDIR); switch (name[0]) { case DBCTL_RADIX: return sysctl_int(oldp, oldlenp, newp, newlen, &db_radix); case DBCTL_MAXWIDTH: return sysctl_int(oldp, oldlenp, newp, newlen, &db_max_width); case DBCTL_TABSTOP: return sysctl_int(oldp, oldlenp, newp, newlen, &db_tab_stop_width); case DBCTL_MAXLINE: return sysctl_int(oldp, oldlenp, newp, newlen, &db_max_line); case DBCTL_PANIC: if (securelevel > 0) return (sysctl_int_lower(oldp, oldlenp, newp, newlen, &db_panic)); else { ctlval = db_panic; if ((error = sysctl_int(oldp, oldlenp, newp, newlen, &ctlval)) || newp == NULL) return (error); if (ctlval != 1 && ctlval != 0) return (EINVAL); db_panic = ctlval; return (0); } break; case DBCTL_CONSOLE: if (securelevel > 0) return (sysctl_int_lower(oldp, oldlenp, newp, newlen, &db_console)); else { ctlval = db_console; if ((error = sysctl_int(oldp, oldlenp, newp, newlen, &ctlval)) || newp == NULL) return (error); if (ctlval != 1 && ctlval != 0) return (EINVAL); db_console = ctlval; return (0); } break; case DBCTL_LOG: return (sysctl_int(oldp, oldlenp, newp, newlen, &db_log)); case DBCTL_TRIGGER: if (newp && db_console) { struct process *pr = curproc->p_p; if (securelevel < 1 || (pr->ps_flags & PS_CONTROLT && cn_tab && cn_tab->cn_dev == pr->ps_session->s_ttyp->t_dev)) { Debugger(); newp = NULL; } else return (ENODEV); } return (sysctl_rdint(oldp, oldlenp, newp, 0)); default: return (EOPNOTSUPP); } /* NOTREACHED */ }