1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  22 /*        All Rights Reserved   */
  23 
  24 
  25 /*
  26  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  27  * Use is subject to license terms.
  28  */
  29 
  30 #ifndef _SYS_SYSTM_H
  31 #define _SYS_SYSTM_H
  32 
  33 #include <sys/types.h>
  34 #include <sys/t_lock.h>
  35 #include <sys/proc.h>
  36 #include <sys/dditypes.h>
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 /*
  43  * The pc_t is the type of the kernel's program counter.  In general, a
  44  * pc_t is a uintptr_t -- except for a sparcv9 kernel, in which case all
  45  * instruction text is below 4G, and a pc_t is thus a uint32_t.
  46  */
  47 #ifdef __sparcv9
  48 typedef uint32_t pc_t;
  49 #else
  50 typedef uintptr_t pc_t;
  51 #endif
  52 
  53 /*
  54  * Random set of variables used by more than one routine.
  55  */
  56 
  57 #if defined(_KERNEL) || defined(_FAKE_KERNEL)
  58 #include <sys/types32.h>
  59 #include <sys/varargs.h>
  60 #include <sys/uadmin.h>
  61 
  62 extern int hz;                  /* system clock rate */
  63 extern struct vnode *rootdir;   /* pointer to vnode of root directory */
  64 extern struct vnode *devicesdir;        /* pointer to /devices vnode */
  65 extern int interrupts_unleashed;        /* set after the spl0() in main() */
  66 
  67 extern char runin;              /* scheduling flag */
  68 extern char runout;             /* scheduling flag */
  69 extern char wake_sched;         /* causes clock to wake swapper on next tick */
  70 extern char wake_sched_sec;     /* causes clock to wake swapper after a sec */
  71 
  72 extern pgcnt_t  maxmem;         /* max available memory (pages) */
  73 extern pgcnt_t  physmem;        /* physical memory (pages) on this CPU */
  74 extern pfn_t    physmax;        /* highest numbered physical page present */
  75 extern pgcnt_t  physinstalled;  /* physical pages including PROM/boot use */
  76 
  77 extern caddr_t  s_text;         /* start of kernel text segment */
  78 extern caddr_t  e_text;         /* end of kernel text segment */
  79 extern caddr_t  s_data;         /* start of kernel text segment */
  80 extern caddr_t  e_data;         /* end of kernel text segment */
  81 
  82 extern pgcnt_t  availrmem;      /* Available resident (not swapable)    */
  83                                 /* memory in pages.                     */
  84 extern pgcnt_t  availrmem_initial;      /* initial value of availrmem   */
  85 extern pgcnt_t  segspt_minfree; /* low water mark for availrmem in seg_spt */
  86 extern pgcnt_t  freemem;        /* Current free memory.                 */
  87 
  88 extern dev_t    rootdev;        /* device of the root */
  89 extern struct vnode *rootvp;    /* vnode of root device */
  90 extern boolean_t root_is_svm;           /* root is a mirrored device flag */
  91 extern boolean_t root_is_ramdisk;       /* root is boot_archive ramdisk */
  92 extern uint32_t  ramdisk_size;          /* (KB) set only for sparc netboots */
  93 extern char *volatile panicstr; /* panic string pointer */
  94 extern va_list  panicargs;      /* panic arguments */
  95 extern volatile int quiesce_active;     /* quiesce(9E) is in progress */
  96 
  97 extern int      rstchown;       /* 1 ==> restrictive chown(2) semantics */
  98 extern int      klustsize;
  99 
 100 extern int      abort_enable;   /* Platform input-device abort policy */
 101 
 102 extern int      audit_active;   /* Solaris Auditing module state */
 103 
 104 extern int      avenrun[];      /* array of load averages */
 105 
 106 extern char *isa_list;          /* For sysinfo's isalist option */
 107 
 108 extern int noexec_user_stack;           /* patchable via /etc/system */
 109 extern int noexec_user_stack_log;       /* patchable via /etc/system */
 110 
 111 /*
 112  * Use NFS client operations in the global zone only.  Under contract with
 113  * admin/install; do not change without coordinating with that consolidation.
 114  */
 115 extern int nfs_global_client_only;
 116 
 117 extern void report_stack_exec(proc_t *, caddr_t);
 118 
 119 extern void startup(void);
 120 extern void clkstart(void);
 121 extern void post_startup(void);
 122 extern void kern_setup1(void);
 123 extern void ka_init(void);
 124 extern void nodename_set(void);
 125 
 126 /*
 127  * for tod fault detection
 128  */
 129 enum tod_fault_type {
 130         TOD_REVERSED = 0,
 131         TOD_STALLED,
 132         TOD_JUMPED,
 133         TOD_RATECHANGED,
 134         TOD_RDONLY,
 135         TOD_NOFAULT
 136 };
 137 
 138 #define TOD_GET_FAILED          0x1     /* TOD could not be read */
 139 #define TOD_SET_DONE            0x2     /* TOD has been modified */
 140 #define TOD_CPR_RESUME_DONE     0x4     /* CPR resume has occurred */
 141 #define TOD_DR_RESUME_DONE      0x8     /* DR resume has occurred */
 142 
 143 extern time_t tod_validate(time_t);
 144 extern void tod_status_set(int);
 145 extern void tod_status_clear(int);
 146 extern void plat_tod_fault(enum tod_fault_type);
 147 
 148 #ifndef _LP64
 149 #ifndef min
 150 int min(int, int);
 151 #endif
 152 
 153 #ifndef max
 154 int max(int, int);
 155 #endif
 156 
 157 uint_t umin(uint_t, uint_t);
 158 uint_t umax(uint_t, uint_t);
 159 #endif /* !_LP64 */
 160 int grow(caddr_t);
 161 int grow_internal(caddr_t, uint_t);
 162 int brk_internal(caddr_t, uint_t);
 163 typedef uint64_t callout_id_t;
 164 timeout_id_t timeout(void (*)(void *), void *, clock_t);
 165 timeout_id_t realtime_timeout(void (*)(void *), void *, clock_t);
 166 clock_t untimeout(timeout_id_t);
 167 /*
 168  * The last argument to timeout_generic() is flags. See callo.h for the
 169  * flags definitions.
 170  */
 171 callout_id_t timeout_generic(int, void (*)(void *), void *, hrtime_t, hrtime_t,
 172     int);
 173 callout_id_t timeout_default(void (*)(void *), void *, clock_t);
 174 callout_id_t realtime_timeout_default(void (*)(void *), void *, clock_t);
 175 /*
 176  * The last argument to untimeout_generic() is flags. See callout.c for the
 177  * use.
 178  */
 179 hrtime_t untimeout_generic(callout_id_t, int);
 180 clock_t untimeout_default(callout_id_t, int);
 181 void delay(clock_t);
 182 int delay_sig(clock_t);
 183 void delay_random(clock_t);
 184 int nodev();
 185 int nulldev();
 186 major_t getudev(void);
 187 int cmpldev(dev32_t *, dev_t);
 188 dev_t expldev(dev32_t);
 189 int bcmp(const void *, const void *, size_t) __PURE;
 190 int stoi(char **);
 191 void numtos(ulong_t, char *);
 192 char *kmem_asprintf(const char *fmt, ...);
 193 int strident_valid(const char *);
 194 void strident_canon(char *, size_t);
 195 int getsubopt(char **optionsp, char * const *tokens, char **valuep);
 196 char *append_subopt(const char *, size_t, char *, const char *);
 197 #ifndef _FAKE_KERNEL
 198 /* conflicts with libc definition */
 199 int ffs(uintmax_t);
 200 #endif
 201 int copyin(const void *, void *, size_t);
 202 void copyin_noerr(const void *, void *, size_t);
 203 int xcopyin(const void *, void *, size_t);
 204 int xcopyin_nta(const void *, void *, size_t, int);
 205 int copyout(const void *, void *, size_t);
 206 void copyout_noerr(const void *, void *, size_t);
 207 int xcopyout(const void *, void *, size_t);
 208 int xcopyout_nta(const void *, void *, size_t, int);
 209 int copyinstr(const char *, char *, size_t, size_t *);
 210 int copyinstr_noerr(const char *, char *, size_t, size_t *);
 211 int copyoutstr(const char *, char *, size_t, size_t *);
 212 int copyoutstr_noerr(const char *, char *, size_t, size_t *);
 213 int copystr(const char *, char *, size_t, size_t *);
 214 void ucopy(const void *, void *, size_t);
 215 void ucopystr(const char *, char *, size_t, size_t *);
 216 void pgcopy(const void *, void *, size_t);
 217 void ovbcopy(const void *, void *, size_t);
 218 void uzero(void *, size_t);
 219 int kcopy(const void *, void *, size_t);
 220 int kcopy_nta(const void *, void *, size_t, int);
 221 int kzero(void *, size_t);
 222 
 223 int fuword8(const void *, uint8_t *);
 224 int fuword16(const void *, uint16_t *);
 225 int fuword32(const void *, uint32_t *);
 226 int fulword(const void *, ulong_t *);
 227 void fuword8_noerr(const void *, uint8_t *);
 228 void fuword16_noerr(const void *, uint16_t *);
 229 void fuword32_noerr(const void *, uint32_t *);
 230 void fulword_noerr(const void *, ulong_t *);
 231 
 232 #ifdef _LP64
 233 int fuword64(const void *, uint64_t *);
 234 void fuword64_noerr(const void *, uint64_t *);
 235 #endif
 236 
 237 int subyte(void *, uint8_t);
 238 int suword8(void *, uint8_t);
 239 int suword16(void *, uint16_t);
 240 int suword32(void *, uint32_t);
 241 int sulword(void *, ulong_t);
 242 void subyte_noerr(void *, uint8_t);
 243 void suword8_noerr(void *, uint8_t);
 244 void suword16_noerr(void *, uint16_t);
 245 void suword32_noerr(void *, uint32_t);
 246 void sulword_noerr(void *, ulong_t);
 247 
 248 #ifdef _LP64
 249 int suword64(void *, uint64_t);
 250 void suword64_noerr(void *, uint64_t);
 251 #endif
 252 
 253 #if !defined(_BOOT) && !defined(_FAKE_KERNEL)
 254 /* conflicts with libc definition */
 255 int setjmp(label_t *) __RETURNS_TWICE;
 256 extern void longjmp(label_t *)
 257         __NORETURN;
 258 #pragma unknown_control_flow(setjmp)
 259 #endif
 260 
 261 void prefetch_read_once(void *);
 262 void prefetch_write_once(void *);
 263 void prefetch_read_many(void *);
 264 void prefetch_write_many(void *);
 265 caddr_t caller(void);
 266 caddr_t callee(void);
 267 int getpcstack(pc_t *, int);
 268 int on_fault(label_t *) __RETURNS_TWICE;
 269 void no_fault(void);
 270 void halt(char *);
 271 int scanc(size_t, uchar_t *, uchar_t *, uchar_t);
 272 int movtuc(size_t, uchar_t *, uchar_t *, uchar_t *);
 273 int splr(int);
 274 int splhigh(void);
 275 int splhi(void);
 276 int splzs(void);
 277 int spl0(void);
 278 int spl6(void);
 279 int spl7(void);
 280 int spl8(void);
 281 void splx(int);
 282 void set_base_spl(void);
 283 int __ipltospl(int);
 284 int spl_xcall(void);
 285 
 286 void softcall_init(void);
 287 void softcall(void (*)(void *), void *);
 288 void softint(void);
 289 
 290 extern void sync_icache(caddr_t, uint_t);
 291 extern void sync_data_memory(caddr_t, size_t);
 292 extern void hot_patch_kernel_text(caddr_t, uint32_t, uint_t);
 293 
 294 void _insque(caddr_t, caddr_t);
 295 void _remque(caddr_t);
 296 
 297 /* casts to keep lint happy */
 298 #define insque(q, p)    _insque((caddr_t)q, (caddr_t)p)
 299 #define remque(q)       _remque((caddr_t)q)
 300 
 301 #pragma unknown_control_flow(on_fault)
 302 
 303 struct timeval;
 304 extern void     uniqtime(struct timeval *);
 305 struct timeval32;
 306 extern void     uniqtime32(struct timeval32 *);
 307 
 308 uint_t page_num_pagesizes(void);
 309 size_t page_get_pagesize(uint_t n);
 310 
 311 extern int maxusers;
 312 extern int pidmax;
 313 
 314 extern void param_preset(void);
 315 extern void param_calc(int);
 316 extern void param_init(void);
 317 extern void param_check(void);
 318 
 319 #endif /* _KERNEL */
 320 
 321 /*
 322  * Structure of the system-entry table.
 323  *
 324  *      Changes to struct sysent should maintain binary compatibility with
 325  *      loadable system calls, although the interface is currently private.
 326  *
 327  *      This means it should only be expanded on the end, and flag values
 328  *      should not be reused.
 329  *
 330  *      It is desirable to keep the size of this struct a power of 2 for quick
 331  *      indexing.
 332  */
 333 struct sysent {
 334         char            sy_narg;        /* total number of arguments */
 335 #ifdef _LP64
 336         unsigned short  sy_flags;       /* various flags as defined below */
 337 #else
 338         unsigned char   sy_flags;       /* various flags as defined below */
 339 #endif
 340         int             (*sy_call)();   /* argp, rvalp-style handler */
 341         krwlock_t       *sy_lock;       /* lock for loadable system calls */
 342         int64_t         (*sy_callc)();  /* C-style call hander or wrapper */
 343 };
 344 
 345 extern struct sysent    sysent[];
 346 #ifdef _SYSCALL32_IMPL
 347 extern struct sysent    sysent32[];
 348 #endif
 349 
 350 extern struct sysent    nosys_ent;      /* entry for invalid system call */
 351 
 352 #define NSYSCALL        256             /* number of system calls */
 353 
 354 #define LOADABLE_SYSCALL(s)     (s->sy_flags & SE_LOADABLE)
 355 #define LOADED_SYSCALL(s)       (s->sy_flags & SE_LOADED)
 356 
 357 /*
 358  * sy_flags values
 359  *      Values 1, 2, and 4 were used previously for SETJUMP, ASYNC, and IOSYS.
 360  */
 361 #define SE_32RVAL1      0x0             /* handler returns int32_t in rval1 */
 362 #define SE_32RVAL2      0x1             /* handler returns int32_t in rval2 */
 363 #define SE_64RVAL       0x2             /* handler returns int64_t in rvals */
 364 #define SE_RVAL_MASK    0x3             /* mask of rval_t bits */
 365 
 366 #define SE_LOADABLE     0x08            /* syscall is loadable */
 367 #define SE_LOADED       0x10            /* syscall is completely loaded */
 368 #define SE_NOUNLOAD     0x20            /* syscall never needs unload */
 369 #define SE_ARGC         0x40            /* syscall takes C-style args */
 370 
 371 /*
 372  * Structure of the return-value parameter passed by reference to
 373  * system entries.
 374  */
 375 union rval {
 376         struct  {
 377                 int     r_v1;
 378                 int     r_v2;
 379         } r_v;
 380         off_t   r_off;
 381         offset_t r_offset;
 382         time_t  r_time;
 383         int64_t r_vals;
 384 };
 385 #define r_val1  r_v.r_v1
 386 #define r_val2  r_v.r_v2
 387 
 388 typedef union rval rval_t;
 389 
 390 #if defined(_KERNEL) || defined(_FAKE_KERNEL)
 391 
 392 extern void reset_syscall_args(void);
 393 extern int save_syscall_args(void);
 394 extern uint_t get_syscall_args(klwp_t *lwp, long *argp, int *nargsp);
 395 #ifdef _SYSCALL32_IMPL
 396 extern uint_t get_syscall32_args(klwp_t *lwp, int *argp, int *nargp);
 397 #endif
 398 
 399 extern uint_t set_errno(uint_t error);
 400 #pragma rarely_called(set_errno)
 401 
 402 extern int64_t syscall_ap(void);
 403 extern int64_t loadable_syscall(long, long, long, long, long, long, long, long);
 404 extern int64_t nosys(void);
 405 
 406 extern void swtch(void);
 407 
 408 extern uint_t   kcpc_key;       /* TSD key for performance counter context */
 409 
 410 /*
 411  * initname holds the path to init and is used as a point of rendezvous
 412  * between krtld (which processes the boot arguments) and the kernel.
 413  */
 414 #define INITNAME_SZ     32
 415 extern char initname[INITNAME_SZ];
 416 
 417 /*
 418  * initargs holds the arguments to init (such as -v, -s, -r, -m verbose) and
 419  * is a point of rendezvous between krtld (which processes the boot arguments)
 420  * and the kernel.
 421  */
 422 extern char initargs[BOOTARGS_MAX];
 423 
 424 extern int exec_init(const char *, const char *);
 425 extern int start_init_common(void);
 426 
 427 #endif  /* _KERNEL */
 428 
 429 #if defined(_KERNEL) || defined(_FAKE_KERNEL) || defined(_BOOT)
 430 
 431 size_t strlcat(char *, const char *, size_t);
 432 size_t strlen(const char *) __PURE;
 433 char *strcat(char *, const char *);
 434 char *strncat(char *, const char *, size_t);
 435 char *strcpy(char *, const char *);
 436 char *strncpy(char *, const char *, size_t);
 437 
 438 extern size_t strlcpy(char *, const char *, size_t);
 439 extern size_t strspn(const char *, const char *);
 440 extern size_t strcspn(const char *, const char *);
 441 extern char *strdup(const char *);
 442 extern void strfree(char *);
 443 
 444 /* Need to be consistent with <string.h> C++ definitions */
 445 #if __cplusplus >= 199711L
 446 extern const char *strchr(const char *, int);
 447 #ifndef _STRCHR_INLINE
 448 #define _STRCHR_INLINE
 449 extern "C++" {
 450         inline char *strchr(char *__s, int __c) {
 451                 return (char *)strchr((const char *)__s, __c);
 452         }
 453 }
 454 #endif /* _STRCHR_INLINE */
 455 extern const char *strrchr(const char *, int);
 456 #ifndef _STRRCHR_INLINE
 457 #define _STRRCHR_INLINE
 458 extern "C++" {
 459         inline char *strrchr(char *__s, int __c) {
 460                 return (char *)strrchr((const char *)__s, __c);
 461         }
 462 }
 463 #endif  /* _STRRCHR_INLINE */
 464 extern const char *strstr(const char *, const char *);
 465 #ifndef _STRSTR_INLINE
 466 #define _STRSTR_INLINE
 467 extern "C++" {
 468         inline char *strstr(char *__s1, const char *__s2) {
 469                 return (char *)strstr((const char *)__s1, __s2);
 470         }
 471 }
 472 #endif  /* _STRSTR_INLINE */
 473 #else   /* __cplusplus >= 199711L */
 474 char *strchr(const char *, int);
 475 char *strrchr(const char *, int);
 476 char *strstr(const char *, const char *);
 477 #endif  /* __cplusplus >= 199711L */
 478 char *strnrchr(const char *, int, size_t);
 479 int strcmp(const char *, const char *) __PURE;
 480 int strncmp(const char *, const char *, size_t) __PURE;
 481 int strcasecmp(const char *, const char *) __PURE;
 482 int strncasecmp(const char *, const char *, size_t) __PURE;
 483 /* Need to be consistent with <string.h> C++ definitions */
 484 #if __cplusplus >= 199711L
 485 extern const char *strpbrk(const char *, const char *);
 486 #ifndef _STRPBRK_INLINE
 487 #define _STRPBRK_INLINE
 488 extern "C++" {
 489         inline char *strpbrk(char *__s1, const char *__s2) {
 490                 return (char *)strpbrk((const char *)__s1, __s2);
 491         }
 492 }
 493 #endif /* _STRPBRK_INLINE */
 494 #else /* __cplusplus >= 199711L */
 495 char *strpbrk(const char *, const char *);
 496 #endif /* __cplusplus >= 199711L */
 497 void bcopy(const void *, void *, size_t);
 498 void bzero(void *, size_t);
 499 
 500 extern void *memset(void *, int, size_t);
 501 extern void *memcpy(void *, const void *, size_t);
 502 extern void *memmove(void *, const void *, size_t);
 503 extern int memcmp(const void *, const void *, size_t);
 504 
 505 #ifdef __lint
 506 extern  int     __lintzero;     /* for spoofing lint */
 507 #else   /* __lint */
 508 #define __lintzero 0
 509 #endif  /* __lint */
 510 #endif /* _KERNEL || _BOOT */
 511 
 512 #ifdef  __cplusplus
 513 }
 514 #endif
 515 
 516 #endif  /* _SYS_SYSTM_H */