Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought



     PACCESS(S)                UNIX System V                PACCESS(S)



     Name
          paccess - used in conjunction with ptrace for tracing a
          child process

     Syntax
          #include <sys/paccess.h>

          paccess(pid,cmd,offset,count,ptr)
          int pid, cmd,offset,count;
          char *ptr;

     Description
          paccess(S) provides an extended interface for accessing the
          address space, register save areas and local descriptor
          table of a child process that is being traced using
          ptrace(CP).  paccess also provides information about the u-
          area layout so that applications can determine this at
          runtime. This allows the developer to avoid hard coding
          kernel dependencies into the application.

          The primary use of paccess is in the implementation of
          debuggers such as adb(CP) and sdb(CP).

     Parameters
          Except for P_RUOFFS, all paccess commands transfer
          information between the calling process and a child process
          designated by pid. The parent and child processes must
          coordinate tracing using the facilities described by ptrace.
          Each command selects a particular class of data such as data
          address space or floating point register save area, and is
          used by the parent process to read or write the child
          process's context.

          offset is a byte granularity logical offset from the base of
          the particular data area (determined by paccess relative to
          cmd).

          count is the size in bytes of the requested transfer. count
          may be sized down by paccess if offset plus count would
          exceed the size of the particular data area. count may not
          exceed MAXIPCDATA .

          ptr designates a buffer in the caller's address space.

     Note
          paccess will transfer a maximum of count bytes between a
          buffer designated by ptr and a point offset bytes into a
          region of the child process's context designated by cmd.

          P_RUOFFS is an exception as indicated below.

     Commands
          The first four commands are used to read or write data in
          the data, text or stack regions of a process:
          P_RDUSER
          Reads a child process's D address space. offset is a 32
          byte virtual address in the child's address space.
          P_RIUSER
          Reads a child process's I address space. offset is a 32
          byte virtual address in the child's address space.
          P_WDUSER
          Writes to a child process's D address space. offset is a 32
          byte virtual address in the child's address space.
          P_WIUSER
          Writes to a child process's I address space. offset is a 32
          byte virtual address in the child's address space.

          P_RUREGS
          Reads the child process's register save area in the uarea.
          offset is a logical offset from the base of the register
          save area in the uarea. This may be used to read a particular
          register or a subset of the entire save area. Note that the
          ordering of registers in the save area is highly machine
          dependant.  The offsets of the registers are  defined in
          <sys/reg.h>.
          P_WUREGS
          Writes to the child
          process's register
          save area in the
          uarea.  offset is a
          logical offset from
          the base of the
          register save area in
          the uarea. This may be
          used to read a
          particular register or
          a subset of the entire
          save area.  Note that
          the ordering of
          registers in the save
          area is highly machine
          dependant.  The
          offsets of the
          registers are defined
          in <sys/reg.h>.

               The kernel stack pointer [KESP] will remain unchanged after
               any instance of P_WUREGS. Certain flags in the flags
               register [EFL] will remain unchanged after any instance of
               P_WUREGS. The flags are
                 PS_T
                 PS_IE
                 PS_IOPL
                 PS_NT
                 PS_RF
                 PS_VM
               See the file <sys/tss.h> for a definition of these flags.

          P_RUFREGS
          Reads the child
          process floating point
          register save area in
          the uarea.  offset is
          a logical offset from
          the base of the
          register save area in
          the uarea. This may be
          used to read a
          particular register or
          a subset of the entire
          save area.
          P_WUFREGS
          Writes to the child
          process floating point
          register save area in
          the uarea.  offset is
          a logical offset from
          the base of the
          register save area in
          the uarea. This may be
          used to read a
          particular register or
          a subset of the entire
          save area.
          For the above two commands paccess selects the appropriate
          save area relative to whether the process is using an Intel
          87 series or Weitek co-processor chip and whether or not the
          hardware is present or is being emulated in software. Note
          that data is not currently transformed in any way and is
          highly chip and/or emulator dependant.

          The ordering of registers in the save area is highly machine
          dependant.  The offsets of the registers are defined in
          <sys/reg.h>.

          P_RULDT
          Read the child
          processor's local
          descriptor table.
          This command has no
          write capability.
          offset is a logical
          byte offset from the
          base of the local
          descriptor table.
          paccess may have to be
          invoked several times
          to read the entire
          local descriptor
          table.

          The following commands provide read and write access to the
          80386 debug register save area.
          P_RUDREGS
          Reads the 386 debug
          register save area.
          offset is a logical
          offset from the base
          of the register save
          area in the uarea.
          This command may be
          used to read a
          particular register or
          a subset of the entire
          save area.
          P_WUDREGS
          Writes to the 386
          debug register save
          area. offset is a
          logical offset from
          the base of the
          register save area in
          the uarea. This
          command may be used to
          read a particular
          register or a subset
          of the entire save
          area.
          The 80386 debug register set may be used to implement text
          and data breakpoints.  The layout and format of the debug
          register save area is highly chip dependant.  The offsets of
          the registers are defined in <sys/reg.h>.

          Certain fields, such as global bits, in the status register
          will remain unaffected by any instance of P_WUDREGS. See
          /usr/include/sys/debugreg.h for the definition of any flags.

          The file /usr/include/sys/paccess.h includes a structure
          template for reading and writing the debug register save
          area:
          struct debugregs
          This may be used in conjuction with
          /usr/include/sys/debugreg.h for convenient handling of
          bitwise operations.

          P_RUOFFS
          This command is used
          to obtain a list of
          kernel dependant uarea
          offsets typically used
          by debuggers such as
          adb and sdb.  This
          allows an application
          developer to avoid
          using hard coded
          values and thereby
          gain greater
          independence from
          specific kernel
          versions.

               pid and offset are ignored by this command.

               The command returns the first count bytes of the offsets
               structure defined in paccess.h. That structure is defined as
               follows:

               typedef long uoff;

               /* UNIX 3.2 uarea offsets  */

               struct uoffsets {
                  uoff u_info;  /* version */
                  uoff u_uaddr; /* kernel virtual address of uarea  */
                  uoff u_ar0;         /* user register save area pointer */
                  uoff u_fps;   /* floating point save area  */
                  uoff u_fpemul;     /* separate emulator save area  */
                  uoff u_fpvalid;    /* if floating point save is valid */
                  uoff u_weitek;     /* per proc weitek flag */
                  uoff u_weitek_reg;  /* weitek save area  */
                  uoff u_debugreg;   /* debug register save area  */
                  uoff u_ldt;         /* offset of ldt  */
                  uoff u_ldtlimit;   /* size of ldt  */
                  uoff u_tss;          /* 3.2 adb  */
                  uoff u_sztss;      /* 3.2 adb  */
                  uoff u_sigreturn;  /* user signal return */
               };

     Errors
          paccess will fail if one or more of the following is true:

          1.   cmd is invalid [EINVAL].

          2.   pid identifies a child that does not exist or has not
               executed a ptrace with request 0 [ESRCH].

          3.   offset is less than 0 or beyond the size of the
               relevant structure [EINVAL].
          4.   ptr points outside the allocated address space
               [EFAULT].

          5.   An error was encountered when attempting to access data
               in the child's address space [EIO].

     Return Value
          Upon successful completion, paccess returns the number of
          bytes successfully transfered to or from the child process.
          Otherwise, a value of -1 is returned and errno is set to
          indicate the error.

     Files
          /usr/include/sys/paccess.h

     See Also
          ptrace(S), access(S)

     Value Added
          paccess is an extension of AT&T System V provided by the
          Santa Cruz Operation.


                                             (printed 6/20/89)



Typewritten Software • bear@typewritten.org • Edmonds, WA 98026