openprom(4d) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

openprom(4d)

openprom(4D)              Device Drivers & /dev files             openprom(4D)

NAME
       openprom - PROM monitor configuration interface

SYNOPSIS
       #include <sys/fcntl.h>


       #include <sys/types.h>


       #include <sys/openpromio.h>


       open("/dev/openprom", mode);

DESCRIPTION
       The internal encoding of the configuration information stored in EEPROM
       or  NVRAM  varies from model to model, and on some systems the encoding
       is "hidden" by the firmware. The openprom driver provides a  consistent
       interface that allows a user or program to inspect and modify that con‐
       figuration,  using  ioctl(2)  requests.  These  requests are defined in
       <sys/openpromio.h>:

         struct openpromio {
             uint_t  oprom_size;       /* real size of following data */
             union {
                  char  b[1];          /* NB: Adjacent, Null terminated */
                  int   i;
             } opio_u;
         };
         #define oprom_array opio_u.b  /* property name/value array */
         #define oprom_node opio_u.i   /* nodeid from navigation config-ops */
         #define oprom_len opio_u.i    /* property len from OPROMGETPROPLEN */
         #define OPROMMAXPARAM 32768   /* max size of array (advisory) */



       For all ioctl(2) requests, the third parameter is a pointer to a struct
       openpromio. All property names and values are null-terminated  strings;
       the value of a numeric option is its ASCII representation.


       For  the raw ioctl(2) operations shown below that explicitly or implic‐
       itly specify a nodeid, an error may be returned. This is due to the re‐
       moval of the node from the firmware device tree by a Dynamic Reconfigu‐
       ration operation. Programs should decide if the appropriate response is
       to restart the scanning operation from the beginning or terminate,  in‐
       forming the user that the tree has changed.

IOCTLS
       OPROMGETOPT        This ioctl takes the null-terminated name of a prop‐
                          erty  in the oprom_array and returns its null-termi‐
                          nated value (overlaying its name). oprom_size should
                          be set to the size of oprom_array; on return it will
                          contain the size of the returned value. If the named
                          property does not exist, or if there is  not  enough
                          space to hold its value, then oprom_size will be set
                          to zero. See BUGS below.


       OPROMSETOPT        This  ioctl  takes two adjacent strings in oprom_ar‐
                          ray; the null-terminated property name  followed  by
                          the null-terminated value.


       OPROMSETOPT2       This ioctl is similar to OPROMSETOPT, except that it
                          uses  the  difference  between the actual user array
                          size and the length of the property  name  plus  its
                          null terminator.


       OPROMNXTOPT        This  ioctl  is  used to retrieve properties sequen‐
                          tially. The null-terminated name of  a  property  is
                          placed into oprom_array and on return it is replaced
                          with  the  null-terminated name of the next property
                          in the sequence, with oprom_size set to its  length.
                          A  null string on input means return the name of the
                          first property; an  oprom_size  of  zero  on  output
                          means there are no more properties.


       OPROMNXT           These  ioctls  provide  an interface to the raw con‐
       OPROMCHILD         fig_ops operations in the PROM monitor. One can  use
       OPROMGETPROP       them  to  traverse  the system device tree; see prt‐
       OPROMNXTPROP       conf(8).





       OPROMGETPROPLEN    This ioctl provides an  interface  to  the  property
                          length  raw  config op. It takes the name of a prop‐
                          erty in the buffer, and returns an  integer  in  the
                          buffer.  It  returns  the integer -1 if the property
                          does not exist; 0 if the property exists, but has no
                          value (a boolean property); or  a  positive  integer
                          which  is  the length of the property as reported by
                          the PROM monitor. See BUGS below.


       OPROMGETVERSION    This ioctl returns an arbitrary and  platform-depen‐
                          dent  NULL-terminated  string in oprom_array, repre‐
                          senting the underlying version of the firmware.


ERRORS
       EAGAIN    There are too many opens of the /dev/openprom device.


       EFAULT    A bad address has been passed to an ioctl(2) routine.


       EINVAL    The size value was invalid, or (for OPROMSETOPT) the property
                 does not exist, or an invalid ioctl is being issued,  or  the
                 ioctl  is not supported by the firmware, or the nodeid speci‐
                 fied does not exist in the firmware device tree.


       ENOMEM    The kernel could not allocate space to copy the user's struc‐
                 ture.


       EPERM     Attempts have been made to write to a  read-only  entity,  or
                 read from a write only entity.


       ENXIO     Attempting to open a non-existent device.


EXAMPLES
       Example 1 oprom_array Data Allocation and Reuse



       The following example shows how the oprom_array is allocated and reused
       for data returned by the driver.


         /*
          * This program opens the openprom device and prints the platform
          * name (root node name property) and the prom version.
          *
          * NOTE: /dev/openprom is readable only by user 'root' or group 'sys'.
          */
         #include <stdio.h>
         #include <string.h>
         #include <fcntl.h>
         #include <errno.h>
         #include <unistd.h>
         #include <stdlib.h>
         #include <sys/openpromio.h>

         #define min(a, b)    (a < b ? a : b)
         #define max(a, b)    (a > b ? a : b)
         #define MAXNAMESZ 32          /* Maximum property *name* size */
         #define BUFSZ 1024            /* A Handly default buffer size */
         #define MAXVALSZ    (BUFSZ - sizeof (int))
         static char *promdev = "/dev/openprom";

         /*
          * Allocate an openpromio structure big enough to contain
          * a bufsize'd oprom_array. Zero out the structure and
          * set the oprom_size field to bufsize.
          */
         static struct openpromio *
         opp_zalloc(size_t bufsize)
         {
             struct openpromio *opp;
             opp = malloc(sizeof (struct openpromio) + bufsize);
             (void) memset(opp, 0, sizeof (struct openpromio) + bufsize);
             opp->oprom_size = bufsize;
             return (opp);
         }

         /*
          * Free a 'struct openpromio' allocated by opp_zalloc
          */
         static void
         opp_free(struct openpromio *opp)
         {
             free(opp);
         }

         /*
          * Get the peer node of the given node.  The root node is the peer of zero.
          * After changing nodes, property lookups apply to that node.  The driver
          * 'remembers' what node you are in.
          */
         static int
         peer(int nodeid, int fd)
         {
             struct openpromio *opp;
             int i;
             opp = opp_zalloc(sizeof (int));
             opp->oprom_node = nodeid;
             if (ioctl(fd, OPROMNEXT, opp) < 0) {
                 perror("OPROMNEXT");
                 exit(1);
             }
             i = opp->oprom_node;
             opp_free(opp);
             return(i);
         }

         int
         main(void)
         {
             struct openpromio *opp;
             int fd, proplen;
             size_t buflen;
             if ((fd = open(promdev, O_RDONLY)) < 0)  {
                 fprintf(stderr, "Cannot open openprom device\n");
                 exit(1);
             }
             /*
              * Get and print the length and value of the
              * root node 'name' property
              */
             (void) peer(0, fd);        /* Navigate to the root node */
             /*
              * Allocate an openpromio structure sized big enough to
              * take the string "name" as input and return the int-sized
              * length of the 'name' property.
              * Then, get the length of the 'name' property.
              */
             buflen = max(sizeof (int), strlen("name") + 1);
             opp = opp_zalloc(buflen);
             (void) strcpy(opp->oprom_array, "name");
             if (ioctl(fd, OPROMGETPROPLEN, opp) < 0) {
                 perror("OPROMGETPROPLEN");
                 /* exit(1); */
                 proplen = 0;    /* down-rev driver? */
             } else {
                 proplen = opp->oprom_len;
             }
             opp_free(opp);
             if (proplen == -1) {
                 printf("'name' property does not exist!\n");
                 exit (1);
             }
             /*
              * Allocate an openpromio structure sized big enough
              * to take the string 'name' as input and to return
              * 'proplen + 1' bytes.  Then, get the value of the
              * 'name' property. Note how we make sure to size the
              * array at least one byte more than the returned length
              * to guarantee NULL termination.
              */
             buflen = (proplen ? proplen + 1 : MAXVALSZ);
             buflen = max(buflen, strlen("name") + 1);
             opp = opp_zalloc(buflen);
             (void) strcpy(opp->oprom_array, "name");
             if (ioctl(fd, OPROMGETPROP, opp) < 0) {
                 perror("OPROMGETPROP");
                 exit(1);
             }
             if (opp->oprom_size != 0) {
                 printf("Platform name <%s> property len <%d>\n",
                     opp->oprom_array, proplen);
             }
             opp_free(opp);
             /*
              * Allocate an openpromio structure assumed to be
              * big enough to get the 'prom version string'.
              * Get and print the prom version.
              */
             opp_zalloc(MAXVALSZ);
             opp->oprom_size = MAXVALSZ;
             if (ioctl(fd, OPROMGETVERSION, opp) < 0) {
                 perror("OPROMGETVERSION");
                 exit(1);
             }
             printf("Prom version <%s>\n", opp->oprom_array);
             opp_free(opp);
             (void) close(fd);
             return (0);
         }


FILES
       /dev/openprom    PROM monitor configuration interface


SEE ALSO
       ioctl(2), mem(4D), prtconf(8), eeprom(8)

BUGS
       There  should  be separate return values for non-existent properties as
       opposed to not enough space for the value.


       An attempt to set a property to an illegal value results  in  the  PROM
       setting  it  to  some  legal  value,  with  no error being returned. An
       OPROMGETOPT should be performed after an OPROMSETOPT to verify that the
       set worked.


       Some PROMS  lie about the property length of  some  string  properties,
       omitting  the  NULL  terminator  from the property length. The openprom
       driver attempts to transparently compensate for these bugs when return‐
       ing property values by NULL terminating an extra character in the  user
       buffer  if  space is available in the user buffer. This extra character
       is excluded from the oprom_size field returned  from  OPROMGETPROP  and
       OPROMGETOPT and excluded in the oprom_len field returned from OPROMGET‐
       PROPLEN  but  is returned in the user buffer from the calls that return
       data, if the user buffer is allocated at least one byte larger than the
       property length.

Oracle Solaris 11.4               15 Mar 2024                     openprom(4D)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3