aboutsummaryrefslogtreecommitdiff
path: root/man/man3/mach-map.3
diff options
context:
space:
mode:
Diffstat (limited to 'man/man3/mach-map.3')
-rw-r--r--man/man3/mach-map.3419
1 files changed, 419 insertions, 0 deletions
diff --git a/man/man3/mach-map.3 b/man/man3/mach-map.3
new file mode 100644
index 00000000..b993efd6
--- /dev/null
+++ b/man/man3/mach-map.3
@@ -0,0 +1,419 @@
+.TH MACH-MAP 3
+.SH NAME
+allocmap, addseg, addregseg, findseg, addrtoseg,
+addrtosegafter, removeseg, freemap,
+get1, get2, get4, get8,
+put1, put2, put4, put8,
+rget1, rget2, rget4, rget8,
+rput1, rput2, rput4, rput8,
+locaddr, locconst, locreg, locindir,
+loccmp, loceval, locfmt, locredir,
+lget1, lget2, lget4, lget8,
+lput1, lput2, lput4, lput8 \- machine-independent
+access to address spaces and register sets
+.SH SYNOPSIS
+.B #include <u.h>
+.br
+.B #include <libc.h>
+.br
+.B #include <mach.h>
+.PP
+.B
+.ta \w'\fBxxxxxx'u +\w'xxxxxxx'u
+.nf
+typedef struct Map Map;
+typedef struct Seg Seg;
+.PP
+.B
+.nf
+struct Seg
+{
+ char *name;
+ char *file;
+ int fd;
+ ulong base;
+ ulong size;
+ ulong offset;
+ int (*rw)(Map*, Seg*, ulong, void*, uint, int);
+};
+.PP
+.B
+.nf
+struct Map
+{
+ Seg *seg;
+ int nseg;
+ \fI...\fR
+};
+.PP
+.B
+Map *allocmap(void)
+.br
+int addseg(Map *map, Seg seg)
+.br
+int findseg(Map *map, char *name, char *file)
+.br
+int addrtoseg(Map *map, ulong addr, Seg *seg)
+.br
+int addrtosegafter(Map *map, ulong addr, Seg *seg)
+.br
+void removeseg(Map *map, int i)
+.br
+void freemap(Map *map)
+.PP
+.B
+int get1(Map *map, ulong addr, uchar *a, uint n)
+.br
+int get2(Map *map, ulong addr, u16int *u)
+.br
+int get4(Map *map, ulong addr, u32int *u)
+.br
+int get8(Map *map, ulong addr, u64int *u)
+.PP
+.B
+int put1(Map *map, ulong addr, uchar *a, uint n)
+.br
+int put2(Map *map, ulong addr, u16int u)
+.br
+int put4(Map *map, ulong addr, u32int u)
+.br
+int put8(Map *map, ulong addr, u64int u)
+.PP
+.B
+int rget1(Map *map, char *reg, u8int *u)
+.br
+int rget2(Map *map, char *reg, u16int *u)
+.br
+int rget4(Map *map, char *reg, u32int *u)
+.br
+int rget8(Map *map, char *reg, u64int *u)
+.br
+int fpformat(Map *map, char *reg, char *a, uint n, char code);
+.PP
+.B
+int rput1(Map *map, char *reg, u8int u)
+.br
+int rput2(Map *map, char *reg, u16int u)
+.br
+int rput4(Map *map, char *reg, u32int u)
+.br
+int rput8(Map *map, char *reg, u64int u)
+.PP
+.B
+Loc locaddr(ulong addr)
+.br
+Loc locconst(ulong con)
+.br
+Loc locreg(char *reg)
+.br
+Loc locindir(char *reg, long offset)
+.PP
+.B
+int loccmp(Loc *a, Loc *b)
+.br
+int loceval(Map *map, Loc loc, ulong *addr)
+.br
+int locfmt(Fmt *fmt)
+.br
+int locredir(Map *map, Loc *regs, Loc loc, Loc *newloc)
+.PP
+.B
+int lget1(Map *map, Loc loc, uchar *a, uint n)
+.br
+int lget2(Map *map, Loc loc, u16int *u)
+.br
+int lget4(Map *map, Loc loc, u32int *u)
+.br
+int lget8(Map *map, Loc loc, u64int *u)
+.PP
+.B
+int lput1(Map *map, Loc loc, uchar *a, uint n)
+.br
+int lput2(Map *map, Loc loc, u16int u)
+.br
+int lput4(Map *map, Loc loc, u32int u)
+.br
+int lput8(Map *map, Loc loc, u64int u)
+.PP
+.SH DESCRIPTION
+These functions provide
+a processor-independent interface for accessing
+executable files, core files, and running processes
+via
+.IR maps ,
+data structures that provides access to an address space
+and register set.
+The functions described in
+.IR mach-file (3)
+are typically used to construct these maps.
+Related library functions described in
+.IR mach-symbol (3)
+provide similar access to symbol tables.
+.PP
+Each
+.I map
+comprises an optional register set and one or more
+.BR segments ,
+each associating a non-overlapping range of
+memory addresses with a logical section of
+an executable file or of a running process's address space.
+Other library functions then use a map
+and the architecture-specific data structures
+to provide a generic interface to the
+processor-dependent data.
+.PP
+Each segment has a name (e.g.,
+.B text
+or
+.BR data )
+and may be associated with a particular file.
+A segment represents a range of accessible address space.
+Segments may be backed an arbitary access function
+(if the
+.B rw
+pointer is non-nil),
+or by the contents of an open file
+(using the
+.B fd
+file descriptor).
+Each range has a starting address in the space
+.RB ( base )
+and
+an extent
+.RB ( size ).
+In segments mapped by files,
+the range begins at byte
+.B offset
+in the file.
+The
+.B rw
+function is most commonly used to provide
+access to executing processes via
+.IR ptrace (2)
+and to zeroed segments.
+.PP
+.I Allocmap
+creates an empty map;
+.IR freemap
+frees a map.
+.PP
+.I Addseg
+adds the given segment to the map, resizing the map's
+.I seg
+array if necessary.
+A negative return value indicates an allocation error.
+.PP
+.I Findseg
+returns the index of the segment with the given name (and, if
+.I file
+is non-nil, the given file),
+or \-1 if no such segment is found.
+.PP
+.I Addrtoseg
+returns the index of the segment containing
+for the given address, or \-1 if that address is not mapped.
+Segments may have overlapping address ranges:
+.I addseg
+appends segments to the end of the
+.I seg
+array in the map, and
+.I addrtoseg
+searches the map backwards from the end,
+so the most recently mapped segment wins.
+.PP
+.I Addrtosegafter
+returns the index of the segment containing the lowest mapped
+address greater than
+.IR addr .
+.PP
+.I Removeseg
+removes the segment at the given index.
+.PP
+.IR Get1 ,
+.IR get2 ,
+.IR get4 ,
+and
+.I get8
+retrieve the data stored at address
+.I addr
+in the address space associated
+with
+.IR map .
+.I Get1
+retrieves
+.I n
+bytes of data beginning at
+.I addr
+into
+.IR buf .
+.IR Get2 ,
+.I get4
+and
+.I get8
+retrieve 16-bit, 32-bit and 64-bit values respectively,
+into the location pointed to by
+.IR u .
+The value is byte-swapped if the source
+byte order differs from that of the current architecture.
+This implies that the value returned by
+.IR get2 ,
+.IR get4 ,
+and
+.I get8
+may not be the same as the byte sequences
+returned by
+.I get1
+when
+.I n
+is two, four or eight; the former may be byte-swapped, the
+latter reflects the byte order of the target architecture.
+These functions return the number
+of bytes read or a \-1 when there is an error.
+.PP
+.IR Put1 ,
+.IR put2 ,
+.IR put4 ,
+and
+.I put8
+write to
+the address space associated with
+.IR map .
+The address is translated using the
+map parameters and multi-byte quantities are
+byte-swapped, if necessary, before they are written.
+.I Put1
+transfers
+.I n
+bytes stored at
+.IR buf ;
+.IR put2 ,
+.IR put4 ,
+and
+.I put8
+write the 16-bit, 32-bit or 64-bit quantity contained in
+.IR val ,
+respectively. The number of bytes transferred is returned.
+A \-1 return value indicates an error.
+.PP
+When representing core files or running programs,
+maps also provide access to the register set.
+.IR Rget1 ,
+.IR rget2 ,
+.IR rget4 ,
+.IR rget8 ,
+.IR rput1 ,
+.IR rput2 ,
+.IR rput4 ,
+and
+.IR rput8
+read or write the 1-, 2-, 4-, or 8-byte register
+named by
+.IR reg .
+If the register is not the requested size, the
+behavior is undefined.
+.PP
+.I Fpformat
+converts the contents of a floating-point register to a string.
+.I Buf
+is the address of a buffer of
+.I n
+bytes to hold the resulting string.
+.I Code
+must be either
+.L F
+or
+.LR f ,
+selecting double or single precision, respectively.
+If
+.I code
+is
+.LR F ,
+the contents of the specified register and the
+following register are interpreted as a double-precision
+floating-point number;
+this is meaningful only for architectures that implement
+double-precision floats by combining adjacent single-precision
+registers.
+.PP
+A
+.I location
+represents a place in an executing image capable of
+storing a value.
+Note that locations are typically passed by value rather than by reference.
+.PP
+.I Locnone
+returns an unreadable, unwritable location.
+.I Locaddr
+returns a location representing the memory address
+.IR addr .
+.I Locreg
+returns a location representing the register
+.IR reg .
+.I Locindir
+returns an location representing the memory address
+at
+.I offset
+added to the value of
+.IR reg .
+.I Locconst
+returns an imaginary unwritable location holding the constant
+.IR con ;
+such locations are useful for passing specific constants to
+functions expect locations, such as
+.I unwind
+(see
+.IR mach-stack (3)).
+.PP
+.I Loccmp
+compares two locations, returning negative, zero, or positive
+values if
+.B *a
+is less than, equal to, or greater than
+.BR *b ,
+respectively.
+Register locations are ordered before memory addresses,
+which are ordered before indirections.
+.PP
+.I Locfmt
+is a
+.IR print (3)-verb
+that formats a
+.B Loc
+structure
+.RI ( not
+a pointer to one).
+.PP
+Indirection locations are needed in some contexts (e.g., when
+using
+.I findlsym
+(see
+.IR mach-symbol (3))),
+but bothersome in most.
+.I Locsimplify
+rewrites indirections as absolute memory addresses, by evaluating
+the register using the given map and adding the offset.
+.PP
+The functions
+.IR lget1 ,
+.IR lget2 ,
+.IR lget4 ,
+.IR lget8 ,
+.IR lput1 ,
+.IR lput2 ,
+.IR lput4 ,
+and
+.I lput8
+read and write the given locations, using the
+.IR get ,
+.IR put ,
+.IR rget ,
+and
+.I rput
+function families as necessary.
+.SH SOURCE
+.B /sys/src/libmach
+.SH "SEE ALSO"
+.IR mach(3), mach-file(3)
+.SH DIAGNOSTICS
+These routines set
+.IR errstr .