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)