cmn_err(9F)




NAME

     cmn_err, vcmn_err - display an error message  or  panic  the
     system


SYNOPSIS

     #include <sys/cmn_err.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>

     void cmn_err(int level, char *format...);

     #include <sys/varargs.h>

     void vcmn_err(int level, char *format, va_list ap);


INTERFACE LEVEL

     Architecture independent level 1 (DDI/DKI).


PARAMETERS

  cmn_err()
     level A constant indicating the severity of the error condi-
           tion.

     format
           The message to be displayed.

  vcmn_err()
     vcmn_err()  takes  level  and  format   as   described   for
     cmn_err(), but its third argument is different:

     ap    The variable argument list passed to the function.


DESCRIPTION

  cmn_err()
     cmn_err() displays  a  specified  message  on  the  console.
     cmn_err() can also panic the system. When the system panics,
     it attempts to save recent changes to data, display a "panic
     message"  on  the console, attempt to write a core file, and
     halt system processing. See the CE_PANIC level below.

     level is a constant indicating the  severity  of  the  error
     condition. The four severity levels are:

     CE_CONT
           Used to continue another  message  or  to  display  an
           informative message not associated with an error. Note
           that multiple CE_CONT messages without a  newline  may
           or may not appear on the system console or in the sys-
           tem log as a single line message. A single  line  mes-
           sage  may be produced by constructing the message with
           sprintf(9F) or vsprintf(9F) before calling cmn_err().

     CE_NOTE
           Used to display a message preceded with  NOTICE.  This
           message  is  used  to report system events that do not
           necessarily require user action, but may interest  the
           system  administrator.  For  example, a message saying
           that a sector on a disk needs to be  accessed  repeat-
           edly  before  it  can  be  accessed correctly might be
           noteworthy.

     CE_WARN
           Used to display a message preceded with WARNING.  This
           message  is  used to report system events that require
           immediate attention, such as those where if an  action
           is  not taken, the system may panic. For example, when
           a peripheral device  does  not  initialize  correctly,
           this level should be used.

     CE_PANIC
           Used to display a message preceded with  "panic",  and
           to panic the system. Drivers should specify this level
           only under the most severe conditions or  when  debug-
           ging  a  driver. A valid use of this level is when the
           system cannot continue to function. If  the  error  is
           recoverable,  or  not  essential  to  continued system
           operation, do not panic the system.

     format is the message to be displayed.  It  is  a  character
     string  which  may  contain  plain characters and conversion
     specifications. By default, the message is sent both to  the
     system console and to the system log.

     Each conversion specification in format is introduced by the
     % character, after which the following appear in sequence:

     An optional decimal digit specifying a minimum  field  width
     for  numeric  conversion. The converted value will be right-
     justified and padded with leading zeroes  if  it  has  fewer
     characters than the minimum.

     An optional l (ll) specifying that a following d, D,  o,  O,
     x,  X,  or  u  conversion  character applies to a long (long
     long) integer argument. An l (ll) before any  other  conver-
     sion character is ignored.

     A character indicating the type of conversion to be applied:

     d,D,o,O,x,X,u
           The integer argument is converted  to  signed  decimal
           (d,  D),  unsigned  octal (o, O), unsigned hexadecimal
           (x, X), or unsigned  decimal  (u),  respectively,  and
           displayed.  The  letters  abcdef  are used for x and X
           conversion.

     c     The character value of the argument is displayed.

     b     The %b conversion specification allows bit  values  to
           be  displayed  meaningfully.  Each %b takes an integer
           value and a format string from the argument list.  The
           first  character  of  the  format string should be the
           output base encoded as a control character. This  base
           is used to display the integer argument. The remaining
           groups of characters in the format string consist of a
           bit  number  (between 1 and 32, also encoded as a con-
           trol character) and the next  characters  (up  to  the
           next  control  character or '\0') give the name of the
           bit field. The string corresponding to the bit  fields
           set  in  the  integer  argument is displayed after the
           numerical value. See EXAMPLE section.

     p     The argument is taken to be a pointer;  the  value  of
           the  pointer is displayed in unsigned hexadecimal. The
           display format is equivalent to  %lx.  To  avoid  lint
           warnings,  cast pointers to type void * when using the
           %p format specifier.

     s     The argument  is  taken  to  be  a  string  (character
           pointer), and characters from the string are displayed
           until a null character is encountered. If the  charac-
           ter  pointer is NULL, the string <null string> is used
           in its place.

     %     Copy a %; no argument is converted.

     The first character in format affects where the message will
     be written:

     !     The message goes only to the system log.

     ^     The message goes only to the console.

     ?     If level is also CE_CONT, the message is  always  sent
           to  the system log, but is only written to the console
           when the system has been booted in verbose  mode.  See
           kernel(1M). If neither condition is met, the '?' char-
           acter has no effect and is simply ignored.

     Refer to syslogd(1M) to determine where the  system  log  is
     written.

     cmn_err() appends a \n to each format, except when level  is
     CE_CONT.

  vcmn_err()
     vcmn_err() is identical to cmn_err() except  that  its  last
     argument,  ap, is a pointer to a variable list of arguments.
     ap contains the list of arguments  used  by  the  conversion
     specifications  in format. ap must be initialized by calling
     va_start(9F). va_end(9F) is used to clean  up  and  must  be
     called after each traversal of the list. Multiple traversals
     of the argument list, each  bracketed  by  va_start(9F)  and
     va_end(9F), are possible.


RETURN VALUES

     None. However, if an unknown level is passed  to  cmn_err(),
     the following panic error message is displayed:

     panic: unknown level in cmn_err (level=level, msg=format)


CONTEXT

     cmn_err() can be called from user,   kernel,  interrupt,  or
     high-level interrupt context.


EXAMPLES

     Example 1: Using cmn_err()

     This first example shows how cmn_err()  can  record  tracing
     and debugging information only in the system log (lines 17);
     display problems with a device only on  the  system  console
     (line  23);  or display problems with the device on both the
     system console and in the system log (line 28).

     1  struct  reg {
     2          uchar_t data;
     3          uchar_t csr;
     4  };
     5
     6  struct  xxstate {
     7          ...
     8          dev_info_t *dip;
     9          struct reg *regp;
     10          ...
     11  };
     12
     13  dev_t dev;
     14  struct xxstate *xsp;
     15    ...
     16  #ifdef DEBUG    /* in debugging mode, log function call */
     17     cmn_err(CE_CONT, "!%s%d: xxopen function called.",
     18          ddi_binding_name(xsp->dip), getminor(dev));
     19  #endif  /* end DEBUG */
     20    ...
     21  /* display device power failure on system console */
     22     if ((xsp->regp->csr & POWER) == OFF)
     23          cmn_err(CE_NOTE, "^OFF.",
     24               ddi_binding_name(xsp->dip), getminor(dev));
     25    ...
     26  /* display warning if device has bad VTOC */
     27     if (xsp->regp->csr & BADVTOC)
     28          cmn_err(CE_WARN, "%s%d: xxopen: Bad VTOC.",
     29               ddi_binding_name(xsp->dip), getminor(dev));

     Example 2: Using the %b conversion specification

     This example shows how to use the %b  conversion  specifica-
     tion.  Because  of  the  leading '?' character in the format
     string, this message will always be logged, but it will only
     be displayed when the kernel is booted in verbose mode.

     cmn_err(CE_CONT, "?reg=0x%b\n", regval, "\020\3Intr\2Err\1Enable");

     Example 3: Using regval

     When regval is set to (decimal) 13,  the  following  message
     would be displayed:

     reg=0xd<Intr,,Enable>

     Example 4: Error Routine

     The third  example  is  an  error  reporting  routine  which
     accepts a variable number of arguments and displays a single
     line error message both in the system log and on the  system
     console.  Note  the use of vsprintf() to construct the error
     message before calling cmn_err().

     #include <sys/varargs.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>
     #define MAX_MSG 256;

     void
     xxerror(dev_info_t *dip, int level, const char *fmt, ...)
     {
         va_list     ap;
         int         instance;
         char        buf[MAX_MSG], *name;

     instance = ddi_get_instance(dip);
     name = ddi_binding_name(dip);

     /* format buf using fmt and arguments contained in ap */

     va_start(ap, fmt);
     vsprintf(buf, fmt, ap);
     va_end(ap);

     /* pass formatted string to cmn_err(9F) */

     cmn_err(level, "%s%d: %s", name, instance, buf);
     }


SEE ALSO

     dmesg(1M),  kernel(1M),  printf(3C),   ddi_binding_name(9F),
     sprintf(9F),     va_arg(9F),    va_end(9F),    va_start(9F),
     vsprintf(9F)

     Writing Device Drivers


WARNINGS

     cmn_err() with the CE_CONT argument can be  used  by  driver
     developers  as  a driver code debugging tool. However, using
     cmn_err() in this capacity can change system timing  charac-
     teristics.


NOTES

     Messages  of  arbitrary  length  can  be   generated   using
     cmn_err(),  but  if the call to cmn_err() is made from high-
     level interrupt context and insufficient memory is available
     to  create  a buffer of the specified size, the message will
     be truncated to LOG_MSGSIZE bytes  (see  <sys/log.h>).   For
     this  reason, callers of cmn_err() that require complete and
     accurate message generation should post down from high-level
     interrupt context before calling cmn_err().


Man(1) output converted with man2html