add start of section 9 manpages (thanks rgl)
this change adds some of the kernel manpages from 9legacy, fixed and updated to match the changes in 9front.
This commit is contained in:
parent
37d6ddd8f3
commit
0b6f0c70db
15 changed files with 1639 additions and 0 deletions
53
sys/man/9/0intro
Normal file
53
sys/man/9/0intro
Normal file
|
@ -0,0 +1,53 @@
|
|||
.TH INTRO 9
|
||||
.SH NAME
|
||||
intro \- introduction to kernel functions
|
||||
.SH DESCRIPTION
|
||||
This section of the manual
|
||||
describes the functions publicly available to the authors of
|
||||
kernel code, particularly device drivers (real and virtual).
|
||||
This section will eventually be much expanded, but this makes a start.
|
||||
.PP
|
||||
The
|
||||
.SM SYNOPSIS
|
||||
subsections do not show the header files needed for
|
||||
the standard kernel declarations.
|
||||
The primary combinations summarised below:
|
||||
.IP
|
||||
.RS
|
||||
.ta \w'\fL#include 'u
|
||||
.nf
|
||||
.B
|
||||
#include "u.h"
|
||||
.B
|
||||
#include "../port/lib.h"
|
||||
.B
|
||||
#include "mem.h"
|
||||
.B
|
||||
#include "dat.h"
|
||||
.B
|
||||
#include "fns.h"
|
||||
.B
|
||||
#include "../port/error.h"
|
||||
.PP
|
||||
.I "furthermore, added in IP code:"
|
||||
.br
|
||||
.B
|
||||
#include "../ip/ip.h"
|
||||
.PP
|
||||
.I "furthermore, in hardware device drivers:"
|
||||
.br
|
||||
.B
|
||||
#include "io.h"
|
||||
.br
|
||||
.B
|
||||
#include "ureg.h"
|
||||
.PP
|
||||
.I "furthermore, in network interfaces or ether drivers:"
|
||||
.B
|
||||
#include "../port/netif.h"
|
||||
.fi
|
||||
.RE
|
||||
.PP
|
||||
There might also be specific include files needed by
|
||||
drivers on particular platforms or to use specialised kernel interfaces.
|
||||
The easiest method is to check the source of likely-looking drivers nearby.
|
67
sys/man/9/INDEX
Normal file
67
sys/man/9/INDEX
Normal file
|
@ -0,0 +1,67 @@
|
|||
0intro 0intro
|
||||
intro 0intro
|
||||
BALLOC allocb
|
||||
BLEN allocb
|
||||
adjustblock allocb
|
||||
allocb allocb
|
||||
blockalloclen allocb
|
||||
blocklen allocb
|
||||
checkb allocb
|
||||
concatblock allocb
|
||||
copyblock allocb
|
||||
freeb allocb
|
||||
freeblist allocb
|
||||
iallocb allocb
|
||||
packblock allocb
|
||||
padblock allocb
|
||||
pullblock allocb
|
||||
pullupblock allocb
|
||||
readblist allocb
|
||||
trimblock allocb
|
||||
addclock0link delay
|
||||
delay delay
|
||||
microdelay delay
|
||||
error error
|
||||
nexterror error
|
||||
poperror error
|
||||
waserror error
|
||||
eve eve
|
||||
iseve eve
|
||||
intrdisable intrenable
|
||||
intrenable intrenable
|
||||
kproc kproc
|
||||
pexit kproc
|
||||
postnote kproc
|
||||
free malloc
|
||||
getmalloctag malloc
|
||||
getrealloctag malloc
|
||||
malloc malloc
|
||||
mallocz malloc
|
||||
msize malloc
|
||||
realloc malloc
|
||||
secalloc malloc
|
||||
secfree malloc
|
||||
setmalloctag malloc
|
||||
setrealloctag malloc
|
||||
smalloc malloc
|
||||
panic panic
|
||||
canqlock qlock
|
||||
qlock qlock
|
||||
qunlock qlock
|
||||
rlock qlock
|
||||
runlock qlock
|
||||
wlock qlock
|
||||
wunlock qlock
|
||||
return0 sleep
|
||||
sleep sleep
|
||||
tsleep sleep
|
||||
wakeup sleep
|
||||
islo splhi
|
||||
splhi splhi
|
||||
spllo splhi
|
||||
splx splhi
|
||||
xalloc xalloc
|
||||
xallocz xalloc
|
||||
xfree xalloc
|
||||
xspanalloc xalloc
|
||||
xsummary xalloc
|
61
sys/man/9/INDEX.html
Normal file
61
sys/man/9/INDEX.html
Normal file
|
@ -0,0 +1,61 @@
|
|||
<HEAD>
|
||||
<TITLE>plan 9 man section 9</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<B>[<A HREF="/sys/man/index.html">manual index</A>]</B>
|
||||
<H2>Plan 9 from Bell Labs - Section 9 - </H2>
|
||||
<HR>
|
||||
<DL>
|
||||
<DT><A HREF="/magic/man2html/9/0intro">0intro</A>
|
||||
- introduction to kernel functions
|
||||
<DD><TT> intro</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/allocb">allocb</A>
|
||||
- data block management
|
||||
<DD><TT> allocb, iallocb, freeb, freeblist, BLEN, BALLOC, blocklen, blockalloclen, readblist, concatblock, copyblock, trimblock, packblock, padblock, pullblock, pullupblock, adjustblock, checkb</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/delay">delay</A>
|
||||
- small delays, clock interrupts
|
||||
<DD><TT> delay, microdelay, addclock0link</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/error">error</A>
|
||||
- error handling functions
|
||||
<DD><TT> error, nexterror, poperror, waserror</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/eve">eve</A>
|
||||
- privileged user
|
||||
<DD><TT> eve, iseve</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/intrenable">intrenable</A>
|
||||
- enable (disable) an interrupt handler
|
||||
<DD><TT> intrenable, intrdisable</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/kproc">kproc</A>
|
||||
- kernel process creation, termination and interruption
|
||||
<DD><TT> kproc, pexit, postnote</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/malloc">malloc</A>
|
||||
- kernel memory allocator
|
||||
<DD><TT> malloc, mallocz, smalloc, realloc, free, msize, secalloc, secfree, setmalloctag, setrealloctag, getmalloctag, getrealloctag</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/panic">panic</A>
|
||||
- abandon hope, all ye who enter here
|
||||
<DD><TT> panic</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/qlock">qlock</A>
|
||||
- serial synchronisation
|
||||
<DD><TT> qlock, qunlock, canqlock, rlock, runlock, wlock, wunlock</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/sleep">sleep</A>
|
||||
- process synchronisation
|
||||
<DD><TT> sleep, wakeup, tsleep, return0</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/splhi">splhi</A>
|
||||
- enable and disable interrupts
|
||||
<DD><TT> splhi, spllo, splx, islo</TT>
|
||||
</DT>
|
||||
<DT><A HREF="/magic/man2html/9/xalloc">xalloc</A>
|
||||
- basic memory management
|
||||
<DD><TT> xalloc, xallocz, xspanalloc, xfree, xsummary</TT>
|
||||
</DT>
|
||||
</DL>
|
343
sys/man/9/allocb
Normal file
343
sys/man/9/allocb
Normal file
|
@ -0,0 +1,343 @@
|
|||
.TH ALLOCB 9
|
||||
.SH NAME
|
||||
allocb, iallocb, freeb, freeblist, BLEN, BALLOC, blocklen, blockalloclen, readblist, concatblock, copyblock, trimblock, packblock, padblock, pullblock, pullupblock, adjustblock, checkb \- data block management
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLBlock* 'u
|
||||
.B
|
||||
Block* allocb(int size)
|
||||
.PP
|
||||
.B
|
||||
Block* iallocb(int size)
|
||||
.PP
|
||||
.B
|
||||
void freeb(Block *b)
|
||||
.PP
|
||||
.B
|
||||
void freeblist(Block *b)
|
||||
.PP
|
||||
.B
|
||||
int blocklen(Block *b)
|
||||
.PP
|
||||
.B
|
||||
int blockalloclen(Block *b)
|
||||
.PP
|
||||
.B
|
||||
long readblist(Block *b, uchar *p, long n, ulong offset)
|
||||
.PP
|
||||
.B
|
||||
Block* concatblock(Block *b)
|
||||
.PP
|
||||
.B
|
||||
Block* copyblock(Block *b, int n)
|
||||
.PP
|
||||
.B
|
||||
Block* trimblock(Block *b, int offset, int n)
|
||||
.PP
|
||||
.B
|
||||
Block* packblock(Block *b)
|
||||
.PP
|
||||
.B
|
||||
Block* padblock(Block *b, int n)
|
||||
.PP
|
||||
.B
|
||||
int pullblock(Block **bph, int n)
|
||||
.PP
|
||||
.B
|
||||
Block* pullupblock(Block *b, int n)
|
||||
.PP
|
||||
.B
|
||||
Block* adjustblock(Block *b, int n)
|
||||
.PP
|
||||
.B
|
||||
void checkb(Block *b, char *msg)
|
||||
.sp 0.1
|
||||
.PP
|
||||
.B
|
||||
#define BLEN(s) ((s)->wp - (s)->rp)
|
||||
.PP
|
||||
.B
|
||||
#define BALLOC(s) ((s)->lim - (s)->base)
|
||||
.SH DESCRIPTION
|
||||
A
|
||||
.B Block
|
||||
provides a receptacle for data:
|
||||
.IP
|
||||
.EX
|
||||
.DT
|
||||
typedef
|
||||
struct Block
|
||||
{
|
||||
Block* next;
|
||||
Block* list;
|
||||
uchar* rp; /* first unconsumed byte */
|
||||
uchar* wp; /* first empty byte */
|
||||
uchar* lim; /* 1 past the end of the buffer */
|
||||
uchar* base; /* start of the buffer */
|
||||
void (*free)(Block*);
|
||||
ushort flag;
|
||||
ushort checksum; /* IP checksum of complete packet */
|
||||
} Block;
|
||||
.EE
|
||||
.PP
|
||||
Each
|
||||
.B Block
|
||||
has an associated buffer, located at
|
||||
.BR base ,
|
||||
and accessed via
|
||||
.B wp
|
||||
when filling the buffer, or
|
||||
.B rp
|
||||
when fetching data from it.
|
||||
Each pointer should be incremented to reflect the amount of data written or read.
|
||||
A
|
||||
.B Block
|
||||
is empty when
|
||||
.B rp
|
||||
reaches
|
||||
.BR wp .
|
||||
The pointer
|
||||
.B lim
|
||||
bounds the allocated space.
|
||||
Some operations described below accept lists of
|
||||
.BR Block s,
|
||||
which are
|
||||
chained via their
|
||||
.B next
|
||||
pointers, with a null pointer ending the list.
|
||||
.B Blocks
|
||||
are usually intended for a
|
||||
.B Queue
|
||||
(see
|
||||
.IR qio (9)),
|
||||
but can be used independently.
|
||||
.PP
|
||||
A
|
||||
.B Block
|
||||
and its buffer are normally allocated by one call to
|
||||
.IR malloc (9)
|
||||
and aligned on an 8 byte (\fLBY2V\fP) boundary.
|
||||
Some devices with particular allocation constraints
|
||||
(eg, requiring certain addresses for DMA) might allocate their own
|
||||
.B Block
|
||||
and buffer;
|
||||
.B free
|
||||
must then point to a function that can deallocate the specially allocated
|
||||
.BR Block .
|
||||
.PP
|
||||
Many
|
||||
.B Block
|
||||
operations cannot be used in interrupt handlers
|
||||
because they either
|
||||
.IR sleep (9)
|
||||
or raise an
|
||||
.IR error (9).
|
||||
Of operations that allocate blocks, only
|
||||
.IR iallocb
|
||||
is usable.
|
||||
.PP
|
||||
.I Allocb
|
||||
allocates a
|
||||
.B Block
|
||||
of at least
|
||||
.IR size
|
||||
bytes.
|
||||
The block
|
||||
is initially empty:
|
||||
.B rp
|
||||
and
|
||||
.B wp
|
||||
point to the start of the data.
|
||||
If it cannot allocate memory,
|
||||
.I allocb
|
||||
raises an
|
||||
.IR error (9);
|
||||
it cannot be used by an interrupt handler.
|
||||
.PP
|
||||
.IR Iallocb
|
||||
is similar to
|
||||
.IR allocb
|
||||
but is intended for use by interrupt handlers,
|
||||
and returns a null pointer if no memory is available.
|
||||
It also limits its allocation to a quota allocated at system initialisation to interrupt-time buffering.
|
||||
.PP
|
||||
.I Freeb
|
||||
frees a single
|
||||
.B Block
|
||||
(and its buffer).
|
||||
.PP
|
||||
.I Freeblist
|
||||
frees the whole
|
||||
list of blocks headed by
|
||||
.IR b .
|
||||
.PP
|
||||
.I BLEN
|
||||
returns the number of unread bytes in a single block.
|
||||
.PP
|
||||
.I BALLOC
|
||||
returns the number of allocated bytes in a single block.
|
||||
.PP
|
||||
.I Blocklen
|
||||
returns the number of bytes of unread data in the whole list of blocks headed by
|
||||
.IR b .
|
||||
.PP
|
||||
.I Blockalloclen
|
||||
returns the number of total bytes allocated in the whole list of blocks headed by
|
||||
.IR b .
|
||||
.PP
|
||||
.I Readblist
|
||||
copies
|
||||
.I n
|
||||
bytes of data at offset
|
||||
.I offset
|
||||
from the list of blocks headed by
|
||||
.I b
|
||||
into
|
||||
.IR p ,
|
||||
then returns the amount of bytes copied. It leaves the block list intact.
|
||||
.PP
|
||||
.I Concatblock
|
||||
returns
|
||||
.I b
|
||||
if it is not a list, and otherwise
|
||||
returns a single
|
||||
.B Block
|
||||
containing all the data in the list of blocks
|
||||
.IR b ,
|
||||
which it frees.
|
||||
.PP
|
||||
.I Copyblock
|
||||
by contrast returns a single
|
||||
.B Block
|
||||
containing a copy of the first
|
||||
.I n
|
||||
bytes of data in the block list
|
||||
.IR b ,
|
||||
padding with zeroes if the list contained less than
|
||||
.I n
|
||||
bytes.
|
||||
The list
|
||||
.I b
|
||||
is unchanged.
|
||||
.PP
|
||||
.I Padblock
|
||||
can pad a single
|
||||
.B Block
|
||||
at either end, to reserve space for protocol headers or trailers.
|
||||
If
|
||||
.IR n ≥ 0 ,
|
||||
it inserts
|
||||
.I n
|
||||
bytes at the start of the block,
|
||||
setting the read pointer
|
||||
.B rp
|
||||
to point to the new space.
|
||||
If
|
||||
.IR n < 0 ,
|
||||
it adds
|
||||
.I n
|
||||
bytes at the end of the block,
|
||||
leaving the write pointer
|
||||
.B wp
|
||||
pointing at the new space.
|
||||
In both cases, it allocates a new
|
||||
.B Block
|
||||
if necessary, freeing the old, and
|
||||
it always returns a pointer to the resulting
|
||||
.BR Block .
|
||||
.PP
|
||||
.I Trimblock
|
||||
trims the list
|
||||
.I b
|
||||
to contain no more than
|
||||
.I n
|
||||
bytes starting at
|
||||
.I offset
|
||||
bytes into the data of the original list.
|
||||
It returns a new list, freeing unneeded parts of the old.
|
||||
If no data remains, it returns a null pointer.
|
||||
.PP
|
||||
.I Packblock
|
||||
examines each
|
||||
.B Block
|
||||
in the list
|
||||
.IR b ,
|
||||
reallocating any block in the list that has four times more available space than actual data.
|
||||
It returns a pointer to the revised list.
|
||||
.PP
|
||||
.I Pullblock
|
||||
discards up to
|
||||
.I n
|
||||
bytes from the start of the list headed by
|
||||
.BI * bph \f1.\f0
|
||||
Unneeded blocks are freed.
|
||||
.I Pullblock
|
||||
sets
|
||||
.BI * bph
|
||||
to point to the new list head
|
||||
and returns the number of bytes discarded (which might be less than
|
||||
.IR n ).
|
||||
It is used by transport protocols to discard ack'd data at
|
||||
the head of a retransmission queue.
|
||||
.PP
|
||||
.I Pullupblock
|
||||
rearranges the data in the list of blocks
|
||||
.I b
|
||||
to ensure that there are at least
|
||||
.I n
|
||||
bytes of contiguous data in the first block,
|
||||
and returns a pointer to the new list head.
|
||||
It frees any blocks that it empties.
|
||||
It returns a null pointer if there is not enough data in the list.
|
||||
.PP
|
||||
.I Adjustblock
|
||||
ensures that the block
|
||||
.I b
|
||||
has at least
|
||||
.I n
|
||||
bytes of data, reallocating or padding with zero if necessary.
|
||||
It returns a pointer to the new
|
||||
.BR Block .
|
||||
(If
|
||||
.I n
|
||||
is negative, it frees the block and returns a null pointer.)
|
||||
.PP
|
||||
.I Checkb
|
||||
does some consistency checking of
|
||||
the state of
|
||||
.IR b ;
|
||||
a
|
||||
.IR panic (9)
|
||||
results if things look grim.
|
||||
It is intended for internal use by the queue I/O routines (see
|
||||
.IR qio (9))
|
||||
but could be used elsewhere.
|
||||
.PP
|
||||
The only functions that can be called at interrupt level are
|
||||
.IR iallocb ,
|
||||
.IR freeb ,
|
||||
.IR freeblist ,
|
||||
.IR BLEN ,
|
||||
.IR BALLOC ,
|
||||
.IR blocklen ,
|
||||
.IR blockalloclen ,
|
||||
.IR readblist
|
||||
and
|
||||
.IR trimblock .
|
||||
The others allocate memory and can potentially block.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/allocb.c
|
||||
.br
|
||||
.B /sys/src/9/port/qio.c
|
||||
.SH DIAGNOSTICS
|
||||
Many functions directly or indirectly can raise an
|
||||
.IR error (9),
|
||||
and callers must therefore provide for proper error recovery
|
||||
as described therein to prevent memory leaks and other bugs.
|
||||
Except for
|
||||
.IR iallocb ,
|
||||
any functions that allocate new blocks or lists
|
||||
are unsuitable for use by interrupt handlers.
|
||||
.IR Iallocb
|
||||
returns a null pointer when it runs out of memory.
|
||||
.SH SEE ALSO
|
||||
.IR qio (9)
|
46
sys/man/9/delay
Normal file
46
sys/man/9/delay
Normal file
|
@ -0,0 +1,46 @@
|
|||
.TH DELAY 9
|
||||
.SH NAME
|
||||
delay, microdelay, addclock0link \- small delays, clock interrupts
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLTimer* 'u
|
||||
.B
|
||||
void delay(int ms)
|
||||
.PP
|
||||
.B
|
||||
void microdelay(int µs)
|
||||
.PP
|
||||
.B
|
||||
Timer* addclock0link(void(*clockf)(void), int ms)
|
||||
.SH DESCRIPTION
|
||||
.I Delay
|
||||
busy waits for
|
||||
.I ms
|
||||
milliseconds, forced to be at least one millisecond on some architectures.
|
||||
.PP
|
||||
.I Microdelay
|
||||
works exactly the same as
|
||||
.I delay
|
||||
but using microseconds instead.
|
||||
.PP
|
||||
For delays on the order of clock ticks,
|
||||
.I tsleep
|
||||
(see
|
||||
.IR sleep (9))
|
||||
provides a better alternative to the busy waiting of these routines.
|
||||
.PP
|
||||
.I Addclock0link
|
||||
adds a new periodic timer to the current processor's timer list, with
|
||||
.I clockf
|
||||
executing every
|
||||
.I ms
|
||||
milliseconds. If
|
||||
.I ms
|
||||
is zero a default clock is used, it will panic otherwise (i.e.
|
||||
.I ms
|
||||
< 0).
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/portclock.c
|
||||
.br
|
||||
.B /sys/src/9/*/clock.c
|
||||
.SH SEE ALSO
|
||||
.IR sleep (9)
|
171
sys/man/9/error
Normal file
171
sys/man/9/error
Normal file
|
@ -0,0 +1,171 @@
|
|||
.TH ERROR 9
|
||||
.SH NAME
|
||||
error, nexterror, poperror, waserror \- error handling functions
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fL#define 'u
|
||||
.B
|
||||
void error(char*)
|
||||
.PP
|
||||
.B
|
||||
void nexterror(void)
|
||||
.sp 0.1
|
||||
.PP
|
||||
.B
|
||||
#define poperror() (up->nerrlab--)
|
||||
.PP
|
||||
.B
|
||||
#define waserror() (setlabel(&up->errlab[up->nerrlab++]))
|
||||
.SH DESCRIPTION
|
||||
The kernel handles error conditions using non-local gotos,
|
||||
similar to
|
||||
.IR setjmp (2),
|
||||
but using a stack of error labels to implement nested exception handling.
|
||||
This simplifies many of the internal interfaces by eliminating the need
|
||||
for returning and checking error codes at every level of the call stack,
|
||||
at the cost of requiring kernel routines to adhere to a strict discipline.
|
||||
.PP
|
||||
Each process has in its defining kernel
|
||||
.B Proc
|
||||
structure a stack of labels,
|
||||
.B NERR
|
||||
(currently 64) elements deep.
|
||||
A kernel function that must perform a clean up or recovery action on an error
|
||||
makes a stylised call to
|
||||
.IR waserror ,
|
||||
.IR nexterror
|
||||
and
|
||||
.IR poperror :
|
||||
.IP
|
||||
.EX
|
||||
.DT
|
||||
if(waserror()){
|
||||
/* recovery action */
|
||||
nexterror();
|
||||
}
|
||||
/* normal action */
|
||||
poperror();
|
||||
.EE
|
||||
.PP
|
||||
When called in the normal course of events,
|
||||
.I waserror
|
||||
registers an error handling block by pushing its label onto the stack,
|
||||
and returns zero.
|
||||
The return value of
|
||||
.I waserror
|
||||
should be tested as shown above.
|
||||
If non-zero (true), the calling function should perform the needed
|
||||
error recovery, ended by a call to
|
||||
.I nexterror
|
||||
to transfer control to the next location on the error stack.
|
||||
Typical recovery actions include deallocating memory, unlocking resources, and
|
||||
resetting state variables.
|
||||
.PP
|
||||
Within the recovery block,
|
||||
after handling an error condition, there must normally
|
||||
be a call to
|
||||
.I nexterror
|
||||
to transfer control to any error recovery lower down in the stack.
|
||||
The main exception is in the outermost function in a process,
|
||||
which must not call
|
||||
.I nexterror
|
||||
(there being nothing further on the stack), but calls
|
||||
.I pexit
|
||||
(see
|
||||
.IR kproc (9))
|
||||
instead,
|
||||
to terminate the process.
|
||||
.PP
|
||||
When the need to recover a particular resource has passed,
|
||||
a function that has called
|
||||
.I waserror
|
||||
must
|
||||
remove the corresponding label from the stack by calling
|
||||
.IR poperror .
|
||||
This
|
||||
must
|
||||
be done before returning from the function; otherwise, a subsequent call to
|
||||
.I error
|
||||
will return to an obsolete activation record, with unpredictable but unpleasant consequences.
|
||||
.PP
|
||||
.I Error
|
||||
copies the given error message, which is limited to
|
||||
.B ERRMAX
|
||||
bytes, into the
|
||||
.B Proc.errstr
|
||||
of the current process,
|
||||
enables interrupts by calling
|
||||
.I spllo
|
||||
.RI ( native
|
||||
only),
|
||||
and finally calls
|
||||
.I nexterror
|
||||
to start invoking the recovery procedures currently stacked by
|
||||
.IR waserror .
|
||||
The file
|
||||
.B /sys/src/9/port/error.h
|
||||
offers a wide selection of predefined error messages, suitable for almost any occasion.
|
||||
The message set by the most recent call to
|
||||
.I error
|
||||
can be obtained within the kernel by examining
|
||||
.B up->error
|
||||
and in an application, by using the
|
||||
.L %r
|
||||
directive of
|
||||
.IR print (2).
|
||||
.PP
|
||||
A complex function can have nested error handlers.
|
||||
A
|
||||
.I waserror
|
||||
block will follow the acquisition of a resource, releasing it
|
||||
on error before calling
|
||||
.I nexterror,
|
||||
and a
|
||||
.I poperror
|
||||
will precede its release in the normal case.
|
||||
For example:
|
||||
.IP
|
||||
.EX
|
||||
.DT
|
||||
void
|
||||
outer(Thing *t)
|
||||
{
|
||||
qlock(t);
|
||||
if(waserror()){ /* A */
|
||||
qunlock(t);
|
||||
nexterror();
|
||||
}
|
||||
m = mallocz(READSTR, 0);
|
||||
if(m == nil)
|
||||
error(Enomem); /* returns to A */
|
||||
if(waserror()){ /* B */
|
||||
free(m);
|
||||
nexterror(); /* invokes A */
|
||||
}
|
||||
inner(t);
|
||||
poperror(); /* pops B */
|
||||
free(m);
|
||||
poperror(); /* pops A */
|
||||
qunlock(t);
|
||||
}
|
||||
.sp 1v
|
||||
void
|
||||
inner(Thing *t)
|
||||
{
|
||||
if(t->bad)
|
||||
error(Egreg); /* returns to B */
|
||||
t->valid++;
|
||||
}
|
||||
.EE
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/proc.c
|
||||
.SH CAVEATS
|
||||
The description above has many instances of
|
||||
.IR should ,
|
||||
.IR will ,
|
||||
.I must
|
||||
and
|
||||
.IR "must not" .
|
||||
.SH SEE ALSO
|
||||
.IR panic (9),
|
||||
.IR kproc (9),
|
||||
.IR splhi (9)
|
46
sys/man/9/eve
Normal file
46
sys/man/9/eve
Normal file
|
@ -0,0 +1,46 @@
|
|||
.TH EVE 9
|
||||
.SH NAME
|
||||
eve, iseve \- privileged user
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLchar* 'u
|
||||
.B
|
||||
char *eve;
|
||||
.PP
|
||||
.B
|
||||
int iseve(void)
|
||||
.SH DESCRIPTION
|
||||
.I Eve
|
||||
is a null-terminated string containing the name of the owner of
|
||||
the Plan 9 system (sometimes called the `host owner',
|
||||
see
|
||||
.IR cons (3)).
|
||||
The identity is set on a terminal to the name of the user who logs in.
|
||||
It is set on a CPU server to the
|
||||
.I authid
|
||||
obtained either from NVRAM or by a console prompt.
|
||||
The initial process created by system initialisation is given the
|
||||
.I eve
|
||||
identity.
|
||||
.PP
|
||||
.I Iseve
|
||||
returns true if the current user is
|
||||
.IR eve .
|
||||
Several drivers use
|
||||
.I iseve
|
||||
to check the caller's identity
|
||||
before granting permission to perform certain actions.
|
||||
For example, the console driver allows only the user
|
||||
.I eve
|
||||
to write a new identity into the
|
||||
.B /dev/user
|
||||
file.
|
||||
The privileges are strictly local and do not extend into the network
|
||||
(in particular, to file servers—even ones running on the local machine).
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/auth.c
|
||||
.SH SEE ALSO
|
||||
.IR auth (2),
|
||||
.IR cap (3),
|
||||
.IR cons (3),
|
||||
.IR authsrv (6),
|
||||
.IR auth (8)
|
106
sys/man/9/intrenable
Normal file
106
sys/man/9/intrenable
Normal file
|
@ -0,0 +1,106 @@
|
|||
.TH INTRENABLE 9
|
||||
.SH NAME
|
||||
intrenable, intrdisable \- enable (disable) an interrupt handler
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid* 'u
|
||||
.B
|
||||
void intrenable(int v, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
|
||||
.PP
|
||||
.B
|
||||
void intrdisable(int v, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
|
||||
.SH DESCRIPTION
|
||||
.I Intrenable
|
||||
registers
|
||||
.I f
|
||||
to be called by the kernel's interrupt controller driver each time
|
||||
an interrupt denoted by
|
||||
.I v
|
||||
occurs, and unmasks the corresponding interrupt in the interrupt controller.
|
||||
The encoding of
|
||||
.I v
|
||||
is platform-dependent; it is often an interrupt vector number, but
|
||||
can be more complex.
|
||||
.I Tbdf
|
||||
is a platform-dependent value that might further qualify
|
||||
.IR v .
|
||||
It might for instance
|
||||
denote the type of bus, bus instance, device number and function
|
||||
(following the PCI device indexing scheme), hence its name,
|
||||
but can have platform-dependent meaning.
|
||||
.I Name
|
||||
is a string that should uniquely identify the corresponding device (eg, \f5"uart0"\fP);
|
||||
again it is usually platform-dependent.
|
||||
.I Intrenable
|
||||
supports sharing of interrupt levels when the hardware does.
|
||||
.PP
|
||||
Almost invariably
|
||||
.I f
|
||||
is a function defined in a device driver to carry out the device-specific work associated with a given interrupt.
|
||||
The pointer
|
||||
.I a
|
||||
is passed to
|
||||
.IR f ;
|
||||
typically it points to the driver's data for a given device or controller.
|
||||
It also passes
|
||||
.I f
|
||||
a
|
||||
.B Ureg*
|
||||
value that
|
||||
contains the registers saved by the interrupt handler (the
|
||||
contents are platform specific;
|
||||
see the platform's include file
|
||||
.BR "ureg.h" ).
|
||||
.PP
|
||||
.I F
|
||||
is invoked by underlying code in the kernel that is invoked directly from the hardware vectors.
|
||||
It is therefore not running in any process (see
|
||||
.IR kproc (9);
|
||||
indeed, on many platforms
|
||||
the current process pointer
|
||||
.RB ( up )
|
||||
will be nil.
|
||||
There are many restrictions on kernel functions running outside a process, but a fundamental one is that
|
||||
they must not
|
||||
.IR sleep (9),
|
||||
although they often call
|
||||
.B wakeup
|
||||
to signal the occurrence of an event associated with the interrupt.
|
||||
.IR Qio (9)
|
||||
and other manual pages note which functions are safe for
|
||||
.I f
|
||||
to call.
|
||||
.PP
|
||||
The interrupt controller driver does whatever is
|
||||
required to acknowledge or dismiss the interrupt signal in the interrupt controller,
|
||||
before calling
|
||||
.IR f ,
|
||||
for edge-triggered interrupts,
|
||||
and after calling
|
||||
.I f
|
||||
for level-triggered ones.
|
||||
.I F
|
||||
is responsible for dealing with the cause of the interrupt in the device, including any
|
||||
acknowledgement required in the device, before it returns.
|
||||
.PP
|
||||
.I Intrdisable
|
||||
removes any registration previously made by
|
||||
.I intrenable
|
||||
with matching parameters, and if no other
|
||||
interrupt is active on
|
||||
.IR v ,
|
||||
it masks the interrupt in the controller.
|
||||
Device drivers that are not dynamically configured tend to call
|
||||
.I intrenable
|
||||
during reset or initialisation (see
|
||||
.IR dev (9)),
|
||||
but can call it at any appropriate time, and
|
||||
instead of calling
|
||||
.I intrdisable
|
||||
they can simply enable or disable interrupts in the device as required.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/*/trap.c
|
||||
.SH SEE ALSO
|
||||
.IR malloc (9),
|
||||
.IR qio (9),
|
||||
.IR sleep (9),
|
||||
.IR splhi (9)
|
134
sys/man/9/kproc
Normal file
134
sys/man/9/kproc
Normal file
|
@ -0,0 +1,134 @@
|
|||
.TH KPROC 9
|
||||
.SH NAME
|
||||
kproc, pexit, postnote \- kernel process creation, termination and interruption
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid 'u
|
||||
.B
|
||||
void kproc(char *name, void (*func)(void*), void *arg)
|
||||
.PP
|
||||
.B
|
||||
void pexit(char *note, int freemem)
|
||||
.PP
|
||||
.B
|
||||
int postnote(Proc *p, int dolock, char *n, int flag)
|
||||
.SH DESCRIPTION
|
||||
.I Kproc
|
||||
creates a new kernel process
|
||||
to run the function
|
||||
.IR func ,
|
||||
which is invoked as
|
||||
.BR "(*func)(arg)" .
|
||||
The string
|
||||
.I name
|
||||
is copied into the
|
||||
.B text
|
||||
field of the
|
||||
.B Proc
|
||||
structure of the new process; this value is the name of the kproc in
|
||||
the output of
|
||||
.IR ps (1).
|
||||
The process is made runnable; it
|
||||
will run when selected by the scheduler
|
||||
.IR sched (9).
|
||||
The process is created with base and current priorities set to
|
||||
.BR PriKproc .
|
||||
It shares the kernel process group and thus name space.
|
||||
.PP
|
||||
A kernel process terminates only when it calls
|
||||
.IR pexit ,
|
||||
thereby terminating itself.
|
||||
There is no mechanism for one process to force the termination of another,
|
||||
although it can send a software interrupt using
|
||||
.IR postnote .
|
||||
.I Note
|
||||
is a null string on normal termination, or
|
||||
the cause of
|
||||
If
|
||||
.I freemem
|
||||
is non-zero,
|
||||
any memory allocated by the process is discarded;
|
||||
it should normally be non-zero for any process created
|
||||
by
|
||||
.IR kproc .
|
||||
Use the following to terminate a kernel process normally:
|
||||
.IP
|
||||
.EX
|
||||
pexit("", 1);
|
||||
.EE
|
||||
.PP
|
||||
to terminate a kernel process normally.
|
||||
.PP
|
||||
.I Postnote
|
||||
sends a software interrupt to process
|
||||
.IR p ,
|
||||
causing it, if necessary, to wake from
|
||||
.IR sleep (9)
|
||||
or break out of a
|
||||
.IR rendezvous (2)
|
||||
or an
|
||||
.IR eqlock(9),
|
||||
with an
|
||||
.IR error (9)
|
||||
`interrupted'.
|
||||
Up to
|
||||
.B NNOTE
|
||||
notes can be pending at once (currently 5);
|
||||
if more than that arrive, the process is forced
|
||||
out of
|
||||
.IR sleep ,
|
||||
.I rendezvous
|
||||
and
|
||||
.IR eqlock ,
|
||||
but the message itself is discarded.
|
||||
.I Postnote
|
||||
returns non-zero iff the note has been
|
||||
delivered successfully.
|
||||
If
|
||||
.I dolock
|
||||
is non-zero,
|
||||
.I postnote
|
||||
synchronises delivery of the note with the debugger
|
||||
and other operations of
|
||||
.IR proc (3).
|
||||
.I Flag
|
||||
is zero, or one of the following
|
||||
.TP
|
||||
.B NDebug
|
||||
Print the note message on the user's standard error.
|
||||
Furthermore, suspend the process in a
|
||||
.B Broken
|
||||
state, preserving its memory, for later debugging.
|
||||
.TP
|
||||
.B NExit
|
||||
Deliver the note quietly.
|
||||
.TP
|
||||
.B NUser
|
||||
The note comes from another process, not the system.
|
||||
.PP
|
||||
The kernel uses
|
||||
.I postnote
|
||||
to signal processes that commit grave faults,
|
||||
and to implement the note and kill functions of
|
||||
.IR proc (3).
|
||||
A device driver should use
|
||||
.I postnote
|
||||
only to tell a service process,
|
||||
previously started by the driver using
|
||||
.I kproc ,
|
||||
that it should stop;
|
||||
the note will cause that process to raise an
|
||||
.IR error (9).
|
||||
For example, a process started to read packets from a network device could
|
||||
be stopped as follows when the interface is unbound:
|
||||
.IP
|
||||
.EX
|
||||
postnote(readp, 1, "unbind", 0);
|
||||
.EE
|
||||
.PP
|
||||
where
|
||||
.I readp
|
||||
points to the appropriate
|
||||
.BR Proc .
|
||||
The text of the message is typically irrelevant.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/proc.c
|
187
sys/man/9/malloc
Normal file
187
sys/man/9/malloc
Normal file
|
@ -0,0 +1,187 @@
|
|||
.TH MALLOC 9
|
||||
.SH NAME
|
||||
malloc, mallocz, smalloc, realloc, free, msize, secalloc, secfree, setmalloctag, setrealloctag, getmalloctag, getrealloctag \- kernel memory allocator
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid* 'u
|
||||
.B
|
||||
void* malloc(ulong size)
|
||||
.PP
|
||||
.B
|
||||
void* mallocalign(ulong size, ulong align, long offset, ulong span)
|
||||
.PP
|
||||
.B
|
||||
void* mallocz(ulong size, int clr)
|
||||
.PP
|
||||
.B
|
||||
void* smalloc(ulong size)
|
||||
.PP
|
||||
.B
|
||||
void* realloc(void *p, ulong size)
|
||||
.PP
|
||||
.B
|
||||
void free(void *ptr)
|
||||
.PP
|
||||
.B
|
||||
ulong msize(void *ptr)
|
||||
.PP
|
||||
.B
|
||||
void* secalloc(ulong size)
|
||||
.PP
|
||||
.B
|
||||
void secfree(void *ptr)
|
||||
.PP
|
||||
.B
|
||||
void setmalloctag(void *ptr, ulong tag)
|
||||
.PP
|
||||
.B
|
||||
ulong getmalloctag(void *ptr)
|
||||
.PP
|
||||
.B
|
||||
void setrealloctag(void *ptr, ulong tag)
|
||||
.PP
|
||||
.B
|
||||
ulong getrealloctag(void *ptr)
|
||||
.PP
|
||||
.SH DESCRIPTION
|
||||
These are kernel versions of the functions in
|
||||
.IR malloc (2).
|
||||
They allocate memory from the
|
||||
.B mainmem
|
||||
memory pool,
|
||||
which is managed by
|
||||
the allocator
|
||||
.IR pool (2),
|
||||
which in turn replenishes the pool as required by calling
|
||||
.IR xalloc (9).
|
||||
All but
|
||||
.I smalloc
|
||||
(which calls
|
||||
.IR sleep (9))
|
||||
may safely be called by interrupt handlers.
|
||||
.PP
|
||||
.I Malloc
|
||||
returns a pointer to a block of at least
|
||||
.I size
|
||||
bytes, initialised to zero.
|
||||
The block is suitably aligned for storage of any type of object.
|
||||
The call
|
||||
.B malloc(0)
|
||||
returns a valid pointer rather than null.
|
||||
.I Mallocz
|
||||
is similar, but only clears the memory if
|
||||
.I clr
|
||||
is non-zero.
|
||||
.PP
|
||||
.I Smalloc
|
||||
returns a pointer to a block of
|
||||
.I size
|
||||
bytes, initialised to zero.
|
||||
If the memory is not immediately available,
|
||||
.I smalloc
|
||||
retries every 100 milliseconds until the memory is acquired.
|
||||
.PP
|
||||
.I Mallocalign
|
||||
allocates a block of at least
|
||||
.I n
|
||||
bytes of memory respecting alignment contraints.
|
||||
If
|
||||
.I align
|
||||
is non-zero,
|
||||
the returned pointer is aligned to be equal to
|
||||
.I offset
|
||||
modulo
|
||||
.IR align .
|
||||
If
|
||||
.I span
|
||||
is non-zero,
|
||||
the
|
||||
.I n
|
||||
byte block allocated will not span a
|
||||
.IR span -byte
|
||||
boundary.
|
||||
.PP
|
||||
.I Realloc
|
||||
changes the size of the block pointed to by
|
||||
.I p
|
||||
to
|
||||
.I size
|
||||
bytes,
|
||||
if possible without moving the data,
|
||||
and returns a pointer to the block.
|
||||
The contents are unchanged up to the lesser of old and new sizes,
|
||||
and any new space allocated is initialised to zero.
|
||||
.I Realloc
|
||||
takes on special meanings when one or both arguments are zero:
|
||||
.TP
|
||||
.B "realloc(0,\ size)
|
||||
means
|
||||
.LR malloc(size) ;
|
||||
returns a pointer to the newly-allocated memory
|
||||
.TP
|
||||
.B "realloc(ptr,\ 0)
|
||||
means
|
||||
.LR free(ptr) ;
|
||||
returns null
|
||||
.TP
|
||||
.B "realloc(0,\ 0)
|
||||
no-op; returns null
|
||||
.PD
|
||||
.PP
|
||||
The argument to
|
||||
.I free
|
||||
is a pointer to a block of memory allocated by one of the routines above, which
|
||||
is returned to the allocation pool, or a null pointer, which is ignored.
|
||||
.PP
|
||||
When a block is allocated, sometimes there is some extra unused space at the end.
|
||||
.I Msize
|
||||
grows the block to encompass this unused space and returns the new number
|
||||
of bytes that may be used.
|
||||
.PP
|
||||
.I Secalloc
|
||||
and
|
||||
.I secfree
|
||||
are security-aware functions that use a pool flagged by
|
||||
.B POOL_ANTAGONISM
|
||||
(see
|
||||
.IR pool (2)),
|
||||
which fills every allocated block with garbage before and after its
|
||||
use, to prevent leakage.
|
||||
.PP
|
||||
The memory allocator maintains two word-sized fields
|
||||
associated with each block, the ``malloc tag'' and the ``realloc tag''.
|
||||
By convention, the malloc tag is the PC that allocated the block,
|
||||
and the realloc tag the PC that last reallocated the block.
|
||||
These may be set or examined with
|
||||
.IR setmalloctag ,
|
||||
.IR getmalloctag ,
|
||||
.IR setrealloctag ,
|
||||
and
|
||||
.IR getrealloctag .
|
||||
When allocating blocks directly with
|
||||
.I malloc
|
||||
and
|
||||
.IR realloc ,
|
||||
these tags will be set properly.
|
||||
If a custom allocator wrapper is used,
|
||||
the allocator wrapper can set the tags
|
||||
itself (usually by passing the result of
|
||||
.IR getcallerpc (2)
|
||||
to
|
||||
.IR setmalloctag )
|
||||
to provide more useful information about
|
||||
the source of allocation.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/alloc.c
|
||||
.SH DIAGNOSTICS
|
||||
All functions except
|
||||
.I smalloc
|
||||
return a null pointer if space is unavailable.
|
||||
If the allocated blocks have no malloc or realloc tags,
|
||||
.I getmalloctag
|
||||
and
|
||||
.I getrealloctag
|
||||
return
|
||||
.BR ~0 .
|
||||
.SH SEE ALSO
|
||||
.IR pool (2),
|
||||
.IR xalloc (9)
|
25
sys/man/9/panic
Normal file
25
sys/man/9/panic
Normal file
|
@ -0,0 +1,25 @@
|
|||
.TH PANIC 9
|
||||
.SH NAME
|
||||
panic \- abandon hope, all ye who enter here
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid 'u
|
||||
.B
|
||||
void panic(char *fmt, ...)
|
||||
.SH DESCRIPTION
|
||||
.I Panic
|
||||
writes a message to the console and
|
||||
causes the system to give up the host.
|
||||
It enables interrupts, dumps the kernel stack,
|
||||
and halts the current processor;
|
||||
if more than one, others will gradually come to a halt.
|
||||
Depending on configuration settings, the platform-dependent
|
||||
.I exit
|
||||
might reboot the system.
|
||||
The format
|
||||
.I fmt
|
||||
and associated arguments are the same as those for
|
||||
.IR print (9).
|
||||
.I Panic
|
||||
adds a prefix
|
||||
.L "panic: "
|
||||
and a trailing newline.
|
138
sys/man/9/qlock
Normal file
138
sys/man/9/qlock
Normal file
|
@ -0,0 +1,138 @@
|
|||
.TH QLOCK 9
|
||||
.SH NAME
|
||||
qlock, qunlock, canqlock, rlock, runlock, wlock, wunlock \- serial synchronisation
|
||||
.SH SYNOPSIS
|
||||
.de PB
|
||||
.PP
|
||||
.ft L
|
||||
.nf
|
||||
..
|
||||
.PB
|
||||
typedef struct
|
||||
{
|
||||
Lock use; /* to access Qlock structure */
|
||||
Proc *head; /* next process waiting for object */
|
||||
Proc *tail; /* last process waiting for object */
|
||||
int locked; /* flag */
|
||||
} QLock;
|
||||
.PB
|
||||
typedef struct
|
||||
{
|
||||
Lock use;
|
||||
Proc *head; /* list of waiting processes */
|
||||
Proc *tail;
|
||||
uintptr wpc; /* pc of writer */
|
||||
Proc *wproc; /* writing proc */
|
||||
int readers; /* number of readers */
|
||||
int writer; /* number of writers */
|
||||
} RWlock;
|
||||
.ta \w'\fLvoid 'u
|
||||
.PP
|
||||
.B
|
||||
void eqlock(QLock *l)
|
||||
.PP
|
||||
.B
|
||||
void qlock(QLock *l)
|
||||
.PP
|
||||
.B
|
||||
void qunlock(QLock *l)
|
||||
.PP
|
||||
.B
|
||||
int canqlock(QLock *l)
|
||||
.PP
|
||||
.B
|
||||
void rlock(RWlock *l)
|
||||
.PP
|
||||
.B
|
||||
void runlock(RWlock *l)
|
||||
.PP
|
||||
.B
|
||||
int canrlock(RWlock *l)
|
||||
.PP
|
||||
.B
|
||||
void wlock(RWlock *l)
|
||||
.PP
|
||||
.B
|
||||
void wunlock(RWlock *l)
|
||||
.SH DESCRIPTION
|
||||
The primitive locking functions described in
|
||||
.IR lock (9)
|
||||
guarantee mutual exclusion, but they implement spin locks,
|
||||
and should not be used if the process might
|
||||
.IR sleep (9)
|
||||
within a critical section.
|
||||
The following functions serialise access to a resource by forming an orderly
|
||||
queue of processes.
|
||||
.PP
|
||||
Each resource to be controlled is given an associated
|
||||
.B QLock
|
||||
structure; it is usually most straightforward to put the
|
||||
.B QLock
|
||||
in the structure that represents the resource.
|
||||
It must be initialised to zero before use
|
||||
(as guaranteed for global variables and for structures allocated by
|
||||
.IR malloc ).
|
||||
.PP
|
||||
On return from
|
||||
.IR qlock ,
|
||||
the process has acquired the lock
|
||||
.IR l ,
|
||||
and can assume exclusive access to the associated resource.
|
||||
If the lock is not immediately available, the requesting process is placed on a
|
||||
FIFO queue of processes that have requested the lock.
|
||||
Processes on this list are blocked in the
|
||||
.L Queueing
|
||||
state.
|
||||
.PP
|
||||
.I Eqlock
|
||||
is an interruptible form of
|
||||
.IR qlock.
|
||||
.PP
|
||||
.I Qunlock
|
||||
unlocks
|
||||
.I l
|
||||
and schedules the first process queued for it (if any).
|
||||
.PP
|
||||
.I Canqlock
|
||||
is a non-blocking form of
|
||||
.IR qlock .
|
||||
It tries to obtain the lock
|
||||
.I l
|
||||
and returns true if successful, and 0 otherwise;
|
||||
it always returns immediately.
|
||||
.PP
|
||||
.B RWlock
|
||||
is a form of lock for resources that have distinct readers and writers.
|
||||
It allows concurrent readers but gives each writer exclusive access.
|
||||
A caller announces its read or write intentions by choice of lock (and unlock) function;
|
||||
the system assumes the caller will not modify a structure accessed under read lock.
|
||||
.PP
|
||||
.I Rlock
|
||||
acquires
|
||||
.I l
|
||||
for reading.
|
||||
The holder can read but agrees not to modify the resource.
|
||||
There may be several concurrent readers.
|
||||
.I Canrlock
|
||||
is non-blocking: it returns non-zero if it successfully acquired the lock immediately,
|
||||
and 0 if the resource was unavailable.
|
||||
.PP
|
||||
.I Runlock
|
||||
returns a read lock;
|
||||
the last reader out enables the first writer waiting (if any).
|
||||
.PP
|
||||
.I Wlock
|
||||
acquires a write lock.
|
||||
The holder of such a lock may assume exclusive access to the resource,
|
||||
and is allowed to modify it.
|
||||
.PP
|
||||
.I Wunlock
|
||||
returns a write lock.
|
||||
The next pending process, whether reader or writer, is scheduled.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/qlock.c
|
||||
.br
|
||||
.SH SEE ALSO
|
||||
.IR lock (9),
|
||||
.IR malloc (9),
|
||||
.IR splhi (9)
|
125
sys/man/9/sleep
Normal file
125
sys/man/9/sleep
Normal file
|
@ -0,0 +1,125 @@
|
|||
.TH SLEEP 9
|
||||
.SH NAME
|
||||
sleep, wakeup, tsleep, return0 \- process synchronisation
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid 'u
|
||||
.B
|
||||
void sleep(Rendez *r, int (*f)(void*), void *arg)
|
||||
.PP
|
||||
.B
|
||||
void wakeup(Rendez *r)
|
||||
.PP
|
||||
.B
|
||||
void tsleep(Rendez *r, int (*f)(void*), void *arg, ulong ms)
|
||||
.PP
|
||||
.B
|
||||
int return0(void *arg)
|
||||
.PP
|
||||
.SH DESCRIPTION
|
||||
A process running in the kernel can use these functions to
|
||||
synchronise with an interrupt handler or another kernel process.
|
||||
In particular, they are used by device drivers to wait for an event to be signalled on
|
||||
receipt of an interrupt.
|
||||
(In practice, they are most often used indirectly, through
|
||||
.IR qio (9)
|
||||
for instance.)
|
||||
.PP
|
||||
The caller of
|
||||
.I sleep
|
||||
and a caller of
|
||||
.I wakeup
|
||||
share a
|
||||
.B Rendez
|
||||
structure, to provide a rendezvous point between them
|
||||
to synchronise on an event.
|
||||
.I Sleep
|
||||
uses a condition function
|
||||
.I f
|
||||
that returns true if the event has occurred.
|
||||
.PP
|
||||
.I Sleep
|
||||
evaluates
|
||||
.IB f ( arg ).
|
||||
If true, the event has happened and
|
||||
.I sleep
|
||||
returns immediately.
|
||||
Otherwise,
|
||||
.I sleep
|
||||
blocks on the event variable
|
||||
.IR r ,
|
||||
awaiting
|
||||
.IR wakeup .
|
||||
.PP
|
||||
.I Wakeup
|
||||
is called by either a process or an interrupt handler to wake any process
|
||||
sleeping at
|
||||
.IR r ,
|
||||
signifying that the corresponding condition is true (the event has occurred).
|
||||
It has no effect if there is no sleeping process.
|
||||
.PP
|
||||
.I Tsleep
|
||||
is similar to
|
||||
.IR sleep ,
|
||||
except that if the condition
|
||||
.IB f ( arg )
|
||||
is false and the caller does sleep,
|
||||
and nothing else wakes it within
|
||||
.I ms
|
||||
millliseconds,
|
||||
the system will wake it.
|
||||
.IR Tsleep 's
|
||||
caller must check its environment to decide whether timeout or the event
|
||||
occurred.
|
||||
The timing provided by
|
||||
.I tsleep
|
||||
is imprecise, but adequate in practice for the normal use of protecting against
|
||||
lost interrupts and otherwise unresponsive devices or software.
|
||||
.PP
|
||||
.I Return0
|
||||
ignores its arguments and returns zero. It is commonly used as
|
||||
the predicate
|
||||
.I f
|
||||
in a call to
|
||||
.I tsleep
|
||||
to obtain a time delay, using the
|
||||
.B Rendez
|
||||
variable
|
||||
.B sleep
|
||||
in the
|
||||
.B Proc
|
||||
structure, for example:
|
||||
.IP
|
||||
.B tsleep(&up->sleep, return0, nil, 10);
|
||||
.PP
|
||||
Both
|
||||
.I sleep
|
||||
and
|
||||
.I tsleep
|
||||
can be interrupted by
|
||||
.IR swiproc
|
||||
(see
|
||||
.IR kproc (9)),
|
||||
causing a non-local goto through a call to
|
||||
.IR error (9).
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/proc.c
|
||||
.br
|
||||
.B /sys/src/9/port/sysproc.c
|
||||
.SH DIAGNOSTICS
|
||||
There can be at most one process waiting on a
|
||||
.BR Rendez ,
|
||||
and if two processes collide, the system will
|
||||
.IR panic (9)
|
||||
.RB (`` "double sleep" '').
|
||||
Access to a
|
||||
.B Rendez
|
||||
must therefore be serialised by some other mechanism, usually
|
||||
.IR qlock (9).
|
||||
.SH SEE ALSO
|
||||
.IR lock (9),
|
||||
.IR qlock (9),
|
||||
.IR delay (9)
|
||||
.br
|
||||
``Process Sleep and Wakeup on a Shared-memory Multiprocessor'',
|
||||
in
|
||||
.I "Plan 9 Programmer's Manual: Volume 2".
|
56
sys/man/9/splhi
Normal file
56
sys/man/9/splhi
Normal file
|
@ -0,0 +1,56 @@
|
|||
.TH SPLHI 9
|
||||
.SH NAME
|
||||
splhi, spllo, splx, islo \- enable and disable interrupts
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid 'u
|
||||
.B
|
||||
int spllo(void)
|
||||
.PP
|
||||
.B
|
||||
int splhi(void)
|
||||
.PP
|
||||
.B
|
||||
void splx(int x)
|
||||
.PP
|
||||
.B
|
||||
int islo(void)
|
||||
.SH DESCRIPTION
|
||||
These primitives enable and disable maskable interrupts on the current
|
||||
processor.
|
||||
Generally, device drivers should use
|
||||
.I ilock
|
||||
(see
|
||||
.IR lock (9)),
|
||||
.IR sleep (9),
|
||||
or the functions in
|
||||
.IR qio (9)
|
||||
to control interaction between processes and interrupt handlers.
|
||||
Those routines (but not these) provide correct synchronisation on multiprocessors.
|
||||
.PP
|
||||
.I Spllo
|
||||
enables interrupts and returns a flag representing the previous interrupt enable state.
|
||||
It must not normally be called from interrupt level.
|
||||
.PP
|
||||
.I Splhi
|
||||
disables all maskable interrupts and returns the previous interrupt enable state.
|
||||
The period during which interrupts are disabled had best be short,
|
||||
or real-time applications will suffer.
|
||||
.PP
|
||||
.I Splx
|
||||
restores the interrupt enable state to
|
||||
.IR x ,
|
||||
which must be a value returned
|
||||
by a previous call to
|
||||
.I splhi
|
||||
or
|
||||
.IR spllo .
|
||||
.PP
|
||||
.I Islo
|
||||
returns true (non-zero) if interrupts are currently enabled, and 0 otherwise.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/*/l.s
|
||||
.SH SEE ALSO
|
||||
.IR lock (9),
|
||||
.IR qio (9),
|
||||
.IR sleep (9),
|
||||
.IR intrenable (9)
|
81
sys/man/9/xalloc
Normal file
81
sys/man/9/xalloc
Normal file
|
@ -0,0 +1,81 @@
|
|||
.TH XALLOC 9
|
||||
.SH NAME
|
||||
xalloc, xallocz, xspanalloc, xfree, xsummary \- basic memory management
|
||||
.SH SYNOPSIS
|
||||
.ta \w'\fLvoid* 'u
|
||||
.B
|
||||
void* xalloc(ulong size)
|
||||
.PP
|
||||
.B
|
||||
void* xallocz(ulong size, int clr)
|
||||
.PP
|
||||
.B
|
||||
void* xspanalloc(ulong size, int align, ulong span)
|
||||
.PP
|
||||
.B
|
||||
void xfree(void *p)
|
||||
.PP
|
||||
.B
|
||||
void xsummary(void)
|
||||
.SH DESCRIPTION
|
||||
These are primitives used by higher-level memory allocators in the kernel,
|
||||
such as
|
||||
.IR malloc (9).
|
||||
They are not intended for use directly by most kernel routines.
|
||||
The main exceptions are routines that permanently allocate large structures,
|
||||
or need the special alignment properties guaranteed by
|
||||
.IR xspanalloc .
|
||||
.PP
|
||||
.I Xalloc
|
||||
returns a pointer to a range of size bytes of memory. The memory will be zero filled and aligned on a 8 byte
|
||||
.RB ( BY2V )
|
||||
address. If the memory is not available,
|
||||
.B xalloc
|
||||
returns a null pointer.
|
||||
.PP
|
||||
.I Xmallocz
|
||||
will clear the memory after allocation if
|
||||
.I clr
|
||||
is set to a value other than zero. Since it is used by
|
||||
.IR xmalloc ,
|
||||
the same diagnostics apply.
|
||||
.PP
|
||||
.I Xspanalloc
|
||||
allocates memory given alignment and spanning constraints.
|
||||
The block returned will contain
|
||||
.I size
|
||||
bytes, aligned on a boundary that is
|
||||
.BI "0 mod" " align,"
|
||||
in such a way that the memory in the block does not
|
||||
span an address that is
|
||||
.BI "0 mod" " span."
|
||||
.I Xspanalloc
|
||||
is intended for use
|
||||
allocating hardware data structures (eg, page tables) or I/O buffers
|
||||
that must satisfy specific alignment restrictions.
|
||||
If
|
||||
.I xspanalloc
|
||||
cannot allocate memory to satisfy the given constraints, it will
|
||||
.IR panic (9).
|
||||
The technique it uses can sometimes cause memory to be wasted.
|
||||
Consequently,
|
||||
.I xspanalloc
|
||||
should be used sparingly.
|
||||
.PP
|
||||
.I Xfree
|
||||
frees the block of memory at
|
||||
.IR p ,
|
||||
which must be an address previously returned by
|
||||
.I xalloc
|
||||
(not
|
||||
.IR xspanalloc ).
|
||||
.PP
|
||||
.I Xsummary
|
||||
dumps memory allocation statistics to the console.
|
||||
The output includes the total free space, the number of free holes,
|
||||
and a summary of active holes.
|
||||
Each line shows `address top size'.
|
||||
.SH SOURCE
|
||||
.B /sys/src/9/port/xalloc.c
|
||||
.SH SEE ALSO
|
||||
.IR malloc (9)
|
Loading…
Reference in a new issue