diff options
| author | Doc Manager <doceng@FreeBSD.org> | 2002-10-08 04:52:44 +0000 |
|---|---|---|
| committer | Doc Manager <doceng@FreeBSD.org> | 2002-10-08 04:52:44 +0000 |
| commit | f4774adf9fb5cf5159c2d1895c182b5d972ac1ec (patch) | |
| tree | 8c69d86c0a6a79d4448eca1d42330ce15ebea329 | |
| parent | 48120e76e8f2ff09466d83c7d830fb29b7047461 (diff) | |
Create tag '4.7.0'.release/4.7.0
Notes
svn path=/head/; revision=14555
svn path=/release/4.7.0/; revision=14556; tag=release/4.7.0
57 files changed, 54 insertions, 26668 deletions
diff --git a/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml b/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml deleted file mode 100644 index 726210af41..0000000000 --- a/de_DE.ISO8859-1/books/handbook/multimedia/chapter.sgml +++ /dev/null @@ -1,661 +0,0 @@ -<!-- - The FreeBSD Documentation Project - The FreeBSD German Documentation Project - - $FreeBSD$ - $FreeBSDde: de-docproj/books/handbook/sound/chapter.sgml,v 1.29 2002/08/24 16:30:54 mheinen Exp $ - basiert auf: 1.33 ---> - -<chapter id="sound"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Moses</firstname> - <surname>Moore</surname> - <contrib>Von </contrib> - </author> - </authorgroup> - <!-- 20 November 2000 --> - <authorgroup> - <author> - <firstname>Benedikt</firstname> - <surname>Köhler</surname> - <contrib>Übersetzt von </contrib> - </author> - <author> - <firstname>Uwe</firstname> - <surname>Pierau</surname> - </author> - </authorgroup> - </chapterinfo> - - <title>Sound</title> - - <sect1 id="sound-synopsis"> - <title>Zusammenfassung</title> - - <para>FreeBSD unterstützt viele unterschiedliche Soundkarten, - die Ihnen den Genuss von Highfidelity-Klängen auf Ihrem - Computer ermöglichen. Dazu gehört unter anderem die - Möglichkeit, Tonquellen in den Formaten MPEG Audio Layer 3 - (MP3), WAV, Ogg Vorbis und vielen weiteren Formaten aufzunehmen - und wiederzugeben. Darüber hinaus enthält die FreeBSD - Ports-Sammlung Anwendungen, die Ihnen das Bearbeiten Ihrer - aufgenommenen Tonspuren, das Hinzufügen von Klangeffekten - und die Kontrolle der angeschlossenen MIDI-Geräte - erlauben.</para> - - <para>Nach dem Lesen dieses Kapitels werden Sie wissen:</para> - <itemizedlist> - <listitem><para>Wie Sie Ihre Soundkarte - bestimmen.</para></listitem> - <listitem><para>Wie Sie Ihr System so einstellen, dass die - Soundkarte richtig erkannt wird.</para></listitem> - <listitem><para>Einige Methoden und Beispielanwendungen, mit - denen Sie das korrekte Funktionieren Ihrer Soundkarte - überprüfen können.</para></listitem> - <listitem><para>Wie Sie Fehler in Ihren - Soundkarten-Einstellungen finden.</para></listitem> - <listitem><para>Wie Sie MP3s wiedergeben und - erzeugen.</para></listitem> - <listitem><para>Wie Sie CD-Tonspuren in Dateien - rippen.</para></listitem> - </itemizedlist> - - <para>Bevor Sie dieses Kapitel leben, sollten Sie:</para> - - <itemizedlist> - <listitem><para>Wissen, wie Sie einen neuen Kernel - konfigurieren und installieren (<xref - linkend="kernelconfig">).</para></listitem> - </itemizedlist> - </sect1> - - <sect1 id="sound-devices"> - <title>Bestimmen des korrekten Geräts</title> - - <indexterm><primary>PCI</primary></indexterm> - <indexterm><primary>ISA</primary></indexterm> - <indexterm><primary>Soundkarten</primary></indexterm> - <para>Zunächst sollten Sie in Erfahrung bringen, welches - Modell Ihrer Soundkarte Sie haben, welchen Chip sie benutzt und - ob es sich um eine PCI- oder ISA-Karte handelt. FreeBSD - unterstützt eine ganze Reihe sowohl von PCI- als auch von - ISA-Karten. Wenn Ihre Soundkarte in der folgenden Liste nicht - auftaucht, konsultieren Sie die &man.pcm.4; Manualpage. Diese - Liste ist zwar nicht vollständig, deckt jedoch einige der - verbreitetsten Karten ab.</para> - - <itemizedlist> - <listitem> - <para>Crystal 4237, 4236, 4232, 4231</para> - </listitem> - - <listitem> - <para>Yamaha OPL-SAx</para> - </listitem> - - <listitem> - <para>OPTi931</para> - </listitem> - - <listitem> - <para>Ensoniq AudioPCI 1370/1371</para> - </listitem> - - <listitem> - <para>ESS Solo-1/1E</para> - </listitem> - - <listitem> - <para>NeoMagic 256AV/ZX</para> - </listitem> - - <listitem> - <para>Sound Blaster Pro, 16, 32, AWE64, AWE128, Live</para> - </listitem> - - <listitem> - <para>Creative ViBRA16</para> - </listitem> - - <listitem> - <para>Advanced Asound 100, 110, and Logic ALS120</para> - </listitem> - - <listitem> - <para>ES 1868, 1869, 1879, 1888</para> - </listitem> - - <listitem> - <para>Gravis UltraSound</para> - </listitem> - - <listitem> - <para>Aureal Vortex 1 or 2</para> - </listitem> - </itemizedlist> - - <indexterm> - <primary>Kernel</primary> - <secondary>Konfiguration</secondary> - </indexterm> - - <para>Um Ihre Soundkarte benutzen zu können, müssen Sie - den richtigen Gerätetreiber laden. Dafür gibt es mehrere - Möglichkeiten: Am einfachsten ist es, mit &man.kldload.8; das - entsprechende Kernel-Modul für Ihre Soundkarte zu laden. Sie - können aber auch die Unterstützung Ihrer Soundkarte - statisch in den Kernel hineinkompilieren. Der folgende Abschnitt - erklärt diese Methode. Weitere Informationen über das - Kompilieren eines Kernels erhalten sie in dem Kapitel <link - linkend="kernelconfig">Kernelkonfiguration</link>.</para> - - <sect2> - <title>Creative, Advance und ESS Soundkarten</title> - - <para>Für jede dieser Karten fügen Sie die folgende Zeile - zu Ihrer Kernelkonfiguration hinzu:</para> - - <programlisting>device pcm</programlisting> - - <para>ISA-Karten benötigen zusätzlich noch die - Zeile:</para> - - <programlisting>device sbc</programlisting> - - <para>Nicht-PnP fähige ISA-Karten benötigen die Zeilen:</para> - - <programlisting>device pcm -device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15</programlisting> - - <para>Dies sind die - Voreinstellungen. Sie werden unter Umständen den IRQ oder - andere Einstellungen anpassen müssen. In der &man.sbc.4; - Manualpage finden Sie weitere Informationen dazu.</para> - - <note> - <para>Die Karte Sound Blaster Live wird unter FreeBSD 4.0 - nicht unterstützt. Dazu benötigen Sie einen Patch, - der in diesem Dokument nicht behandelt wird. Es ist deshalb - empfehlenswert, dass Sie in diesem Fall Ihr System auf den - neuesten -STABLE Stand aktualisieren, bevor Sie diese Karte - benutzen können.</para> - </note> - </sect2> - - <sect2> - <title>Gravis UltraSound Karten</title> - - <para>Eine PnP ISA-Karte benötigt die folgenden Zeilen in der - Kernelkonfiguration:</para> - - <programlisting>device pcm -device gusc</programlisting> - - <para>Wenn Sie eine nicht-PnP fähige ISA-Karte besitzen, - fügen Sie die folgenden Zeilen ein:</para> - - <programlisting>device pcm -device gus0 at isa? port 0x220 irq 5 drq 1 flags 0x13</programlisting> - - <para>Es kann sein, dass Sie den - IRQ oder andere Einstellungen Ihrer Karte anpassen - müssen. Lesen Sie dazu die &man.gusc.4; Manualpage - für weitere Informationen.</para> - </sect2> - - <sect2> - <title>Crystal Soundkarten</title> - - <para>In der Kernelkonfiguration geben Sie für Crystal Karten - die beiden folgenden Zeilen an:</para> - - <programlisting>device pcm -device csa</programlisting> - </sect2> - - <sect2> - <title>Allgemeine Unterstützung</title> - - <para>Für PnP ISA- oder PCI-Karten fügen Sie die folgende - Zeile zu Ihrer Kernelkonfiguration hinzu:</para> - - <programlisting>device pcm</programlisting> - - <para>Wenn Sie eine nicht-PnP ISA-Karte besitzen, die keinen - Bridge-Treiber hat, geben Sie zusätzlich die folgende Zeile - an:</para> - - <programlisting>device pcm0 at isa? irq 10 drq 1 flags 0x0</programlisting> - - <para>Ändern Sie den IRQ oder - andere Einstellungen so, dass sie Ihrer Soundkarte - entsprechen.</para> - </sect2> - - <sect2> - <title>Onboard Sound</title> - - <para>Einige Systeme besitzen direkt auf dem Motherboard - eingebaute Soundgeräte. Diese benötigen die folgende - Angabe in Ihrer Kernelkonfiguration:</para> - - <programlisting>options PNPBIOS</programlisting> - </sect2> - </sect1> - - <sect1 id="sound-devicenodes"> - <title>Erstellen und Testen der Device Nodes</title> - - <indexterm><primary>Device Node</primary></indexterm> - <indexterm><primary>Gerätedatei</primary></indexterm> - <para>Nach einem Neustart loggen Sie sich ein und geben - <command>dmesg | grep pcm</command> ein. Sie sollten etwas wie das - folgende sehen:</para> - - <screen>&prompt.root; <userinput>dmesg | grep pcm</userinput> -pcm0: <SB16 DSP 4.11> on sbc0</screen> - - <para>Die Ausgabe Ihres Systems kann anders aussehen. Erscheinen - keine <devicename>pcm</devicename> Geräte, dann ist zuvor - ein Fehler aufgetreten. Wenn das passiert, schauen Sie sich Ihre - Kernelkonfiguration noch einmal an und vergewissern Sie sich, - dass Sie den richtigen Treiber gewählt haben. Weitere - Hinweise zur Fehlersuche gibt <xref linkend="troubleshooting">.</para> - - <para>Ergab der vorige Befehl <devicename>pcm0</devicename> als - Ausgabe, dann müssen Sie folgendes als <username>root</username> - ausführen:</para> - - <screen>&prompt.root; <userinput>cd /dev</userinput> -&prompt.root; <userinput>sh MAKEDEV snd0</userinput></screen> - - <para>Wenn auf den vorigen Befehl <devicename>pcm1</devicename> - als Ausgabe erschienen ist, dann müssen Sie dieselben - Befehle ausführen, nur dass Sie - <devicename>snd0</devicename> durch - <devicename>snd1</devicename> ersetzen.</para> - - <note> - <para>Die obigen Kommandos legen <emphasis>kein</emphasis> - <devicename>/dev/snd</devicename> Device an.</para> - </note> - - <para>Der Befehl <command>MAKEDEV</command> erzeugt eine Gruppe - von Device Nodes, darunter:</para> - - <informaltable frame="none"> - <tgroup cols="2"> - <thead> - <row> - <entry>Device</entry> - <entry>Beschreibung</entry> - </row> - </thead> - - <tbody> - <row> - <entry><devicename>/dev/audio</devicename></entry> - <entry>SPARC-compatible audio device</entry> - </row> - - <row> - <entry><devicename>/dev/dsp</devicename></entry> - <entry>Digitized voice device</entry> - </row> - - <row> - <entry><devicename>/dev/dspW</devicename></entry> - <entry><devicename>/dev/dsp</devicename>-ähnliches - Device mit 16 bits pro Sample</entry> - </row> - - <row> - <entry><devicename>/dev/midi</devicename></entry> - <entry>Raw midi access device</entry> - </row> - - <row> - <entry><devicename>/dev/mixer</devicename></entry> - <entry>Control port mixer device</entry> - </row> - - <row> - <entry><devicename>/dev/music</devicename></entry> - <entry>Level 2 sequencer interface</entry> - </row> - - <row> - <entry><devicename>/dev/sequencer</devicename></entry> - <entry>Sequencer device</entry> - </row> - - <row> - <entry><devicename>/dev/pss</devicename></entry> - <entry>Programmable device interface</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Wenn alles geklappt hat, haben Sie jetzt eine - funktionierende Soundkarte. Nun können Sie eine Anwendung - wie <filename role="package">audio/mpg123</filename> installieren, - um Audiodateien anhören zu können.</para> - - <sect2 id="troubleshooting"> - <title>Häufige Probleme</title> - - <informaltable> - <tgroup cols="2"> - <thead> - <row> - <entry>Fehler</entry> - <entry>Lösung</entry> - </row> - </thead> - <indexterm><primary>Device Node</primary></indexterm> - <indexterm><primary>Gerätedatei</primary></indexterm> - - <tbody> - <row> - <entry><errorname>unsupported subdevice XX</errorname></entry> - <entry><para>Ein oder mehrere Device Nodes wurden nicht - korrekt angelegt. Wiederholen Sie die oben angegebenen - Schritte.</para></entry> - </row> - - <indexterm><primary>I/O port</primary></indexterm> - <row> - <entry><errorname>sb_dspwr(XX) timed out</errorname></entry> - <entry><para>Der I/O Port ist nicht korrekt angegeben.</para></entry> - </row> - - <indexterm><primary>IRQ</primary></indexterm> - <row> - <entry><errorname>bad irq XX</errorname></entry> - <entry><para>Der IRQ ist falsch angegeben. Stellen Sie - sicher, dass der angegebene IRQ mit dem Sound IRQ - übereinstimmt.</para></entry> - </row> - - <row> - <entry><errorname>xxx: gus pcm not attached, out of - memory</errorname></entry> - <entry><para>Es ist nicht genug Speicher verfügbar, - um das Gerät betreiben zu können.</para></entry> - </row> - - <indexterm><primary>DSP</primary></indexterm> - <row> - <entry><errorname>xxx: can't open /dev/dsp!</errorname></entry> - <entry><para>Überprüfen Sie mit <command>fstat | - grep dsp</command> ob eine andere Anwendung das - Gerät geöffnet hat. Häufige - Störenfriede sind <application>esound</application> - oder die Sound-Unterstützung von - <application>KDE</application>.</para></entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect2> - </sect1> - - <sect1 id="sound-mp3"> - <sect1info> - <authorgroup> - <author> - <firstname>Chern</firstname> - <surname>Lee</surname> - <contrib>Ein Beitrag von </contrib> - </author> - </authorgroup> - <!-- 11 Sept 2001 --> - <authorgroup> - <author> - <firstname>Benedikt</firstname> - <surname>Köhler</surname> - <contrib>Übersetzt von </contrib> - </author> - </authorgroup> - </sect1info> - - <title>MP3 Audio</title> - - <para>MP3 (MPEG Layer 3 Audio) ermöglicht eine - Klangwiedergabe in CD-ähnlicher Qualität, was Sie sich - auf Ihrem FreeBSD Rechner nicht entgehen lassen sollten.</para> - - <sect2 id="mp3-players"> - <title>MP3-Player</title> - - <para><application>XMMS</application> (X Multimedia System) ist - bei weitem der beliebteste XFree86 MP3-Player. - <application>WinAmp</application>-Skins können auch mit - <application>XMMS</application> genutzt werden, da die - Benutzerschnittstelle fast identisch mit der von Nullsofts - <application>WinAmp</application> ist. Daneben - unterstützt <application>XMMS</application> auch eigene - Plugins.</para> - - <para><application>XMMS</application> kann als - <filename role="package">audio/xmms</filename> Port oder Package installiert - werden.</para> - - <para>Die Benutzerschnittstelle von - <application>XMMS</application> ist leicht zu erlernen und - beinhaltet eine Playlist, einen graphischen Equalizer und - vieles mehr. Diejenigen, die mit WinAmp vertraut sind, werden - <application>XMMS</application> sehr leicht zu benutzen - finden.</para> - - <para>Der Port <filename role="package">audio/mpg123</filename> ist - ein alternativer, kommandozeilenorientierter MP3-Player.</para> - - <para><application>mpg123</application> kann ausgeführt - werden, in dem man das zu benutzende Sound Device und die - abzuspielende MP3-Datei in der Kommandozeile wie unten - angibt:</para> - - <screen>&prompt.root; <userinput>mpg123 -a <replaceable>/dev/dsp1.0</replaceable> Foobar-GreatestHits.mp3</userinput> -High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. -Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. -Uses code from various people. See 'README' for more! -THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! - - - - - -Playing MPEG stream from BT - Foobar-GreastHits.mp3 ... -MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo -</screen> - - <para><literal>/dev/dsp1.0</literal> sollten Sie dabei mit dem - <devicename>dsp</devicename>-Device Ihres Systems ersetzen.</para> - </sect2> - - <sect2 id="rip-cd"> - <title>CD-Audio Tracks rippen</title> - - <para>Bevor man eine ganze CD oder einen CD-Track in das - MP3-Format umwandeln kann, müssen die Audiodaten von der - CD auf die Festplatte gerippt werden. Dabei werden die CDDA - (CD Digital Audio) Rohdaten in WAV-Dateien kopiert.</para> - - <para>Die Anwendung <command>cdda2wav</command> die in dem - <filename role="package">sysutils/cdrtools</filename> Paket enthalten - ist, kann zum Rippen der Audiodaten und anderen Informationen von CDs - genutzt werden.</para> - - <para>Wenn die Audio CD in dem Laufwerk liegt, können Sie - mit folgenden Befehl (als <username>root</username>) eine - ganze CD in einzelne WAV-Dateien (eine Datei für jeden - Track) rippen:</para> - - <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -B</userinput></screen> - - <para>Der Schalter <option>-D - <replaceable>0,1,0</replaceable></option> bezieht sich auf - das SCSI Device <devicename>0,1,0</devicename>, dass sich aus - dem Ergebnis des Befehls <command>cdrecord -scanbus</command> - ergibt.</para> - - <para>Um einzelne Tracks zu rippen, benutzen Sie den - <option>-t</option> Schalter wie folgt:</para> - - <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -t 7</userinput></screen> - - <para>Dieses Beispiel rippt den siebten Track der Audio - CDROM. Um mehrere Tracks zu rippen, zum Beispiel die Tracks - eins bis sieben, können Sie wie folgt einen Bereich - angeben:</para> - - <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>0,1,0</replaceable> -t 1+7</userinput></screen> - - <para><application>cdda2wav</application> unterstützt auch ATAPI - (IDE) CDROM Laufwerke. Wenn Sie ein IDE Laufwerk benutzen, geben - Sie beim Aufruf von <command>cdda2wav</command> den - Gerätenamen anstelle der SCSI Gerätenummern an. Um den - siebten Track eines IDE Laufwerkes zu rippen, benutzen Sie das - folgende Kommando:</para> - - <screen>&prompt.root; <userinput>cdda2wav -D <replaceable>/dev/acd0a</replaceable> -t 7</userinput></screen> - </sect2> - - <sect2 id="mp3-encoding"> - <title>MP3-Dateien kodieren</title> - - <para>Gegenwärtig ist <application>Lame</application> der - meistbenutzte MP3-Encoder. <application>Lame</application> - finden Sie unter <filename role="package">audio/lame</filename> im - Ports-Verzeichnis.</para> - - <para>Benutzen Sie die WAV-Dateien, die sie von CD gerippt - haben, und wandeln sie mit dem folgenden Befehl die Datei - <filename>audio01.wav</filename> in - <filename>audio01.mp3</filename> um:</para> - - <screen>&prompt.root; <userinput>lame -h -b <replaceable>128</replaceable> \ ---tt "<replaceable>Foo Liedtitel</replaceable>" \ ---ta "<replaceable>FooBar Künstler</replaceable>" \ ---tl "<replaceable>FooBar Album</replaceable>" \ ---ty "<replaceable>2001</replaceable>" \ ---tc "<replaceable>Geripped und kodiert von Foo</replaceable>" \ ---tg "<replaceable>Musikrichtung</replaceable>" \ -<replaceable>audio01.wav audio01.mp3</replaceable></userinput></screen> - - <para>128 kbits ist die gewöhnliche MP3 Bitrate. Viele - bevorzugen mit 160 oder 192 kbits eine höhere Qualität. Je - höher die Bitrate ist, desto mehr Speicherplatz - benötigt die resultierende MP3-Datei, allerdings wird die - Qualität dadurch auch besser. Der Schalter - <option>-h</option> verwendet den <quote>higher quality but a - little slower</quote> (höhere Qualität, aber etwas - langsamer) Modus. Die Schalter, die mit - <option>--t</option> beginnen, sind ID3-Tags, die in der Regel - Informationen über das Lied enthalten und in die - MP3-Datei eingebettet sind. Weitere Optionen können in - der Manualpage von <application>Lame</application> nachgelesen - werden.</para> - </sect2> - - <sect2 id="mp3-decoding"> - <title>MP3-Dateien dekodieren</title> - - <para>Um aus MP3-Dateien eine Audio CD zu erstellen, müssen - diese in ein nicht komprimiertes WAV-Format umgewandelt - werden. Sowohl <application>XMMS</application> als auch - <application>mpg123</application> unterstützen die Ausgabe - der MP3-Dateien in unkomprimierte Dateiformate.</para> - - <para>Dekodieren mit <application>XMMS</application>:</para> - - <procedure> - <step> - <para>Starten Sie <application>XMMS</application>.</para> - </step> - - <step> - <para>Klicken Sie mit der rechten Maustaste, um das - <application>XMMS</application>-Menu zu öffnen.</para> - </step> - - <step> - <para>Wählen Sie <literal>Preference</literal> im - Untermenü <literal>Options</literal>.</para> - </step> - - <step> - <para>Ändern Sie das Output-Plugin in <quote>Disk - Writer Plugin</quote>.</para> - </step> - - <step> - <para>Drücken Sie <literal>Configure</literal>.</para> - </step> - - <step> - <para>Geben Sie ein Verzeichnis ein (oder wählen Sie - browse), in das Sie die unkomprimierte Datei schreiben - wollen.</para> - </step> - - <step> - <para>Laden Sie die MP3-Datei wie gewohnt in - <application>XMMS</application> mit einer Lautstärke - von 100% und einem abgeschalteten EQ.</para> - </step> - - <step> - <para>Drücken Sie <literal>Play</literal> und es wird - so aussehen, als spiele <application>XMMS</application> - die MP3-Datei ab, aber keine Musik ist zu hören. Der - Player überspielt die MP3-Datei in eine Datei.</para> - </step> - - <step> - <para>Vergessen Sie nicht, das Output Plugin wieder in den - Ausgangszustand zurückzusetzen um wieder MP3-Dateien - anhören zu können.</para> - </step> - </procedure> - - <para>Mit <application>mpg123</application> nach stdout schreiben:</para> - - <procedure> - <step> - <para>Geben Sie mpg123 -s - <replaceable>audio01.mp3</replaceable> > audio01.pcm - ein</para> - </step> - </procedure> - - <para><application>XMMS</application> schreibt die Datei in dem - WAV-Formal während <application>mpg123</application> die - MP3-Datei in rohe PCM Audiodaten umwandelt. Beide Formate - können von <application>cdrecord</application> oder - <application>burncd</application> verwendet werden, um Audio - CDs zu schreiben.</para> - - <para>Lesen Sie <xref linkend="creating-cds"> in diesem Handbuch, - um mehr Informationen zur Benutzung von CD-Brennern mit FreeBSD zu - erhalten.</para> - </sect2> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> - diff --git a/en/handbook/contrib/chapter.sgml b/en/handbook/contrib/chapter.sgml deleted file mode 100644 index 9a41073467..0000000000 --- a/en/handbook/contrib/chapter.sgml +++ /dev/null @@ -1,5796 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $Id: chapter.sgml,v 1.92 2000-03-19 06:20:31 vanilla Exp $ ---> - -<chapter id="contrib"> - <title>Contributing to FreeBSD</title> - - <para><emphasis>Contributed by &a.jkh;.</emphasis></para> - - <para>So you want to contribute something to FreeBSD? That is great! We can - always use the help, and FreeBSD is one of those systems that - <emphasis>relies</emphasis> on the contributions of its user base in order - to survive. Your contributions are not only appreciated, they are vital - to FreeBSD's continued growth!</para> - - <para>Contrary to what some people might also have you believe, you do not - need to be a hot-shot programmer or a close personal friend of the FreeBSD - core team in order to have your contributions accepted. The FreeBSD - Project's development is done by a large and growing number of - international contributors whose ages and areas of technical expertise - vary greatly, and there is always more work to be done than there are - people available to do it.</para> - - <para>Since the FreeBSD project is responsible for an entire operating - system environment (and its installation) rather than just a kernel or a - few scattered utilities, our <filename>TODO</filename> list also spans a - very wide range of tasks, from documentation, beta testing and - presentation to highly specialized types of kernel development. No matter - what your skill level, there is almost certainly something you can do to - help the project!</para> - - <para>Commercial entities engaged in FreeBSD-related enterprises are also - encouraged to contact us. Need a special extension to make your product - work? You will find us receptive to your requests, given that they are not - too outlandish. Working on a value-added product? Please let us know! We - may be able to work cooperatively on some aspect of it. The free software - world is challenging a lot of existing assumptions about how software is - developed, sold, and maintained throughout its life cycle, and we urge you - to at least give it a second look.</para> - - <sect1> - <title>What Is Needed</title> - - <para>The following list of tasks and sub-projects represents something of - an amalgam of the various core team <filename>TODO</filename> lists and - user requests we have collected over the last couple of months. Where - possible, tasks have been ranked by degree of urgency. If you are - interested in working on one of the tasks you see here, send mail to the - coordinator listed by clicking on their names. If no coordinator has - been appointed, maybe you would like to volunteer?</para> - - <sect2> - <title>High priority tasks</title> - - <para>The following tasks are considered to be urgent, usually because - they represent something that is badly broken or sorely needed:</para> - - <orderedlist> - <listitem> - <para>3-stage boot issues. Overall coordination: &a.hackers;</para> - - <itemizedlist> - <listitem> - <para>Do WinNT compatible drive tagging so that the 3rd stage - can provide an accurate mapping of BIOS geometries for - disks.</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para>Filesystem problems. Overall coordination: &a.fs;</para> - - <itemizedlist> - <listitem> - <para>Fix the MSDOS file system.</para> - </listitem> - - <listitem> - <para>Clean up and document the nullfs filesystem code. - Coordinator: &a.eivind;</para> - </listitem> - - <listitem> - <para>Fix the union file system. Coordinator: &a.dg;</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para>Implement Int13 vm86 disk driver. Coordinator: - &a.hackers;</para> - </listitem> - - <listitem> - <para>New bus architecture. Coordinator: &a.newbus;</para> - - <itemizedlist> - <listitem> - <para>Port existing ISA drivers to new architecture.</para> - </listitem> - - <listitem> - <para>Move all interrupt-management code to appropriate parts of - the bus drivers.</para> - </listitem> - - <listitem> - <para>Port PCI subsystem to new architecture. Coordinator: - &a.dfr;</para> - </listitem> - - <listitem> - <para>Figure out the right way to handle removable devices and - then use that as a substrate on which PC-Card and CardBus - support can be implemented.</para> - </listitem> - - <listitem> - <para>Resolve the probe/attach priority issue once and for - all.</para> - </listitem> - - <listitem> - <para>Move any remaining buses over to the new - architecture.</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para>Kernel issues. Overall coordination: &a.hackers;</para> - </listitem> - - <listitem> - <para>Add more pro-active security infrastructure. Overall - coordination: &a.security;</para> - - <itemizedlist> - <listitem> - <para>Build something like Tripwire(TM) into the kernel, with a - remote and local part. There are a number of cryptographic - issues to getting this right; contact the coordinator for - details. Coordinator: &a.eivind;</para> - </listitem> - - <listitem> - <para>Make the entire kernel use <literal>suser()</literal> - instead of comparing to 0. It is presently using about half - of each. Coordinator: &a.eivind;</para> - </listitem> - - <listitem> - <para>Split securelevels into different parts, to allow an - administrator to throw away those privileges he can throw - away. Setting the overall securelevel needs to have the same - effect as now, obviously. Coordinator: &a.eivind;</para> - </listitem> - - <listitem> - <para>Make it possible to upload a list of “allowed - program” to BPF, and then block BPF from accepting other - programs. This would allow BPF to be used e.g. for DHCP, - without allowing an attacker to start snooping the local - network.</para> - </listitem> - - <listitem> - <para>Update the security checker script. We should at least - grab all the checks from the other BSD derivatives, and add - checks that a system with securelevel increased also have - reasonable flags on the relevant parts. Coordinator: - &a.eivind;</para> - </listitem> - - <listitem> - <para>Add authorization infrastructure to the kernel, to allow - different authorization policies. Part of this could be done - by modifying <literal>suser()</literal>. Coordinator: - &a.eivind;</para> - </listitem> - - <listitem> - <para>Add code to the NFS layer so that you cannot - <literal>chdir("..")</literal> out of an NFS partition. E.g., - <filename>/usr</filename> is a UFS partition with - <filename>/usr/src</filename> NFS exported. Now it is - possible to use the NFS filehandle for - <filename>/usr/src</filename> to get access to - <filename>/usr</filename>.</para> - </listitem> - </itemizedlist> - </listitem> - </orderedlist> - </sect2> - - <sect2> - <title>Medium priority tasks</title> - - <para>The following tasks need to be done, but not with any particular - urgency:</para> - - <orderedlist> - <listitem> - <para>Full KLD based driver support/Configuration Manager.</para> - - <itemizedlist> - <listitem> - <para>Write a configuration manager (in the 3rd stage boot?) - that probes your hardware in a sane manner, keeps only the - KLDs required for your hardware, etc.</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para>PCMCIA/PCCARD. Coordinators: &a.msmith; and &a.phk;</para> - - <itemizedlist> - <listitem> - <para>Documentation!</para> - </listitem> - - <listitem> - <para>Reliable operation of the pcic driver (needs - testing).</para> - </listitem> - - <listitem> - <para>Recognizer and handler for <filename>sio.c</filename> - (mostly done).</para> - </listitem> - - <listitem> - <para>Recognizer and handler for <filename>ed.c</filename> - (mostly done).</para> - </listitem> - - <listitem> - <para>Recognizer and handler for <filename>ep.c</filename> - (mostly done).</para> - </listitem> - - <listitem> - <para>User-mode recognizer and handler (partially done).</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para>Advanced Power Management. Coordinators: &a.msmith; and - &a.phk;</para> - - <itemizedlist> - <listitem> - <para>APM sub-driver (mostly done).</para> - </listitem> - - <listitem> - <para>IDE/ATA disk sub-driver (partially done).</para> - </listitem> - - <listitem> - <para>syscons/pcvt sub-driver.</para> - </listitem> - - <listitem> - <para>Integration with the PCMCIA/PCCARD drivers - (suspend/resume).</para> - </listitem> - </itemizedlist> - </listitem> - </orderedlist> - </sect2> - - <sect2> - <title>Low priority tasks</title> - - <para>The following tasks are purely cosmetic or represent such an - investment of work that it is not likely that anyone will get them - done anytime soon:</para> - - <para>The first N items are from Terry Lambert - <email>terry@lambert.org</email></para> - - <orderedlist> - <listitem> - <para>NetWare Server (protected mode ODI driver) loader and - subservices to allow the use of ODI card drivers supplied with - network cards. The same thing for NDIS drivers and NetWare SCSI - drivers.</para> - </listitem> - - <listitem> - <para>An "upgrade system" option that works on Linux boxes instead - of just previous rev FreeBSD boxes.</para> - </listitem> - - <listitem> - <para>Symmetric Multiprocessing with kernel preemption (requires - kernel preemption).</para> - </listitem> - - <listitem> - <para>A concerted effort at support for portable computers. This is - somewhat handled by changing PCMCIA bridging rules and power - management event handling. But there are things like detecting - internal vs. external display and picking a different screen - resolution based on that fact, not spinning down the disk if the - machine is in dock, and allowing dock-based cards to disappear - without affecting the machines ability to boot (same issue for - PCMCIA).</para> - </listitem> - </orderedlist> - </sect2> - - <sect2> - <title>Smaller tasks</title> - - <para>Most of the tasks listed in the previous sections require either a - considerable investment of time or an in-depth knowledge of the - FreeBSD kernel (or both). However, there are also many useful tasks - which are suitable for "weekend hackers", or people without - programming skills.</para> - - <orderedlist> - <listitem> - <para>If you run FreeBSD-current and have a good Internet - connection, there is a machine <hostid - role="fqdn">current.FreeBSD.org</hostid> which builds a full - release once a day — every now and again, try and install - the latest release from it and report any failures in the - process.</para> - </listitem> - - <listitem> - <para>Read the freebsd-bugs mailing list. There might be a - problem you can comment constructively on or with patches you - can test. Or you could even try to fix one of the problems - yourself.</para> - </listitem> - - <listitem> - <para>Read through the FAQ and Handbook periodically. If anything - is badly explained, out of date or even just completely wrong, let - us know. Even better, send us a fix (SGML is not difficult to - learn, but there is no objection to ASCII submissions).</para> - </listitem> - - <listitem> - <para>Help translate FreeBSD documentation into your native language - (if not already available) — just send an email to &a.doc; - asking if anyone is working on it. Note that you are not - committing yourself to translating every single FreeBSD document - by doing this — in fact, the documentation most in need of - translation is the installation instructions.</para> - </listitem> - - <listitem> - <para>Read the freebsd-questions mailing list and &ng.misc - occasionally (or even regularly). It can be very satisfying to - share your expertise and help people solve their problems; - sometimes you may even learn something new yourself! These forums - can also be a source of ideas for things to work on.</para> - </listitem> - - <listitem> - <para>If you know of any bugfixes which have been successfully - applied to -current but have not been merged into -stable after a - decent interval (normally a couple of weeks), send the committer a - polite reminder.</para> - </listitem> - - <listitem> - <para>Move contributed software to <filename>src/contrib</filename> - in the source tree.</para> - </listitem> - - <listitem> - <para>Make sure code in <filename>src/contrib</filename> is up to - date.</para> - </listitem> - - <listitem> - <para>Look for year 2000 bugs (and fix any you find!)</para> - </listitem> - - <listitem> - <para>Build the source tree (or just part of it) with extra warnings - enabled and clean up the warnings.</para> - </listitem> - - <listitem> - <para>Fix warnings for ports which do deprecated things like using - gets() or including malloc.h.</para> - </listitem> - - <listitem> - <para>If you have contributed any ports, send your patches back to - the original author (this will make your life easier when they - bring out the next version)</para> - </listitem> - - <listitem> - <para>Suggest further tasks for this list!</para> - </listitem> - </orderedlist> - </sect2> - - <sect2> - <title>Work through the PR database</title> - - <para>The <ulink - url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi">FreeBSD PR - list</ulink> shows all the current active problem reports and - requests for enhancement that have been submitted by FreeBSD users. - Look through the open PRs, and see if anything there takes your - interest. Some of these might be very simple tasks, that just need an - extra pair of eyes to look over them and confirm that the fix in the - PR is a good one. Others might be much more complex.</para> - - <para>Start with the PRs that have not been assigned to anyone else, but - if one them is assigned to someone else, but it looks like something - you can handle, e-mail the person it is assigned to and ask if you can - work on it—they might already have a patch ready to be tested, - or further ideas that you can discuss with them.</para> - </sect2> - </sect1> - - <sect1> - <title>How to Contribute</title> - - <para>Contributions to the system generally fall into one or more of the - following 6 categories:</para> - - <sect2 id="contrib-general"> - <title>Bug reports and general commentary</title> - - <para>An idea or suggestion of <emphasis>general</emphasis> technical - interest should be mailed to the &a.hackers;. Likewise, people with - an interest in such things (and a tolerance for a - <emphasis>high</emphasis> volume of mail!) may subscribe to the - hackers mailing list by sending mail to &a.majordomo;. See <link - linkend="eresources-mail">mailing lists</link> for more information - about this and other mailing lists.</para> - - <para>If you find a bug or are submitting a specific change, please - report it using the &man.send-pr.1; program or its <ulink - URL="http://www.FreeBSD.org/send-pr.html">WEB-based - equivalent</ulink>. Try to fill-in each field of the bug report. - Unless they exceed 65KB, include any patches directly in the report. - When including patches, <emphasis>do not</emphasis> use cut-and-paste - because cut-and-paste turns tabs into spaces and makes them unusable. - Consider compressing patches and using &man.uuencode.1; if they exceed - 20KB. Upload very large submissions to <ulink - url="ftp://ftp.FreeBSD.org/pub/FreeBSD/incoming/">ftp.FreeBSD.org:/pub/FreeBSD/incoming/</ulink>.</para> - - <para>After filing a report, you should receive confirmation along with - a tracking number. Keep this tracking number so that you can update - us with details about the problem by sending mail to - <email>bug-followup@FreeBSD.org</email>. Use the number as the - message subject, e.g. <literal>"Re: kern/3377"</literal>. Additional - information for any bug report should be submitted this way.</para> - - <para>If you do not receive confirmation in a timely fashion (3 days to - a week, depending on your email connection) or are, for some reason, - unable to use the &man.send-pr.1; command, then you may ask - someone to file it for you by sending mail to the &a.bugs;.</para> - </sect2> - - <sect2> - <title>Changes to the documentation</title> - - <para>Changes to the documentation are overseen by the &a.doc;. Send - submissions and changes (even small ones are welcome!) using - <command>send-pr</command> as described in <link - linkend="contrib-general">Bug Reports and General - Commentary</link>.</para> - </sect2> - - <sect2> - <title>Changes to existing source code</title> - - <para>An addition or change to the existing source code is a somewhat - trickier affair and depends a lot on how far out of date you are with - the current state of the core FreeBSD development. There is a special - on-going release of FreeBSD known as “FreeBSD-current” - which is made available in a variety of ways for the convenience of - developers working actively on the system. See <link - linkend="current">Staying current with FreeBSD</link> for more - information about getting and using FreeBSD-current.</para> - - <para>Working from older sources unfortunately means that your changes - may sometimes be too obsolete or too divergent for easy re-integration - into FreeBSD. Chances of this can be minimized somewhat by - subscribing to the &a.announce; and the &a.current; lists, where - discussions on the current state of the system take place.</para> - - <para>Assuming that you can manage to secure fairly up-to-date sources - to base your changes on, the next step is to produce a set of diffs to - send to the FreeBSD maintainers. This is done with the &man.diff.1; - command, with the “context diff” form - being preferred. For example:</para> - - <para> - <screen>&prompt.user; <userinput>diff -c oldfile newfile</userinput></screen> - - or - - <screen>&prompt.user; <userinput>diff -c -r olddir newdir</userinput></screen> - - would generate such a set of context diffs for the given source file - or directory hierarchy. See the man page for &man.diff.1; for more - details.</para> - - <para>Once you have a set of diffs (which you may test with the - &man.patch.1; command), you should submit them for inclusion with - FreeBSD. Use the &man.send-pr.1; program as described in <link - linkend="contrib-general">Bug Reports and General Commentary</link>. - <emphasis>Do not</emphasis> just send the diffs to the &a.hackers; or - they will get lost! We greatly appreciate your submission (this is a - volunteer project!); because we are busy, we may not be able to - address it immediately, but it will remain in the pr database until we - do.</para> - - <para>If you feel it appropriate (e.g. you have added, deleted, or - renamed files), bundle your changes into a <command>tar</command> file - and run the &man.uuencode.1; program on it. Shar archives are also - welcome.</para> - - <para>If your change is of a potentially sensitive nature, e.g. you are - unsure of copyright issues governing its further distribution or you - are simply not ready to release it without a tighter review first, - then you should send it to &a.core; directly rather than submitting it - with &man.send-pr.1;. The core mailing list reaches a much smaller - group of people who do much of the day-to-day work on FreeBSD. Note - that this group is also <emphasis>very busy</emphasis> and so you - should only send mail to them where it is truly necessary.</para> - - <para>Please refer to <command>man 9 intro</command> and <command>man 9 - style</command> for some information on coding style. We would - appreciate it if you were at least aware of this information before - submitting code.</para> - </sect2> - - <sect2> - <title>New code or major value-added packages</title> - - <para>In the rare case of a significant contribution of a large body - work, or the addition of an important new feature to FreeBSD, it - becomes almost always necessary to either send changes as uuencode'd - tar files or upload them to our ftp site <ulink - URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/incoming">ftp://ftp.FreeBSD.org/pub/FreeBSD/incoming</ulink>.</para> - - <para>When working with large amounts of code, the touchy subject of - copyrights also invariably comes up. Acceptable copyrights for code - included in FreeBSD are:</para> - - <orderedlist> - <listitem> - <para>The BSD copyright. This copyright is most preferred due to - its “no strings attached” nature and general - attractiveness to commercial enterprises. Far from discouraging - such commercial use, the FreeBSD Project actively encourages such - participation by commercial interests who might eventually be - inclined to invest something of their own into FreeBSD.</para> - </listitem> - - <listitem> - <para>The GNU Public License, or “GPL”. This license is - not quite as popular with us due to the amount of extra effort - demanded of anyone using the code for commercial purposes, but - given the sheer quantity of GPL'd code we currently require - (compiler, assembler, text formatter, etc) it would be silly to - refuse additional contributions under this license. Code under - the GPL also goes into a different part of the tree, that being - <filename>/sys/gnu</filename> or - <filename>/usr/src/gnu</filename>, and is therefore easily - identifiable to anyone for whom the GPL presents a problem.</para> - </listitem> - </orderedlist> - - <para>Contributions coming under any other type of copyright must be - carefully reviewed before their inclusion into FreeBSD will be - considered. Contributions for which particularly restrictive - commercial copyrights apply are generally rejected, though the authors - are always encouraged to make such changes available through their own - channels.</para> - - <para>To place a “BSD-style” copyright on your work, include - the following text at the very beginning of every source code file you - wish to protect, replacing the text between the <literal>%%</literal> - with the appropriate information.</para> - - <programlisting> -Copyright (c) %%proper_years_here%% - %%your_name_here%%, %%your_state%% %%your_zip%%. - All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer as - the first lines of this file unmodified. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY %%your_name_here%% ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL %%your_name_here%% BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - $Id$</programlisting> - - <para>For your convenience, a copy of this text can be found in - <filename>/usr/share/examples/etc/bsd-style-copyright</filename>.</para> - </sect2> - - <sect2> - <title>Money, Hardware or Internet access</title> - - <para>We are always very happy to accept donations to further the cause - of the FreeBSD Project and, in a volunteer effort like ours, a little - can go a long way! Donations of hardware are also very important to - expanding our list of supported peripherals since we generally lack - the funds to buy such items ourselves.</para> - - <sect3> - <title><anchor id="donations">Donating funds</title> - - <para>While the FreeBSD Project is not a 501(c)(3) (charitable) - corporation and hence cannot offer special tax incentives for any - donations made, any such donations will be gratefully accepted on - behalf of the project by FreeBSD, Inc.</para> - - <para>FreeBSD, Inc. was founded in early 1995 by &a.jkh; and &a.dg; - with the goal of furthering the aims of the FreeBSD Project and - giving it a minimal corporate presence. Any and all funds donated - (as well as any profits that may eventually be realized by FreeBSD, - Inc.) will be used exclusively to further the project's - goals.</para> - - <para>Please make any checks payable to FreeBSD, Inc., sent in care of - the following address:</para> - - <address> - <otheraddr>FreeBSD, Inc.</otheraddr> - <otheraddr>c/o Jordan Hubbard</otheraddr> - <street>4041 Pike Lane, Suite F</street> - <city>Concord</city> - <state>CA</state>, <postcode>94520</postcode> - </address> - - <para>(currently using the Walnut Creek CDROM address until a PO box - can be opened)</para> - - <para>Wire transfers may also be sent directly to:</para> - - <address> - <otheraddr>Bank Of America</otheraddr> - <otheraddr>Concord Main Office</otheraddr> - <pob>P.O. Box 37176</pob> - <city>San Francisco</city> - <state>CA</state>, <postcode>94137-5176</postcode> - - <otheraddr>Routing #: 121-000-358</otheraddr> - <otheraddr>Account #: 01411-07441 (FreeBSD, Inc.)</otheraddr> - </address> - - <para>Any correspondence related to donations should be sent to &a.jkh, - either via email or to the FreeBSD, Inc. postal address given above. - </para> - - <para>If you do not wish to be listed in our <link - linkend="donors">donors</link> section, please specify this when - making your donation. Thanks!</para> - </sect3> - - <sect3> - <title>Donating hardware</title> - - <para>Donations of hardware in any of the 3 following categories are - also gladly accepted by the FreeBSD Project:</para> - - <itemizedlist> - <listitem> - <para>General purpose hardware such as disk drives, memory or - complete systems should be sent to the FreeBSD, Inc. address - listed in the <emphasis>donating funds</emphasis> - section.</para> - </listitem> - - <listitem> - <para>Hardware for which ongoing compliance testing is desired. - We are currently trying to put together a testing lab of all - components that FreeBSD supports so that proper regression - testing can be done with each new release. We are still lacking - many important pieces (network cards, motherboards, etc) and if - you would like to make such a donation, please contact &a.dg; - for information on which items are still required.</para> - </listitem> - - <listitem> - <para>Hardware currently unsupported by FreeBSD for which you - would like to see such support added. Please contact the - &a.core; before sending such items as we will need to find a - developer willing to take on the task before we can accept - delivery of new hardware.</para> - </listitem> - </itemizedlist> - </sect3> - - <sect3> - <title>Donating Internet access</title> - - <para>We can always use new mirror sites for FTP, WWW or - <command>cvsup</command>. If you would like to be such a mirror, - please contact the FreeBSD project administrators - <email>admin@FreeBSD.org</email> for more information.</para> - </sect3> - </sect2> - </sect1> - - <sect1 id="donors"> - <title>Donors Gallery</title> - - <para>The FreeBSD Project is indebted to the following donors and would - like to publically thank them here!</para> - - <itemizedlist> - <listitem> - <para><emphasis>Contributors to the central server - project:</emphasis></para> - - <para>The following individuals and businesses made it possible for - the FreeBSD Project to build a new central server machine to - eventually replace <hostid role="fqdn">freefall.FreeBSD.org</hostid> - by donating the following items:</para> - - <itemizedlist> - <listitem> - <para>&a.mbarkah and his employer, <ulink URL="http://www.hemi.com"> - Hemisphere Online</ulink>, donated a <emphasis>Pentium Pro - (P6) 200Mhz CPU</emphasis></para> - </listitem> - - <listitem> - <para><ulink URL="http://www.asacomputers.com">ASA - Computers</ulink> donated a <emphasis>Tyan 1662 - motherboard</emphasis>.</para> - </listitem> - - <listitem> - <para>Joe McGuckin <email>joe@via.net</email> of <ulink - URL="http://www.via.net">ViaNet Communications</ulink> donated - a <emphasis>Kingston ethernet controller.</emphasis></para> - </listitem> - - <listitem> - <para>Jack O'Neill <email>jack@diamond.xtalwind.net</email> - donated an <emphasis>NCR 53C875 SCSI controller - card</emphasis>.</para> - </listitem> - - <listitem> - <para>Ulf Zimmermann <email>ulf@Alameda.net</email> of <ulink - URL="http://www.Alameda.net">Alameda Networks</ulink> donated - <emphasis>128MB of memory</emphasis>, a <emphasis>4 Gb disk - drive and the case.</emphasis></para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><emphasis>Direct funding:</emphasis></para> - - <para>The following individuals and businesses have generously - contributed direct funding to the project:</para> - - <itemizedlist> - <listitem> - <para>Annelise Anderson - <email>ANDRSN@HOOVER.STANFORD.EDU</email></para> - </listitem> - - <listitem> - <para>&a.dillon</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.epilogue.com/">Epilogue Technology - Corporation</ulink></para> - </listitem> - - <listitem> - <para>&a.sef</para> - </listitem> - - <listitem> - <para>Don Scott Wilde</para> - </listitem> - - <listitem> - <para>Gianmarco Giovannelli - <email>gmarco@masternet.it</email></para> - </listitem> - - <listitem> - <para>Josef C. Grosch <email>joeg@truenorth.org</email></para> - </listitem> - - <listitem> - <para>Robert T. Morris</para> - </listitem> - - <listitem> - <para>&a.chuckr</para> - </listitem> - - <listitem> - <para>Kenneth P. Stox <email>ken@stox.sa.enteract.com</email> of - <ulink URL="http://www.imagescape.com">Imaginary Landscape, - LLC.</ulink></para> - </listitem> - - <listitem> - <para>Dmitry S. Kohmanyuk <email>dk@dog.farm.org</email></para> - </listitem> - - <listitem> - <para><ulink URL="http://www.cdrom.co.jp/">Laser5</ulink> of Japan - (a portion of the profits from sales of their various FreeBSD - CD-ROMs.</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.mmjp.or.jp/fuki/">Fuki Shuppan - Publishing Co.</ulink> donated a portion of their profits from - <emphasis>Hajimete no FreeBSD</emphasis> (FreeBSD, Getting - started) to the FreeBSD and XFree86 projects.</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.ascii.co.jp/">ASCII Corp.</ulink> - donated a portion of their profits from several FreeBSD-related - books to the FreeBSD project.</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.yokogawa.co.jp/">Yokogawa Electric - Corp</ulink> has generously donated significant funding to the - FreeBSD project.</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.buffnet.net/">BuffNET</ulink></para> - </listitem> - - <listitem> - <para><ulink url="http://www.pacificsolutions.com/">Pacific - Solutions</ulink></para> - </listitem> - - <listitem> - <para><ulink url="http://www.siemens.de/">Siemens AG</ulink> - via <ulink url="mailto:andre.albsmeier@mchp.siemens.de">Andre - Albsmeier</ulink></para> - </listitem> - - <listitem> - <para><ulink url="mailto:ras@interaccess.com">Chris Silva</ulink> - </para> - </listitem> - - </itemizedlist> - </listitem> - - <listitem> - <para><emphasis>Hardware contributors:</emphasis></para> - - <para>The following individuals and businesses have generously - contributed hardware for testing and device driver - development/support:</para> - - <itemizedlist> - <listitem> - <para>Walnut Creek CDROM for providing the Pentium P5-90 and - 486/DX2-66 EISA/VL systems that are being used for our - development work, to say nothing of the network access and other - donations of hardware resources.</para> - </listitem> - - <listitem> - <para>TRW Financial Systems, Inc. provided 130 PCs, three 68 GB - fileservers, twelve Ethernets, two routers and an ATM switch for - debugging the diskless code.</para> - </listitem> - - <listitem> - <para>Dermot McDonnell donated the Toshiba XM3401B CDROM drive - currently used in freefall.</para> - </listitem> - - <listitem> - <para>&a.chuck; contributed his floppy tape streamer for - experimental work.</para> - </listitem> - - <listitem> - <para>Larry Altneu <email>larry@ALR.COM</email>, and &a.wilko;, - provided Wangtek and Archive QIC-02 tape drives in order to - improve the <devicename>wt</devicename> driver.</para> - </listitem> - - <listitem> - <para>Ernst Winter <email>ewinter@lobo.muc.de</email> contributed - a 2.88 MB floppy drive to the project. This will hopefully - increase the pressure for rewriting the floppy disk driver. - <!-- smiley -->;-)</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.tekram.com">Tekram - Technologies</ulink> sent one each of their DC-390, DC-390U - and DC-390F FAST and ULTRA SCSI host adapter cards for - regression testing of the NCR and AMD drivers with their cards. - They are also to be applauded for making driver sources for free - operating systems available from their FTP server <ulink - URL="ftp://ftp.tekram.com/scsi/FreeBSD">ftp://ftp.tekram.com/scsi/FreeBSD</ulink>.</para> - </listitem> - - <listitem> - <para><email>Larry M. Augustin</email> contributed not only a - Symbios Sym8751S SCSI card, but also a set of data books, - including one about the forthcoming Sym53c895 chip with Ultra-2 - and LVD support, and the latest programming manual with - information on how to safely use the advanced features of the - latest Symbios SCSI chips. Thanks a lot!</para> - </listitem> - - <listitem> - <para>Christoph Kukulies <email>kuku@FreeBSD.org</email> donated - an FX120 12 speed Mitsumi CDROM drive for IDE CDROM driver - development.</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><emphasis>Special contributors:</emphasis></para> - - <itemizedlist> - <listitem> - <para><ulink URL="http://www.cdrom.com">Walnut Creek CDROM</ulink> - has donated almost more than we can say (see the <link - linkend="history">history</link> document for more details). - In particular, we would like to thank them for the original - hardware used for <hostid - role="fqdn">freefall.FreeBSD.org</hostid>, our primary - development machine, and for <hostid - role="fqdn">thud.FreeBSD.org</hostid>, a testing and build - box. We are also indebted to them for funding various - contributors over the years and providing us with unrestricted - use of their T1 connection to the Internet.</para> - </listitem> - - <listitem> - <para>The <ulink URL="http://www.interface-business.de">interface - business GmbH, Dresden</ulink> has been patiently supporting - &a.joerg; who has often preferred FreeBSD work over paywork, and - used to fall back to their (quite expensive) EUnet Internet - connection whenever his private connection became too slow or - flakey to work with it...</para> - </listitem> - - <listitem> - <para><ulink URL="http://www.bsdi.com">Berkeley Software Design, - Inc.</ulink> has contributed their DOS emulator code to the - remaining BSD world, which is used in the - <emphasis>doscmd</emphasis> command.</para> - </listitem> - </itemizedlist> - </listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>Core Team Alumni</title> - - <para>The following people were members of the FreeBSD core team during - the periods indicated. We thank them for their past efforts in the - service of the FreeBSD project.</para> - - <para><emphasis>In rough chronological order:</emphasis></para> - - <itemizedlist> - <listitem> - <para>&a.guido (1995 - 1999)</para> - </listitem> - - <listitem> - <para>&a.dyson (1993 - 1998)</para> - </listitem> - - <listitem> - <para>&a.nate (1992 - 1996)</para> - </listitem> - - <listitem> - <para>&a.rgrimes (1992 - 1995)</para> - </listitem> - - <listitem> - <para>Andreas Schulz (1992 - 1995)</para> - </listitem> - - <listitem> - <para>&a.csgr (1993 - 1995)</para> - </listitem> - - <listitem> - <para>&a.paul (1992 - 1995)</para> - </listitem> - - <listitem> - <para>&a.smace (1993 - 1994)</para> - </listitem> - - <listitem> - <para>Andrew Moore (1993 - 1994)</para> - </listitem> - - <listitem> - <para>Christoph Robitschko (1993 - 1994)</para> - </listitem> - - <listitem> - <para>J. T. Conklin (1992 - 1993)</para> - </listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>Derived Software Contributors</title> - - <para>This software was originally derived from William F. Jolitz's 386BSD - release 0.1, though almost none of the original 386BSD specific code - remains. This software has been essentially re-implemented from the - 4.4BSD-Lite release provided by the Computer Science Research Group - (CSRG) at the University of California, Berkeley and associated academic - contributors.</para> - - <para>There are also portions of NetBSD and OpenBSD that have been - integrated into FreeBSD as well, and we would therefore like to thank - all the contributors to NetBSD and OpenBSD for their work.</para> - </sect1> - - <sect1 id="contrib-additional"> - <title>Additional FreeBSD Contributors</title> - - <para>(in alphabetical order by first name):</para> - - <itemizedlist> - <listitem> - <para>ABURAYA Ryushirou <email>rewsirow@ff.iij4u.or.jp</email></para> - </listitem> - - <listitem> - <para>AMAGAI Yoshiji <email>amagai@nue.org</email></para> - </listitem> - - <listitem> - <para>Aaron Bornstein <email>aaronb@j51.com</email></para> - </listitem> - - <listitem> - <para>Aaron Smith <email>aaron@mutex.org</email></para> - </listitem> - - <listitem> - <para>Achim Patzner <email>ap@noses.com</email></para> - </listitem> - - <listitem> - <para>Ada T Lim <email>ada@bsd.org</email></para> - </listitem> - - <listitem> - <para>Adam Baran <email>badam@mw.mil.pl</email></para> - </listitem> - - <listitem> - <para>Adam Glass <email>glass@postgres.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>Adam McDougall <email>mcdouga9@egr.msu.edu</email></para> - </listitem> - - <listitem> - <para>Adrian Colley <email>aecolley@ois.ie</email></para> - </listitem> - - <listitem> - <para>Adrian Hall <email>adrian@ibmpcug.co.uk</email></para> - </listitem> - - <listitem> - <para>Adrian Mariano <email>adrian@cam.cornell.edu</email></para> - </listitem> - - <listitem> - <para>Adrian Steinmann <email>ast@marabu.ch</email></para> - </listitem> - - <listitem> - <para>Adam Strohl <email>troll@digitalspark.net</email></para> - </listitem> - - <listitem> - <para>Adrian T. Filipi-Martin - <email>atf3r@agate.cs.virginia.edu</email></para> - </listitem> - - <listitem> - <para>Ajit Thyagarajan <email>unknown</email></para> - </listitem> - - <listitem> - <para>Akio Morita - <email>amorita@meadow.scphys.kyoto-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Akira SAWADA <email>unknown</email></para> - </listitem> - - <listitem> - <para>Akira Watanabe - <email>akira@myaw.ei.meisei-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Akito Fujita <email>fujita@zoo.ncl.omron.co.jp</email></para> - </listitem> - - <listitem> - <para>Alain Kalker - <email>A.C.P.M.Kalker@student.utwente.nl</email></para> - </listitem> - - <listitem> - <para>Alan Bawden <email>alan@curry.epilogue.com</email></para> - </listitem> - - <listitem> - <para>Alec Wolman <email>wolman@cs.washington.edu</email></para> - </listitem> - - <listitem> - <para>Aled Morris <email>aledm@routers.co.uk</email></para> - </listitem> - - <listitem> - <para>Alex <email>garbanzo@hooked.net</email></para> - </listitem> - - <listitem> - <para>Alex D. Chen - <email>dhchen@Canvas.dorm7.nccu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Alex G. Bulushev <email>bag@demos.su</email></para> - </listitem> - - <listitem> - <para>Alex Le Heux <email>alexlh@funk.org</email></para> - </listitem> - - <listitem> - <para>Alex Perel <email>veers@disturbed.net</email></para> - </listitem> - - <listitem> - <para>Alexander B. Povolotsky <email>tarkhil@mgt.msk.ru</email></para> - </listitem> - - <listitem> - <para>Alexander Leidinger - <email>netchild@wurzelausix.CS.Uni-SB.DE</email></para> - </listitem> - - <listitem> - <para>Alexander Langer <email>alex@cichlids.com</email></para> - </listitem> - - <listitem> - <para>Alexandre Snarskii <email>snar@paranoia.ru</email></para> - </listitem> - - <listitem> - <para>Alistair G. Crooks <email>agc@uts.amdahl.com</email></para> - </listitem> - - <listitem> - <para>Allan Saddi <email>asaddi@philosophysw.com</email></para> - </listitem> - - <listitem> - <para>Allen Campbell <email>allenc@verinet.com</email></para> - </listitem> - - <listitem> - <para>Amakawa Shuhei <email>amakawa@hoh.t.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Amancio Hasty <email>hasty@star-gate.com</email></para> - </listitem> - - <listitem> - <para>Amir Farah <email>amir@comtrol.com</email></para> - </listitem> - - <listitem> - <para>Amy Baron <email>amee@beer.org</email></para> - </listitem> - - <listitem> - <para>Anatoly A. Orehovsky <email>tolik@mpeks.tomsk.su</email></para> - </listitem> - - <listitem> - <para>Anatoly Vorobey <email>mellon@pobox.com</email></para> - </listitem> - - <listitem> - <para>Anders Nordby <email>nickerne@nome.no</email></para> - </listitem> - - <listitem> - <para>Anders Thulin <email>Anders.X.Thulin@telia.se</email></para> - </listitem> - - <listitem> - <para>Andras Olah <email>olah@cs.utwente.nl</email></para> - </listitem> - - <listitem> - <para>Andre Albsmeier - <email>Andre.Albsmeier@mchp.siemens.de</email></para> - </listitem> - - <listitem> - <para>Andre Oppermann <email>andre@pipeline.ch</email></para> - </listitem> - - <listitem> - <para>Andreas Haakh <email>ah@alman.robin.de</email></para> - </listitem> - - <listitem> - <para>Andreas Kohout <email>shanee@rabbit.augusta.de</email></para> - </listitem> - - <listitem> - <para>Andreas Lohr <email>andreas@marvin.RoBIN.de</email></para> - </listitem> - - <listitem> - <para>Andreas Schulz <email>unknown</email></para> - </listitem> - - <listitem> - <para>Andreas Wetzel <email>mickey@deadline.snafu.de</email></para> - </listitem> - - <listitem> - <para>Andreas Wrede <email>andreas@planix.com</email></para> - </listitem> - - <listitem> - <para>Andres Vega Garcia <email>unknown</email></para> - </listitem> - - <listitem> - <para>Andrew Atrens <email>atreand@statcan.ca</email></para> - </listitem> - - <listitem> - <para>Andrew Boothman <email>andrew@cream.org</email></para> - </listitem> - - <listitem> - <para>Andrew Gillham <email>gillham@andrews.edu</email></para> - </listitem> - - <listitem> - <para>Andrew Gordon <email>andrew.gordon@net-tel.co.uk</email></para> - </listitem> - - <listitem> - <para>Andrew Herbert <email>andrew@werple.apana.org.au</email></para> - </listitem> - - <listitem> - <para>Andrew J. Korty <email>ajk@purdue.edu</email></para> - </listitem> - - <listitem> - <para>Andrew L. Moore <email>alm@mclink.com</email></para> - </listitem> - - <listitem> - <para>Andrew McRae <email>amcrae@cisco.com</email></para> - </listitem> - - <listitem> - <para>Andrew Stevenson <email>andrew@ugh.net.au</email></para> - </listitem> - - <listitem> - <para>Andrew Timonin <email>tim@pool1.convey.ru</email></para> - </listitem> - - <listitem> - <para>Andrew V. Stesin <email>stesin@elvisti.kiev.ua</email></para> - </listitem> - - <listitem> - <para>Andrew Webster <email>awebster@dataradio.com</email></para> - </listitem> - - <listitem> - <para>Andrey Zakhvatov <email>andy@icc.surw.chel.su</email></para> - </listitem> - - <listitem> - <para>Andy Farkas <email>andyf@speednet.com.au</email></para> - </listitem> - - <listitem> - <para>Andy Valencia <email>ajv@csd.mot.com</email></para> - </listitem> - - <listitem> - <para>Andy Whitcroft <email>andy@sarc.city.ac.uk</email></para> - </listitem> - - <listitem> - <para>Angelo Turetta <email>ATuretta@stylo.it</email></para> - </listitem> - - <listitem> - <para>Anthony C. Chavez <email>magus@xmission.com</email></para> - </listitem> - - <listitem> - <para>Anthony Yee-Hang Chan <email>yeehang@netcom.com</email></para> - </listitem> - - <listitem> - <para>Anton Berezin <email>tobez@plab.ku.dk</email></para> - </listitem> - - <listitem> - <para>Antti Kaipila <email>anttik@iki.fi</email></para> - </listitem> - - <listitem> - <para>Are Bryne <email>are.bryne@communique.no</email></para> - </listitem> - - <listitem> - <para>Ari Suutari <email>ari@suutari.iki.fi</email></para> - </listitem> - - <listitem> - <para>Arjan de Vet <email>devet@IAEhv.nl</email></para> - </listitem> - - <listitem> - <para>Arne Henrik Juul <email>arnej@Lise.Unit.NO</email></para> - </listitem> - - <listitem> - <para>Assar Westerlund <email>assar@sics.se</email></para> - </listitem> - - <listitem> - <para>Atsushi Furuta <email>furuta@sra.co.jp</email></para> - </listitem> - - <listitem> - <para>Atsushi Murai <email>amurai@spec.co.jp</email></para> - </listitem> - - <listitem> - <para>Bakul Shah <email>bvs@bitblocks.com</email></para> - </listitem> - - <listitem> - <para>Barry Bierbauch <email>pivrnec@vszbr.cz</email></para> - </listitem> - - <listitem> - <para>Barry Lustig <email>barry@ictv.com</email></para> - </listitem> - - <listitem> - <para>Ben Hutchinson <email>benhutch@xfiles.org.uk</email></para> - </listitem> - - <listitem> - <para>Ben Jackson <email>unknown</email></para> - </listitem> - - <listitem> - <para>Ben Smithurst <email>ben@scientia.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>Ben Walter <email>bwalter@itachi.swcp.com</email></para> - </listitem> - - <listitem> - <para>Benjamin Lewis <email>bhlewis@gte.net</email></para> - </listitem> - - <listitem> - <para>Bernd Rosauer <email>br@schiele-ct.de</email></para> - </listitem> - - <listitem> - <para>Bill Kish <email>kish@osf.org</email></para> - </listitem> - - <listitem> - <para>Bill Trost <email>trost@cloud.rain.com</email></para> - </listitem> - - <listitem> - <para>Blaz Zupan <email>blaz@amis.net</email></para> - </listitem> - - <listitem> - <para>Bob Van Valzah <email>Bob@whitebarn.com</email></para> - </listitem> - - <listitem> - <para>Bob Willcox <email>bob@luke.pmr.com</email></para> - </listitem> - - <listitem> - <para>Boris Staeblow <email>balu@dva.in-berlin.de</email></para> - </listitem> - - <listitem> - <para>Boyd R. Faulkner <email>faulkner@asgard.bga.com</email></para> - </listitem> - - <listitem> - <para>Brad Karp <email>karp@eecs.harvard.edu</email></para> - </listitem> - - <listitem> - <para>Bradley Dunn <email>bradley@dunn.org</email></para> - </listitem> - - <listitem> - <para>Brandon Fosdick <email>bfoz@glue.umd.edu</email></para> - </listitem> - - <listitem> - <para>Brandon Gillespie <email>brandon@roguetrader.com</email></para> - </listitem> - - <listitem> - <para>&a.wlloyd</para> - </listitem> - - <listitem> - <para>Bob Wilcox <email>bob@obiwan.uucp</email></para> - </listitem> - - <listitem> - <para>Boyd Faulkner <email>faulkner@mpd.tandem.com</email></para> - </listitem> - - <listitem> - <para>Brent J. Nordquist <email>bjn@visi.com</email></para> - </listitem> - - <listitem> - <para>Brett Lymn <email>blymn@mulga.awadi.com.AU</email></para> - </listitem> - - <listitem> - <para>Brett Taylor - <email>brett@peloton.physics.montana.edu</email></para> - </listitem> - - <listitem> - <para>Brian Campbell <email>brianc@pobox.com</email></para> - </listitem> - - <listitem> - <para>Brian Clapper <email>bmc@willscreek.com</email></para> - </listitem> - - <listitem> - <para>Brian Cully <email>shmit@kublai.com</email></para> - </listitem> - - <listitem> - <para>Brian Handy - <email>handy@lambic.space.lockheed.com</email></para> - </listitem> - - <listitem> - <para>Brian Litzinger <email>brian@MediaCity.com</email></para> - </listitem> - - <listitem> - <para>Brian McGovern <email>bmcgover@cisco.com</email></para> - </listitem> - - <listitem> - <para>Brian Moore <email>ziff@houdini.eecs.umich.edu</email></para> - </listitem> - - <listitem> - <para>Brian R. Haug <email>haug@conterra.com</email></para> - </listitem> - - <listitem> - <para>Brian Tao <email>taob@risc.org</email></para> - </listitem> - - <listitem> - <para>Brion Moss <email>brion@queeg.com</email></para> - </listitem> - - <listitem> - <para>Bruce A. Mah <email>bmah@ca.sandia.gov</email></para> - </listitem> - - <listitem> - <para>Bruce Albrecht <email>bruce@zuhause.mn.org</email></para> - </listitem> - - <listitem> - <para>Bruce Gingery <email>bgingery@gtcs.com</email></para> - </listitem> - - <listitem> - <para>Bruce J. Keeler <email>loodvrij@gridpoint.com</email></para> - </listitem> - - <listitem> - <para>Bruce Murphy <email>packrat@iinet.net.au</email></para> - </listitem> - - <listitem> - <para>Bruce Walter <email>walter@fortean.com</email></para> - </listitem> - - <listitem> - <para>Carey Jones <email>mcj@acquiesce.org</email></para> - </listitem> - - <listitem> - <para>Carl Fongheiser <email>cmf@netins.net</email></para> - </listitem> - - <listitem> - <para>Carl Mascott <email>cmascott@world.std.com</email></para> - </listitem> - - <listitem> - <para>Casper <email>casper@acc.am</email></para> - </listitem> - - <listitem> - <para>Castor Fu <email>castor@geocast.com</email></para> - </listitem> - - <listitem> - <para>Cejka Rudolf <email>cejkar@dcse.fee.vutbr.cz</email></para> - </listitem> - - <listitem> - <para>Chain Lee <email>chain@110.net</email></para> - </listitem> - - <listitem> - <para>Charles Hannum <email>mycroft@ai.mit.edu</email></para> - </listitem> - - <listitem> - <para>Charles Henrich <email>henrich@msu.edu</email></para> - </listitem> - - <listitem> - <para>Charles Mott <email>cmott@srv.net</email></para> - </listitem> - - <listitem> - <para>Charles Owens <email>owensc@enc.edu</email></para> - </listitem> - - <listitem> - <para>Chet Ramey <email>chet@odin.INS.CWRU.Edu</email></para> - </listitem> - - <listitem> - <para>Chia-liang Kao <email>clkao@CirX.ORG</email></para> - </listitem> - - <listitem> - <para>Chiharu Shibata <email>chi@bd.mbn.or.jp</email></para> - </listitem> - - <listitem> - <para>Chip Norkus <email>unknown</email></para> - </listitem> - - <listitem> - <para>Choi Jun Ho <email>junker@jazz.snu.ac.kr</email></para> - </listitem> - - <listitem> - <para>Chris Csanady <email>cc@tarsier.ca.sandia.gov</email></para> - </listitem> - - <listitem> - <para>Chris Dabrowski <email>chris@vader.org</email></para> - </listitem> - - <listitem> - <para>Chris Dillon <email>cdillon@wolves.k12.mo.us</email></para> - </listitem> - - <listitem> - <para>Chris Shenton - <email>cshenton@angst.it.hq.nasa.gov</email></para> - </listitem> - - <listitem> - <para>Chris Stenton <email>jacs@gnome.co.uk</email></para> - </listitem> - - <listitem> - <para>Chris Timmons <email>skynyrd@opus.cts.cwu.edu</email></para> - </listitem> - - <listitem> - <para>Chris Torek <email>torek@ee.lbl.gov</email></para> - </listitem> - - <listitem> - <para>Christian Gusenbauer - <email>cg@fimp01.fim.uni-linz.ac.at</email></para> - </listitem> - - <listitem> - <para>Christian Haury <email>Christian.Haury@sagem.fr</email></para> - </listitem> - - <listitem> - <para>Christian Weisgerber - <email>naddy@bigeye.rhein-neckar.de</email></para> - </listitem> - - <listitem> - <para>Christoph P. Kukulies <email>kuku@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Christoph Robitschko - <email>chmr@edvz.tu-graz.ac.at</email></para> - </listitem> - - <listitem> - <para>Christoph Weber-Fahr - <email>wefa@callcenter.systemhaus.net</email></para> - </listitem> - - <listitem> - <para>Christopher G. Demetriou - <email>cgd@postgres.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>Christopher T. Johnson - <email>cjohnson@neunacht.netgsi.com</email></para> - </listitem> - - <listitem> - <para>Chrisy Luke <email>chrisy@flix.net</email></para> - </listitem> - - <listitem> - <para>Chuck Hein <email>chein@cisco.com</email></para> - </listitem> - - <listitem> - <para>Clive Lin <email>clive@CiRX.ORG</email></para> - </listitem> - - <listitem> - <para>Colman Reilly <email>careilly@tcd.ie</email></para> - </listitem> - - <listitem> - <para>Conrad Sabatier <email>conrads@neosoft.com</email></para> - </listitem> - - <listitem> - <para>Coranth Gryphon <email>gryphon@healer.com</email></para> - </listitem> - - <listitem> - <para>Cornelis van der Laan - <email>nils@guru.ims.uni-stuttgart.de</email></para> - </listitem> - - <listitem> - <para>Cove Schneider <email>cove@brazil.nbn.com</email></para> - </listitem> - - <listitem> - <para>Craig Leres <email>leres@ee.lbl.gov</email></para> - </listitem> - - <listitem> - <para>Craig Loomis <email>unknown</email></para> - </listitem> - - <listitem> - <para>Craig Metz <email>cmetz@inner.net</email></para> - </listitem> - - <listitem> - <para>Craig Spannring <email>cts@internetcds.com</email></para> - </listitem> - - <listitem> - <para>Craig Struble <email>cstruble@vt.edu</email></para> - </listitem> - - <listitem> - <para>Cristian Ferretti <email>cfs@riemann.mat.puc.cl</email></para> - </listitem> - - <listitem> - <para>Curt Mayer <email>curt@toad.com</email></para> - </listitem> - - <listitem> - <para>Cy Schubert <email>cschuber@uumail.gov.bc.ca</email></para> - </listitem> - - <listitem> - <para>DI. Christian Gusenbauer - <email>cg@scotty.edvz.uni-linz.ac.at</email></para> - </listitem> - - <listitem> - <para>Dai Ishijima <email>ishijima@tri.pref.osaka.jp</email></para> - </listitem> - - <listitem> - <para>Damian Hamill <email>damian@cablenet.net</email></para> - </listitem> - - <listitem> - <para>Dan Cross <email>tenser@spitfire.ecsel.psu.edu</email></para> - </listitem> - - <listitem> - <para>Dan Lukes <email>dan@obluda.cz</email></para> - </listitem> - - <listitem> - <para>Dan Nelson <email>dnelson@emsphone.com</email></para> - </listitem> - - <listitem> - <para>Dan Walters <email>hannibal@cyberstation.net</email></para> - </listitem> - - <listitem> - <para>Daniel M. Eischen - <email>deischen@iworks.InterWorks.org</email></para> - </listitem> - - <listitem> - <para>Daniel O'Connor <email>doconnor@gsoft.com.au</email></para> - </listitem> - - <listitem> - <para>Daniel Poirot <email>poirot@aio.jsc.nasa.gov</email></para> - </listitem> - - <listitem> - <para>Daniel Rock <email>rock@cs.uni-sb.de</email></para> - </listitem> - - <listitem> - <para>Danny Egen <email>unknown</email></para> - </listitem> - - <listitem> - <para>Danny J. Zerkel <email>dzerkel@phofarm.com</email></para> - </listitem> - - <listitem> - <para>Darren Reed <email>avalon@coombs.anu.edu.au</email></para> - </listitem> - - <listitem> - <para>Dave Adkins <email>adkin003@tc.umn.edu</email></para> - </listitem> - - <listitem> - <para>Dave Andersen <email>angio@aros.net</email></para> - </listitem> - - <listitem> - <para>Dave Blizzard <email>dblizzar@sprynet.com</email></para> - </listitem> - - <listitem> - <para>Dave Bodenstab <email>imdave@synet.net</email></para> - </listitem> - - <listitem> - <para>Dave Burgess <email>burgess@hrd769.brooks.af.mil</email></para> - </listitem> - - <listitem> - <para>Dave Chapeskie <email>dchapes@ddm.on.ca</email></para> - </listitem> - - <listitem> - <para>Dave Cornejo <email>dave@dogwood.com</email></para> - </listitem> - - <listitem> - <para>Dave Edmondson <email>davided@sco.com</email></para> - </listitem> - - <listitem> - <para>Dave Glowacki <email>dglo@ssec.wisc.edu</email></para> - </listitem> - - <listitem> - <para>Dave Marquardt <email>marquard@austin.ibm.com</email></para> - </listitem> - - <listitem> - <para>Dave Tweten <email>tweten@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>David A. Adkins <email>adkin003@tc.umn.edu</email></para> - </listitem> - - <listitem> - <para>David A. Bader <email>dbader@umiacs.umd.edu</email></para> - </listitem> - - <listitem> - <para>David Borman <email>dab@bsdi.com</email></para> - </listitem> - - <listitem> - <para>David Dawes <email>dawes@XFree86.org</email></para> - </listitem> - - <listitem> - <para>David Filo <email>filo@yahoo.com</email></para> - </listitem> - - <listitem> - <para>David Holland <email>dholland@eecs.harvard.edu</email></para> - </listitem> - - <listitem> - <para>David Holloway <email>daveh@gwythaint.tamis.com</email></para> - </listitem> - - <listitem> - <para>David Horwitt <email>dhorwitt@ucsd.edu</email></para> - </listitem> - - <listitem> - <para>David Hovemeyer <email>daveho@infocom.com</email></para> - </listitem> - - <listitem> - <para>David Jones <email>dej@qpoint.torfree.net</email></para> - </listitem> - - <listitem> - <para>David Kelly <email>dkelly@tomcat1.tbe.com</email></para> - </listitem> - - <listitem> - <para>David Kulp <email>dkulp@neomorphic.com</email></para> - </listitem> - - <listitem> - <para>David L. Nugent <email>davidn@blaze.net.au</email></para> - </listitem> - - <listitem> - <para>David Leonard <email>d@scry.dstc.edu.au</email></para> - </listitem> - - <listitem> - <para>David Malone <email>dwmalone@maths.tcd.ie</email></para> - </listitem> - - <listitem> - <para>David Muir Sharnoff <email>muir@idiom.com</email></para> - </listitem> - - <listitem> - <para>David S. Miller <email>davem@jenolan.rutgers.edu</email></para> - </listitem> - - <listitem> - <para>David Wolfskill <email>dhw@whistle.com</email></para> - </listitem> - - <listitem> - <para>Dean Gaudet <email>dgaudet@arctic.org</email></para> - </listitem> - - <listitem> - <para>Dean Huxley <email>dean@fsa.ca</email></para> - </listitem> - - <listitem> - <para>Denis Fortin <email>unknown</email></para> - </listitem> - - <listitem> - <para>Dennis Glatting - <email>dennis.glatting@software-munitions.com</email></para> - </listitem> - - <listitem> - <para>Denton Gentry <email>denny1@home.com</email></para> - </listitem> - - <listitem> - <para>Derek Inksetter <email>derek@saidev.com</email></para> - </listitem> - - <listitem> - <para>Dima Sivachenko <email>dima@Chg.RU</email></para> - </listitem> - - <listitem> - <para>Dirk Keunecke <email>dk@panda.rhein-main.de</email></para> - </listitem> - - <listitem> - <para>Dirk Nehrling <email>nerle@pdv.de</email></para> - </listitem> - - <listitem> - <para>Dmitry Khrustalev <email>dima@xyzzy.machaon.ru</email></para> - </listitem> - - <listitem> - <para>Dmitry Kohmanyuk <email>dk@farm.org</email></para> - </listitem> - - <listitem> - <para>Dom Mitchell <email>dom@myrddin.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>Dominik Brettnacher <email>domi@saargate.de</email></para> - </listitem> - - <listitem> - <para>Don Croyle <email>croyle@gelemna.ft-wayne.in.us</email></para> - </listitem> - - <listitem> - <para>&a.whiteside;</para> - </listitem> - - <listitem> - <para>Don Morrison <email>dmorrisn@u.washington.edu</email></para> - </listitem> - - <listitem> - <para>Don Yuniskis <email>dgy@rtd.com</email></para> - </listitem> - - <listitem> - <para>Donald Maddox <email>dmaddox@conterra.com</email></para> - </listitem> - - <listitem> - <para>Doug Barton <email>studded@dal.net</email></para> - </listitem> - - <listitem> - <para>Douglas Ambrisko <email>ambrisko@whistle.com</email></para> - </listitem> - - <listitem> - <para>Douglas Carmichael <email>dcarmich@mcs.com</email></para> - </listitem> - - <listitem> - <para>Douglas Crosher <email>dtc@scrooge.ee.swin.oz.au</email></para> - </listitem> - - <listitem> - <para>Drew Derbyshire <email>ahd@kew.com</email></para> - </listitem> - - <listitem> - <para>Duncan Barclay <email>dmlb@ragnet.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>Dustin Sallings <email>dustin@spy.net</email></para> - </listitem> - - <listitem> - <para>Eckart "Isegrim" Hofmann - <email>Isegrim@Wunder-Nett.org</email></para> - </listitem> - - <listitem> - <para>Ed Gold - <email>vegold01@starbase.spd.louisville.edu</email></para> - </listitem> - - <listitem> - <para>Ed Hudson <email>elh@p5.spnet.com</email></para> - </listitem> - - <listitem> - <para>Edward Wang <email>edward@edcom.com</email></para> - </listitem> - - <listitem> - <para>Edwin Groothus <email>edwin@nwm.wan.philips.com</email></para> - </listitem> - - <listitem> - <para>Eiji-usagi-MATSUmoto <email>usagi@clave.gr.jp</email></para> - </listitem> - - <listitem> - <para>ELISA Font Project</para> - </listitem> - - <listitem> - <para>Elmar Bartel - <email>bartel@informatik.tu-muenchen.de</email></para> - </listitem> - - <listitem> - <para>Eric A. Griff <email>eagriff@global2000.net</email></para> - </listitem> - - <listitem> - <para>Eric Blood <email>eblood@cs.unr.edu</email></para> - </listitem> - - <listitem> - <para>Eric J. Haug <email>ejh@slustl.slu.edu</email></para> - </listitem> - - <listitem> - <para>Eric J. Schwertfeger <email>eric@cybernut.com</email></para> - </listitem> - - <listitem> - <para>Eric L. Hernes <email>erich@lodgenet.com</email></para> - </listitem> - - <listitem> - <para>Eric P. Scott <email>eps@sirius.com</email></para> - </listitem> - - <listitem> - <para>Eric Sprinkle <email>eric@ennovatenetworks.com</email></para> - </listitem> - - <listitem> - <para>Erich Stefan Boleyn <email>erich@uruk.org</email></para> - </listitem> - - <listitem> - <para>Erik E. Rantapaa <email>rantapaa@math.umn.edu</email></para> - </listitem> - - <listitem> - <para>Erik H. Moe <email>ehm@cris.com</email></para> - </listitem> - - <listitem> - <para>Ernst Winter <email>ewinter@lobo.muc.de</email></para> - </listitem> - - <listitem> - <para>Espen Skoglund <email>espensk@stud.cs.uit.no></email></para> - </listitem> - - <listitem> - <para>Eugene M. Kim <email>astralblue@usa.net</email></para> - </listitem> - - <listitem> - <para>Eugene Radchenko <email>genie@qsar.chem.msu.su</email></para> - </listitem> - - <listitem> - <para>Evan Champion <email>evanc@synapse.net</email></para> - </listitem> - - <listitem> - <para>Faried Nawaz <email>fn@Hungry.COM</email></para> - </listitem> - - <listitem> - <para>Flemming Jacobsen <email>fj@tfs.com</email></para> - </listitem> - - <listitem> - <para>Fong-Ching Liaw <email>fong@juniper.net</email></para> - </listitem> - - <listitem> - <para>Francis M J Hsieh <email>mjshieh@life.nthu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Frank Bartels <email>knarf@camelot.de</email></para> - </listitem> - - <listitem> - <para>Frank Chen Hsiung Chan - <email>frankch@waru.life.nthu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Frank Durda IV <email>uhclem@nemesis.lonestar.org</email></para> - </listitem> - - <listitem> - <para>Frank MacLachlan <email>fpm@n2.net</email></para> - </listitem> - - <listitem> - <para>Frank Mayhar <email>frank@exit.com</email></para> - </listitem> - - <listitem> - <para>Frank Nobis <email>fn@Radio-do.de</email></para> - </listitem> - - <listitem> - <para>Frank Volf <email>volf@oasis.IAEhv.nl</email></para> - </listitem> - - <listitem> - <para>Frank ten Wolde <email>franky@pinewood.nl</email></para> - </listitem> - - <listitem> - <para>Frank van der Linden <email>frank@fwi.uva.nl</email></para> - </listitem> - - <listitem> - <para>Fred Cawthorne <email>fcawth@jjarray.umn.edu</email></para> - </listitem> - - <listitem> - <para>Fred Gilham <email>gilham@csl.sri.com</email></para> - </listitem> - - <listitem> - <para>Fred Templin <email>templin@erg.sri.com</email></para> - </listitem> - - <listitem> - <para>Frederick Earl Gray <email>fgray@rice.edu</email></para> - </listitem> - - <listitem> - <para>FUJIMOTO Kensaku - <email>fujimoto@oscar.elec.waseda.ac.jp</email></para> - </listitem> - - <listitem> - <para>FUJISHIMA Satsuki <email>k5@respo.or.jp</email></para> - </listitem> - - <listitem> - <para>FURUSAWA Kazuhisa - <email>furusawa@com.cs.osakafu-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Gabor Kincses <email>gabor@acm.org</email></para> - </listitem> - - <listitem> - <para>Gabor Zahemszky <email>zgabor@CoDe.hu</email></para> - </listitem> - - <listitem> - <para>G. Adam Stanislav<email>adam@whizkidtech.net</email></para> - </listitem> - - <listitem> - <para>Garance A Drosehn <email>gad@eclipse.its.rpi.edu</email></para> - </listitem> - - <listitem> - <para>Gareth McCaughan <email>gjm11@dpmms.cam.ac.uk</email></para> - </listitem> - - <listitem> - <para>Gary A. Browning <email>gab10@griffcd.amdahl.com</email></para> - </listitem> - - <listitem> - <para>Gary Howland <email>gary@hotlava.com</email></para> - </listitem> - - <listitem> - <para>Gary J. <email>garyj@rks32.pcs.dec.com</email></para> - </listitem> - - <listitem> - <para>Gary Kline <email>kline@thought.org</email></para> - </listitem> - - <listitem> - <para>Gaspar Chilingarov <email>nightmar@lemming.acc.am</email></para> - </listitem> - - <listitem> - <para>Gea-Suan Lin <email>gsl@tpts4.seed.net.tw</email></para> - </listitem> - - <listitem> - <para>Geoff Rehmet <email>csgr@alpha.ru.ac.za</email></para> - </listitem> - - <listitem> - <para>Georg Wagner <email>georg.wagner@ubs.com</email></para> - </listitem> - - <listitem> - <para>Gerard Roudier <email>groudier@club-internet.fr</email></para> - </listitem> - - <listitem> - <para>Gianmarco Giovannelli - <email>gmarco@giovannelli.it</email></para> - </listitem> - - <listitem> - <para>Gil Kloepfer Jr. <email>gil@limbic.ssdl.com</email></para> - </listitem> - - <listitem> - <para>Gilad Rom <email>rom_glsa@ein-hashofet.co.il</email></para> - </listitem> - - <listitem> - <para>Ginga Kawaguti - <email>ginga@amalthea.phys.s.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Giles Lean <email>giles@nemeton.com.au</email></para> - </listitem> - - <listitem> - <para>Glen Foster <email>gfoster@gfoster.com</email></para> - </listitem> - - <listitem> - <para>Glenn Johnson <email>gljohns@bellsouth.net</email></para> - </listitem> - - <listitem> - <para>Godmar Back <email>gback@facility.cs.utah.edu</email></para> - </listitem> - - <listitem> - <para>Goran Hammarback <email>goran@astro.uu.se</email></para> - </listitem> - - <listitem> - <para>Gord Matzigkeit <email>gord@enci.ucalgary.ca</email></para> - </listitem> - - <listitem> - <para>Gordon Greeff <email>gvg@uunet.co.za</email></para> - </listitem> - - <listitem> - <para>Graham Wheeler <email>gram@cdsec.com</email></para> - </listitem> - - <listitem> - <para>Greg A. Woods <email>woods@zeus.leitch.com</email></para> - </listitem> - - <listitem> - <para>Greg Ansley <email>gja@ansley.com</email></para> - </listitem> - - <listitem> - <para>Greg Troxel <email>gdt@ir.bbn.com</email></para> - </listitem> - - <listitem> - <para>Greg Ungerer <email>gerg@stallion.oz.au</email></para> - </listitem> - - <listitem> - <para>Gregory Bond <email>gnb@itga.com.au</email></para> - </listitem> - - <listitem> - <para>Gregory D. Moncreaff - <email>moncrg@bt340707.res.ray.com</email></para> - </listitem> - - <listitem> - <para>Guy Harris <email>guy@netapp.com</email></para> - </listitem> - - <listitem> - <para>Guy Helmer <email>ghelmer@cs.iastate.edu</email></para> - </listitem> - - <listitem> - <para>HAMADA Naoki <email>hamada@astec.co.jp</email></para> - </listitem> - - <listitem> - <para>HONDA Yasuhiro - <email>honda@kashio.info.mie-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>HOSOBUCHI Noriyuki <email>hoso@buchi.tama.or.jp</email></para> - </listitem> - - <listitem> - <para>Hannu Savolainen <email>hannu@voxware.pp.fi</email></para> - </listitem> - - <listitem> - <para>Hans Huebner <email>hans@artcom.de</email></para> - </listitem> - - <listitem> - <para>Hans Petter Bieker <email>zerium@webindex.no</email></para> - </listitem> - - <listitem> - <para>Hans Zuidam <email>hans@brandinnovators.com</email></para> - </listitem> - - <listitem> - <para>Harlan Stenn <email>Harlan.Stenn@pfcs.com</email></para> - </listitem> - - <listitem> - <para>Harold Barker <email>hbarker@dsms.com</email></para> - </listitem> - - <listitem> - <para>Havard Eidnes - <email>Havard.Eidnes@runit.sintef.no</email></para> - </listitem> - - <listitem> - <para>Heikki Suonsivu <email>hsu@cs.hut.fi</email></para> - </listitem> - - <listitem> - <para>Heiko W. Rupp <email>unknown</email></para> - </listitem> - - <listitem> - <para>Helmut F. Wirth <email>hfwirth@ping.at</email></para> - </listitem> - - <listitem> - <para>Henrik Vestergaard Draboel - <email>hvd@terry.ping.dk</email></para> - </listitem> - - <listitem> - <para>Herb Peyerl <email>hpeyerl@NetBSD.org</email></para> - </listitem> - - <listitem> - <para>Hideaki Ohmon <email>ohmon@tom.sfc.keio.ac.jp</email></para> - </listitem> - - <listitem> - <para>Hidekazu Kuroki <email>hidekazu@cs.titech.ac.jp</email></para> - </listitem> - - <listitem> - <para>Hideki Yamamoto <email>hyama@acm.org</email></para> - </listitem> - - <listitem> - <para>Hideyuki Suzuki - <email>hideyuki@sat.t.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Hirayama Issei <email>iss@mail.wbs.ne.jp</email></para> - </listitem> - - <listitem> - <para>Hiroaki Sakai <email>sakai@miya.ee.kagu.sut.ac.jp</email></para> - </listitem> - - <listitem> - <para>Hiroharu Tamaru <email>tamaru@ap.t.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Hironori Ikura <email>hikura@kaisei.org</email></para> - </listitem> - - <listitem> - <para>Hiroshi Nishikawa <email>nis@pluto.dti.ne.jp</email></para> - </listitem> - - <listitem> - <para>Hiroya Tsubakimoto <email>unknown</email></para> - </listitem> - - <listitem> - <para>Holger Veit <email>Holger.Veit@gmd.de</email></para> - </listitem> - - <listitem> - <para>Holm Tiffe <email>holm@geophysik.tu-freiberg.de</email></para> - </listitem> - - <listitem> - <para>Horance Chou - <email>horance@freedom.ie.cycu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Horihiro Kumagai <email>kuma@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>HOTARU-YA <email>hotaru@tail.net</email></para> - </listitem> - - <listitem> - <para>Hr.Ladavac <email>lada@ws2301.gud.siemens.co.at</email></para> - </listitem> - - <listitem> - <para>Hubert Feyrer <email>hubertf@NetBSD.ORG</email></para> - </listitem> - - <listitem> - <para>Hugh F. Mahon <email>hugh@nsmdserv.cnd.hp.com</email></para> - </listitem> - - <listitem> - <para>Hugh Mahon <email>h_mahon@fc.hp.com</email></para> - </listitem> - - <listitem> - <para>Hung-Chi Chu <email>hcchu@r350.ee.ntu.edu.tw</email></para> - </listitem> - - <listitem> - <para>IMAI Takeshi <email>take-i@ceres.dti.ne.jp</email></para> - </listitem> - - <listitem> - <para>IMAMURA Tomoaki - <email>tomoak-i@is.aist-nara.ac.jp</email></para> - </listitem> - - <listitem> - <para>Ian Dowse <email>iedowse@maths.tcd.ie</email></para> - </listitem> - - <listitem> - <para>Ian Holland <email>ianh@tortuga.com.au</email></para> - </listitem> - - <listitem> - <para>Ian Struble <email>ian@broken.net</email></para> - </listitem> - - <listitem> - <para>Ian Vaudrey <email>i.vaudrey@bigfoot.com</email></para> - </listitem> - - <listitem> - <para>Igor Khasilev <email>igor@jabber.paco.odessa.ua</email></para> - </listitem> - - <listitem> - <para>Igor Roshchin <email>str@giganda.komkon.org</email></para> - </listitem> - - <listitem> - <para>Igor Sviridov <email>siac@ua.net</email></para> - </listitem> - - <listitem> - <para>Igor Vinokurov <email>igor@zynaps.ru</email></para> - </listitem> - - <listitem> - <para>Ikuo Nakagawa <email>ikuo@isl.intec.co.jp</email></para> - </listitem> - - <listitem> - <para>Ilya V. Komarov <email>mur@lynx.ru</email></para> - </listitem> - - <listitem> - <para>Issei Suzuki <email>issei@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Itsuro Saito <email>saito@miv.t.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>J. Bryant <email>jbryant@argus.flash.net</email></para> - </listitem> - - <listitem> - <para>J. David Lowe <email>lowe@saturn5.com</email></para> - </listitem> - - <listitem> - <para>J. Han <email>hjh@best.com</email></para> - </listitem> - - <listitem> - <para>J. Hawk <email>jhawk@MIT.EDU</email></para> - </listitem> - - <listitem> - <para>J.T. Conklin <email>jtc@cygnus.com</email></para> - </listitem> - - <listitem> - <para>J.T. Jang <email>keith@email.gcn.net.tw</email></para> - </listitem> - - <listitem> - <para>Jack <email>jack@zeus.xtalwind.net</email></para> - </listitem> - - <listitem> - <para>Jacob Bohn Lorensen <email>jacob@jblhome.ping.mk</email></para> - </listitem> - - <listitem> - <para>Jagane D Sundar <email>jagane@netcom.com</email></para> - </listitem> - - <listitem> - <para>Jake Burkholder <email>jake@checker.org</email></para> - </listitem> - - <listitem> - <para>Jake Hamby <email>jehamby@lightside.com</email></para> - </listitem> - - <listitem> - <para>James Clark <email>jjc@jclark.com</email></para> - </listitem> - - <listitem> - <para>James D. Stewart <email>jds@c4systm.com</email></para> - </listitem> - - <listitem> - <para>James Jegers <email>jimj@miller.cs.uwm.edu</email></para> - </listitem> - - <listitem> - <para>James Raynard - <email>fhackers@jraynard.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>James T. Liu <email>jtliu@phlebas.rockefeller.edu</email></para> - </listitem> - - <listitem> - <para>James da Silva <email>jds@cs.umd.edu</email></para> - </listitem> - - <listitem> - <para>Jan Conard - <email>charly@fachschaften.tu-muenchen.de</email></para> - </listitem> - - <listitem> - <para>Jan Koum <email>jkb@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Janick Taillandier - <email>Janick.Taillandier@ratp.fr</email></para> - </listitem> - - <listitem> - <para>Janusz Kokot <email>janek@gaja.ipan.lublin.pl</email></para> - </listitem> - - <listitem> - <para>Jarle Greipsland <email>jarle@idt.unit.no</email></para> - </listitem> - - <listitem> - <para>Jason Garman <email>init@risen.org</email></para> - </listitem> - - <listitem> - <para>Jason Thorpe <email>thorpej@NetBSD.org</email></para> - </listitem> - - <listitem> - <para>Jason Wright <email>jason@OpenBSD.org</email></para> - </listitem> - - <listitem> - <para>Jason Young - <email>doogie@forbidden-donut.anet-stl.com</email></para> - </listitem> - - <listitem> - <para>Javier Martin Rueda <email>jmrueda@diatel.upm.es</email></para> - </listitem> - - <listitem> - <para>Jay Fenlason <email>hack@datacube.com</email></para> - </listitem> - - <listitem> - <para>Jaye Mathisen <email>mrcpu@cdsnet.net</email></para> - </listitem> - - <listitem> - <para>Jeff Bartig <email>jeffb@doit.wisc.edu</email></para> - </listitem> - - <listitem> - <para>Jeff Forys <email>jeff@forys.cranbury.nj.us</email></para> - </listitem> - - <listitem> - <para>Jeff Kletsky <email>Jeff@Wagsky.com</email></para> - </listitem> - - <listitem> - <para>Jeffrey Evans <email>evans@scnc.k12.mi.us</email></para> - </listitem> - - <listitem> - <para>Jeffrey Wheat <email>jeff@cetlink.net</email></para> - </listitem> - - <listitem> - <para>Jens Schweikhardt <email>schweikh@noc.dfn.d</email></para> - </listitem> - - <listitem> - <para>Jeremy Allison <email>jallison@whistle.com</email></para> - </listitem> - - <listitem> - <para>Jeremy Chatfield <email>jdc@xinside.com</email></para> - </listitem> - - <listitem> - <para>Jeremy Lea <email>reg@shale.csir.co.za</email></para> - </listitem> - - <listitem> - <para>Jeremy Prior <email>unknown</email></para> - </listitem> - - <listitem> - <para>Jeroen Ruigrok/Asmodai <email>asmodai@wxs.nl</email></para> - </listitem> - - <listitem> - <para>Jesse Rosenstock <email>jmr@ugcs.caltech.edu</email></para> - </listitem> - - <listitem> - <para>Jian-Da Li <email>jdli@csie.nctu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Jim Babb <email>babb@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Jim Binkley <email>jrb@cs.pdx.edu</email></para> - </listitem> - - <listitem> - <para>Jim Carroll <email>jim@carroll.com</email></para> - </listitem> - - <listitem> - <para>Jim Flowers <email>jflowers@ezo.net</email></para> - </listitem> - - <listitem> - <para>Jim Leppek <email>jleppek@harris.com</email></para> - </listitem> - - <listitem> - <para>Jim Lowe <email>james@cs.uwm.edu</email></para> - </listitem> - - <listitem> - <para>Jim Mattson <email>jmattson@sonic.net</email></para> - </listitem> - - <listitem> - <para>Jim Mercer <email>jim@komodo.reptiles.org</email></para> - </listitem> - - <listitem> - <para>Jim Wilson <email>wilson@moria.cygnus.com</email></para> - </listitem> - - <listitem> - <para>Jimbo Bahooli - <email>griffin@blackhole.iceworld.org</email></para> - </listitem> - - <listitem> - <para>Jin Guojun <email>jin@george.lbl.gov</email></para> - </listitem> - - <listitem> - <para>Joachim Kuebart <email>unknown</email></para> - </listitem> - - <listitem> - <para>Joao Carlos Mendes Luis <email>jonny@jonny.eng.br</email></para> - </listitem> - - <listitem> - <para>Jochen Pohl <email>jpo.drs@sni.de</email></para> - </listitem> - - <listitem> - <para>Joe "Marcus" Clarke <email>marcus@miami.edu</email></para> - </listitem> - - <listitem> - <para>Joe Abley <email>jabley@clear.co.nz</email></para> - </listitem> - - <listitem> - <para>Joe Jih-Shian Lu <email>jslu@dns.ntu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Joe Orthoefer <email>j_orthoefer@tia.net</email></para> - </listitem> - - <listitem> - <para>Joe Traister <email>traister@mojozone.org</email></para> - </listitem> - - <listitem> - <para>Joel Faedi <email>Joel.Faedi@esial.u-nancy.fr</email></para> - </listitem> - - <listitem> - <para>Joel Ray Holveck <email>joelh@gnu.org</email></para> - </listitem> - - <listitem> - <para>Joel Sutton <email>sutton@aardvark.apana.org.au</email></para> - </listitem> - - <listitem> - <para>Johan Granlund <email>johan@granlund.nu</email></para> - </listitem> - - <listitem> - <para>Johan Karlsson <email>k@numeri.campus.luth.se</email></para> - </listitem> - - <listitem> - <para>Johan Larsson <email>johan@moon.campus.luth.se</email></para> - </listitem> - - <listitem> - <para>Johann Tonsing <email>jtonsing@mikom.csir.co.za</email></para> - </listitem> - - <listitem> - <para>Johannes Helander <email>unknown</email></para> - </listitem> - - <listitem> - <para>Johannes Stille <email>unknown</email></para> - </listitem> - - <listitem> - <para>John Baldwin <email>jobaldwi@vt.edu</email></para> - </listitem> - - <listitem> - <para>John Beckett <email>jbeckett@southern.edu</email></para> - </listitem> - - <listitem> - <para>John Beukema <email>jbeukema@hk.super.net</email></para> - </listitem> - - <listitem> - <para>John Brezak <email>unknown</email></para> - </listitem> - - <listitem> - <para>John Capo <email>jc@irbs.com</email></para> - </listitem> - - <listitem> - <para>John F. Woods <email>jfw@jfwhome.funhouse.com</email></para> - </listitem> - - <listitem> - <para>John Goerzen - <email>jgoerzen@alexanderwohl.complete.org</email></para> - </listitem> - - <listitem> - <para>John Hay <email>jhay@mikom.csir.co.za</email></para> - </listitem> - - <listitem> - <para>John Heidemann <email>johnh@isi.edu</email></para> - </listitem> - - <listitem> - <para>John Hood <email>cgull@owl.org</email></para> - </listitem> - - <listitem> - <para>John Kohl <email>unknown</email></para> - </listitem> - - <listitem> - <para>John Lind <email>john@starfire.mn.org</email></para> - </listitem> - - <listitem> - <para>John Mackin <email>john@physiol.su.oz.au</email></para> - </listitem> - - <listitem> - <para>John P <email>johnp@lodgenet.com</email></para> - </listitem> - - <listitem> - <para>John Perry <email>perry@vishnu.alias.net</email></para> - </listitem> - - <listitem> - <para>John Preisler <email>john@vapornet.com</email></para> - </listitem> - - <listitem> - <para>John Rochester <email>jr@cs.mun.ca</email></para> - </listitem> - - <listitem> - <para>John Sadler <email>john_sadler@alum.mit.edu</email></para> - </listitem> - - <listitem> - <para>John Saunders <email>john@pacer.nlc.net.au</email></para> - </listitem> - - <listitem> - <para>John W. DeBoskey <email>jwd@unx.sas.com</email></para> - </listitem> - - <listitem> - <para>John Wehle <email>john@feith.com</email></para> - </listitem> - - <listitem> - <para>John Woods <email>jfw@eddie.mit.edu</email></para> - </listitem> - - <listitem> - <para>Jon Morgan <email>morgan@terminus.trailblazer.com</email></para> - </listitem> - - <listitem> - <para>Jonathan H N Chin <email>jc254@newton.cam.ac.uk</email></para> - </listitem> - - <listitem> - <para>Jonathan Hanna - <email>jh@pc-21490.bc.rogers.wave.ca</email></para> - </listitem> - - <listitem> - <para>Jorge Goncalves <email>j@bug.fe.up.pt</email></para> - </listitem> - - <listitem> - <para>Jorge M. Goncalves <email>ee96199@tom.fe.up.pt</email></para> - </listitem> - - <listitem> - <para>Jos Backus <email>jbackus@plex.nl</email></para> - </listitem> - - <listitem> - <para>Jose M. Alcaide <email>jose@we.lc.ehu.es</email></para> - </listitem> - - <listitem> - <para>Jose Marques <email>jose@nobody.org</email></para> - </listitem> - - <listitem> - <para>Josef Grosch - <email>jgrosch@superior.mooseriver.com</email></para> - </listitem> - - <listitem> - <para>Josef Karthauser <email>joe@uk.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Joseph Stein <email>joes@wstein.com</email></para> - </listitem> - - <listitem> - <para>Josh Gilliam <email>josh@quick.net</email></para> - </listitem> - - <listitem> - <para>Josh Tiefenbach <email>josh@ican.net</email></para> - </listitem> - - <listitem> - <para>Juergen Lock <email>nox@jelal.hb.north.de</email></para> - </listitem> - - <listitem> - <para>Juha Inkari <email>inkari@cc.hut.fi</email></para> - </listitem> - - <listitem> - <para>Jukka A. Ukkonen <email>jua@iki.fi</email></para> - </listitem> - - <listitem> - <para>Julian Assange <email>proff@suburbia.net</email></para> - </listitem> - - <listitem> - <para>Julian Coleman <email>j.d.coleman@ncl.ac.uk</email></para> - </listitem> - - <listitem> - <para>&a.jhs</para> - </listitem> - - <listitem> - <para>Julian Jenkins <email>kaveman@magna.com.au</email></para> - </listitem> - - <listitem> - <para>Junichi Satoh <email>junichi@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Junji SAKAI <email>sakai@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Junya WATANABE <email>junya-w@remus.dti.ne.jp</email></para> - </listitem> - - <listitem> - <para>K.Higashino <email>a00303@cc.hc.keio.ac.jp</email></para> - </listitem> - - <listitem> - <para>KUNISHIMA Takeo <email>kunishi@c.oka-pu.ac.jp</email></para> - </listitem> - - <listitem> - <para>Kai Vorma <email>vode@snakemail.hut.fi</email></para> - </listitem> - - <listitem> - <para>Kaleb S. Keithley <email>kaleb@ics.com</email></para> - </listitem> - - <listitem> - <para>Kaneda Hiloshi <email>vanitas@ma3.seikyou.ne.jp</email></para> - </listitem> - - <listitem> - <para>Kapil Chowksey <email>kchowksey@hss.hns.com</email></para> - </listitem> - - <listitem> - <para>Karl Denninger <email>karl@mcs.com</email></para> - </listitem> - - <listitem> - <para>Karl Dietz <email>Karl.Dietz@triplan.com</email></para> - </listitem> - - <listitem> - <para>Karl Lehenbauer <email>karl@NeoSoft.com</email></para> - </listitem> - - <listitem> - <para>Kato Takenori - <email>kato@eclogite.eps.nagoya-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Kawanobe Koh <email>kawanobe@st.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Kazuhiko Kiriyama <email>kiri@kiri.toba-cmt.ac.jp</email></para> - </listitem> - - <listitem> - <para>Kazuo Horikawa <email>horikawa@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Kees Jan Koster <email>kjk1@ukc.ac.uk</email></para> - </listitem> - - <listitem> - <para>Keith Bostic <email>bostic@bostic.com</email></para> - </listitem> - - <listitem> - <para>Keith E. Walker <email>unknown</email></para> - </listitem> - - <listitem> - <para>Keith Moore <email>unknown</email></para> - </listitem> - - <listitem> - <para>Keith Sklower <email>unknown</email></para> - </listitem> - - <listitem> - <para>Kelly Yancey <email>kbyanc@posi.net</email></para> - </listitem> - - <listitem> - <para>Ken Hornstein <email>unknown</email></para> - </listitem> - - <listitem> - <para>Ken Key <email>key@cs.utk.edu</email></para> - </listitem> - - <listitem> - <para>Ken Mayer <email>kmayer@freegate.com</email></para> - </listitem> - - <listitem> - <para>Kenji Saito <email>marukun@mx2.nisiq.net</email></para> - </listitem> - - <listitem> - <para>Kenji Tomita <email>tommyk@da2.so-net.or.jp</email></para> - </listitem> - - <listitem> - <para>Kenneth Furge <email>kenneth.furge@us.endress.com</email></para> - </listitem> - - <listitem> - <para>Kenneth Monville <email>desmo@bandwidth.org</email></para> - </listitem> - - <listitem> - <para>Kenneth R. Westerback <email>krw@tcn.net</email></para> - </listitem> - - <listitem> - <para>Kenneth Stailey <email>kstailey@gnu.ai.mit.edu</email></para> - </listitem> - - <listitem> - <para>Kent Talarico <email>kent@shipwreck.tsoft.net</email></para> - </listitem> - - <listitem> - <para>Kent Vander Velden <email>graphix@iastate.edu</email></para> - </listitem> - - <listitem> - <para>Kentaro Inagaki <email>JBD01226@niftyserve.ne.jp</email></para> - </listitem> - - <listitem> - <para>Kevin Bracey <email>kbracey@art.acorn.co.uk</email></para> - </listitem> - - <listitem> - <para>Kevin Day <email>toasty@dragondata.com</email></para> - </listitem> - - <listitem> - <para>Kevin Lahey <email>kml@nas.nasa.gov</email></para> - </listitem> - - <listitem> - <para>Kevin Lo<email>kevlo@hello.com.tw</email></para> - </listitem> - - <listitem> - <para>Kevin Street <email>street@iname.com</email></para> - </listitem> - - <listitem> - <para>Kevin Van Maren <email>vanmaren@fast.cs.utah.edu</email></para> - </listitem> - - <listitem> - <para>Kiroh HARADA <email>kiroh@kh.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Klaus Klein <email>kleink@layla.inka.de</email></para> - </listitem> - - <listitem> - <para>Klaus-J. Wolf <email>Yanestra@t-online.de</email></para> - </listitem> - - <listitem> - <para>Koichi Sato <email>copan@ppp.fastnet.or.jp</email></para> - </listitem> - - <listitem> - <para>Kostya Lukin <email>lukin@okbmei.msk.su</email></para> - </listitem> - - <listitem> - <para>Kouichi Hirabayashi <email>kh@mogami-wire.co.jp</email></para> - </listitem> - - <listitem> - <para>Kurt D. Zeilenga <email>Kurt@Boolean.NET</email></para> - </listitem> - - <listitem> - <para>Kurt Olsen <email>kurto@tiny.mcs.usu.edu</email></para> - </listitem> - - <listitem> - <para>L. Jonas Olsson - <email>ljo@ljo-slip.DIALIN.CWRU.Edu</email></para> - </listitem> - - <listitem> - <para>Lars Köller - <email>Lars.Koeller@Uni-Bielefeld.DE</email></para> - </listitem> - - <listitem> - <para>Larry Altneu <email>larry@ALR.COM</email></para> - </listitem> - - <listitem> - <para>Laurence Lopez <email>lopez@mv.mv.com</email></para> - </listitem> - - <listitem> - <para>Lee Cremeans <email>lcremean@tidalwave.net</email></para> - </listitem> - - <listitem> - <para>Liang Tai-hwa - <email>avatar@www.mmlab.cse.yzu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Lon Willett <email>lon%softt.uucp@math.utah.edu</email></para> - </listitem> - - <listitem> - <para>Louis A. Mamakos <email>louie@TransSys.COM</email></para> - </listitem> - - <listitem> - <para>Louis Mamakos <email>loiue@TransSys.com</email></para> - </listitem> - - <listitem> - <para>Lucas James <email>Lucas.James@ldjpc.apana.org.au</email></para> - </listitem> - - <listitem> - <para>Lyndon Nerenberg <email>lyndon@orthanc.com</email></para> - </listitem> - - <listitem> - <para>M.C. Wong <email>unknown</email></para> - </listitem> - - <listitem> - <para>MANTANI Nobutaka <email>nobutaka@nobutaka.com</email></para> - </listitem> - - <listitem> - <para>MIHIRA Sanpei Yoshiro <email>sanpei@sanpei.org</email></para> - </listitem> - - <listitem> - <para>MITA Yoshio <email>mita@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>MITSUNAGA Noriaki - <email>mitchy@er.ams.eng.osaka-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>MOROHOSHI Akihiko <email>moro@race.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Magnus Enbom <email>dot@tinto.campus.luth.se</email></para> - </listitem> - - <listitem> - <para>Mahesh Neelakanta <email>mahesh@gcomm.com</email></para> - </listitem> - - <listitem> - <para>Makoto MATSUSHITA <email>matusita@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Makoto WATANABE - <email>watanabe@zlab.phys.nagoya-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Malte Lance <email>malte.lance@gmx.net</email></para> - </listitem> - - <listitem> - <para>Manu Iyengar - <email>iyengar@grunthos.pscwa.psca.com</email></para> - </listitem> - - <listitem> - <para>Marc Frajola <email>marc@dev.com</email></para> - </listitem> - - <listitem> - <para>Marc Ramirez <email>mrami@mramirez.sy.yale.edu</email></para> - </listitem> - - <listitem> - <para>Marc Slemko <email>marcs@znep.com</email></para> - </listitem> - - <listitem> - <para>Marc van Kempen <email>wmbfmk@urc.tue.nl</email></para> - </listitem> - - <listitem> - <para>Marc van Woerkom <email>van.woerkom@netcologne.de</email></para> - </listitem> - - <listitem> - <para>Marcel Moolenaar <email>marcel@scc.nl</email></para> - </listitem> - - <listitem> - <para>Mario Sergio Fujikawa Ferreira - <email>lioux@gns.com.br</email></para> - </listitem> - - <listitem> - <para>Mark Andrews <email>unknown</email></para> - </listitem> - - <listitem> - <para>Mark Cammidge <email>mark@gmtunx.ee.uct.ac.za</email></para> - </listitem> - - <listitem> - <para>Mark Diekhans <email>markd@grizzly.com</email></para> - </listitem> - - <listitem> - <para>Mark Huizer <email>xaa@stack.nl</email></para> - </listitem> - - <listitem> - <para>Mark J. Taylor <email>mtaylor@cybernet.com</email></para> - </listitem> - - <listitem> - <para>Mark Krentel <email>krentel@rice.edu</email></para> - </listitem> - - <listitem> - <para>Mark Mayo <email>markm@vmunix.com</email></para> - </listitem> - - <listitem> - <para>Mark Thompson <email>thompson@tgsoft.com</email></para> - </listitem> - - <listitem> - <para>Mark Tinguely <email>tinguely@plains.nodak.edu</email></para> - </listitem> - - <listitem> - <para>Mark Treacy <email>unknown</email></para> - </listitem> - - <listitem> - <para>Mark Valentine <email>mark@linus.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>Martin Birgmeier</para> - </listitem> - - <listitem> - <para>Martin Ibert <email>mib@ppe.bb-data.de</email></para> - </listitem> - - <listitem> - <para>Martin Kammerhofer <email>dada@sbox.tu-graz.ac.at</email></para> - </listitem> - - <listitem> - <para>Martin Renters <email>martin@tdc.on.ca</email></para> - </listitem> - - <listitem> - <para>Martti Kuparinen - <email>martti.kuparinen@ericsson.com</email></para> - </listitem> - - <listitem> - <para>Masachika ISHIZUKA - <email>ishizuka@isis.min.ntt.jp</email></para> - </listitem> - - <listitem> - <para>Mas.TAKEMURA <email>unknown</email></para> - </listitem> - - <listitem> - <para>Masafumi NAKANE <email>max@wide.ad.jp</email></para> - </listitem> - - <listitem> - <para>Masahiro Sekiguchi - <email>seki@sysrap.cs.fujitsu.co.jp</email></para> - </listitem> - - <listitem> - <para>Masanobu Saitoh <email>msaitoh@spa.is.uec.ac.jp</email></para> - </listitem> - - <listitem> - <para>Masanori Kanaoka <email>kana@saijo.mke.mei.co.jp</email></para> - </listitem> - - <listitem> - <para>Masanori Kiriake <email>seiken@ARGV.AC</email></para> - </listitem> - - <listitem> - <para>Masatoshi TAMURA - <email>tamrin@shinzan.kuee.kyoto-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Mats Lofkvist <email>mal@algonet.se</email></para> - </listitem> - - <listitem> - <para>Matt Bartley <email>mbartley@lear35.cytex.com</email></para> - </listitem> - - <listitem> - <para>Matt Thomas <email>matt@3am-software.com</email></para> - </listitem> - - <listitem> - <para>Matt White <email>mwhite+@CMU.EDU</email></para> - </listitem> - - <listitem> - <para>Matthew C. Mead <email>mmead@Glock.COM</email></para> - </listitem> - - <listitem> - <para>Matthew Cashdollar <email>mattc@rfcnet.com</email></para> - </listitem> - - <listitem> - <para>Matthew Flatt <email>mflatt@cs.rice.edu</email></para> - </listitem> - - <listitem> - <para>Matthew Fuller <email>fullermd@futuresouth.com</email></para> - </listitem> - - <listitem> - <para>Matthew Stein <email>matt@bdd.net</email></para> - </listitem> - - <listitem> - <para>Matthias Pfaller <email>leo@dachau.marco.de</email></para> - </listitem> - - <listitem> - <para>Matthias Scheler <email>tron@netbsd.org</email></para> - </listitem> - - <listitem> - <para>Mattias Gronlund - <email>Mattias.Gronlund@sa.erisoft.se</email></para> - </listitem> - - <listitem> - <para>Mattias Pantzare <email>pantzer@ludd.luth.se</email></para> - </listitem> - - <listitem> - <para>Maurice Castro - <email>maurice@planet.serc.rmit.edu.au</email></para> - </listitem> - - <listitem> - <para>Max Euston <email>meuston@jmrodgers.com</email></para> - </listitem> - - <listitem> - <para>Max Khon <email>fjoe@husky.iclub.nsu.ru</email></para> - </listitem> - - <listitem> - <para>Maxim Bolotin <email>max@rsu.ru</email></para> - </listitem> - - <listitem> - <para>Maxim V. Sobolev <email>sobomax@altavista.net</email></para> - </listitem> - - <listitem> - <para>Micha Class - <email>michael_class@hpbbse.bbn.hp.com</email></para> - </listitem> - - <listitem> - <para>Michael Butler <email>imb@scgt.oz.au</email></para> - </listitem> - - <listitem> - <para>Michael Butschky <email>butsch@computi.erols.com</email></para> - </listitem> - - <listitem> - <para>Michael Clay <email>mclay@weareb.org</email></para> - </listitem> - - <listitem> - <para>Michael Elbel <email>me@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Michael Galassi <email>nerd@percival.rain.com</email></para> - </listitem> - - <listitem> - <para>Michael Hancock <email>michaelh@cet.co.jp</email></para> - </listitem> - - <listitem> - <para>Michael Hohmuth <email>hohmuth@inf.tu-dresden.de</email></para> - </listitem> - - <listitem> - <para>Michael Perlman <email>canuck@caam.rice.edu</email></para> - </listitem> - - <listitem> - <para>Michael Petry <email>petry@netwolf.NetMasters.com</email></para> - </listitem> - - <listitem> - <para>Michael Reifenberger <email>root@totum.plaut.de</email></para> - </listitem> - - <listitem> - <para>Michael Sardo <email>jaeger16@yahoo.com</email></para> - </listitem> - - <listitem> - <para>Michael Searle <email>searle@longacre.demon.co.uk</email></para> - </listitem> - - <listitem> - <para>Michal Listos <email>mcl@Amnesiac.123.org</email></para> - </listitem> - - <listitem> - <para>Michio Karl Jinbo - <email>karl@marcer.nagaokaut.ac.jp</email></para> - </listitem> - - <listitem> - <para>Miguel Angel Sagreras - <email>msagre@cactus.fi.uba.ar</email></para> - </listitem> - - <listitem> - <para>Mihoko Tanaka <email>m_tonaka@pa.yokogawa.co.jp</email></para> - </listitem> - - <listitem> - <para>Mika Nystrom <email>mika@cs.caltech.edu</email></para> - </listitem> - - <listitem> - <para>Mikael Hybsch <email>micke@dynas.se</email></para> - </listitem> - - <listitem> - <para>Mikael Karpberg - <email>karpen@ocean.campus.luth.se</email></para> - </listitem> - - <listitem> - <para>Mike Del <email>repenting@hotmail.com</email></para> - </listitem> - - <listitem> - <para>Mike Durian <email>durian@plutotech.com</email></para> - </listitem> - - <listitem> - <para>Mike Durkin <email>mdurkin@tsoft.sf-bay.org</email></para> - </listitem> - - <listitem> - <para>Mike E. Matsnev <email>mike@azog.cs.msu.su</email></para> - </listitem> - - <listitem> - <para>Mike Evans <email>mevans@candle.com</email></para> - </listitem> - - <listitem> - <para>Mike Grupenhoff <email>kashmir@umiacs.umd.edu</email></para> - </listitem> - - <listitem> - <para>Mike Hibler <email>mike@marker.cs.utah.edu</email></para> - </listitem> - - <listitem> - <para>Mike Karels <email>unknown</email></para> - </listitem> - - <listitem> - <para>Mike McGaughey <email>mmcg@cs.monash.edu.au</email></para> - </listitem> - - <listitem> - <para>Mike Meyer <email>mwm@shiva.the-park.com</email></para> - </listitem> - - <listitem> - <para>Mike Mitchell <email>mitchell@ref.tfs.com</email></para> - </listitem> - - <listitem> - <para>Mike Murphy <email>mrm@alpharel.com</email></para> - </listitem> - - <listitem> - <para>Mike Peck <email>mike@binghamton.edu</email></para> - </listitem> - - <listitem> - <para>Mike Spengler <email>mks@msc.edu</email></para> - </listitem> - - <listitem> - <para>Mikhail A. Sokolov <email>mishania@demos.su</email></para> - </listitem> - - <listitem> - <para>Mikhail Teterin <email>mi@aldan.ziplink.net</email></para> - </listitem> - - <listitem> - <para>Ming-I Hseh <email>PA@FreeBSD.ee.Ntu.edu.TW</email></para> - </listitem> - - <listitem> - <para>Mitsuru IWASAKI <email>iwasaki@pc.jaring.my</email></para> - </listitem> - - <listitem> - <para>Mitsuru Yoshida <email>mitsuru@riken.go.jp</email></para> - </listitem> - - <listitem> - <para>Monte Mitzelfelt <email>monte@gonefishing.org</email></para> - </listitem> - - <listitem> - <para>Morgan Davis <email>root@io.cts.com</email></para> - </listitem> - - <listitem> - <para>Mostyn Lewis <email>mostyn@mrl.com</email></para> - </listitem> - - <listitem> - <para>Motomichi Matsuzaki <email>mzaki@e-mail.ne.jp</email></para> - </listitem> - - <listitem> - <para>Motoyuki Kasahara <email>m-kasahr@sra.co.jp</email></para> - </listitem> - - <listitem> - <para>Motoyuki Konno <email>motoyuki@snipe.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Murray Stokely <email>murray@cdrom.com</email></para> - </listitem> - - <listitem> - <para>N.G.Smith <email>ngs@sesame.hensa.ac.uk</email></para> - </listitem> - - <listitem> - <para>NAGAO Tadaaki <email>nagao@cs.titech.ac.jp</email></para> - </listitem> - - <listitem> - <para>NAKAJI Hiroyuki - <email>nakaji@tutrp.tut.ac.jp</email></para> - </listitem> - - <listitem> - <para>NAKAMURA Kazushi <email>nkazushi@highway.or.jp</email></para> - </listitem> - - <listitem> - <para>NAKAMURA Motonori - <email>motonori@econ.kyoto-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>NIIMI Satoshi <email>sa2c@and.or.jp</email></para> - </listitem> - - <listitem> - <para>NOKUBI Hirotaka <email>h-nokubi@yyy.or.jp</email></para> - </listitem> - - <listitem> - <para>Nadav Eiron <email>nadav@barcode.co.il</email></para> - </listitem> - - <listitem> - <para>Nanbor Wang <email>nw1@cs.wustl.edu</email></para> - </listitem> - - <listitem> - <para>Naofumi Honda - <email>honda@Kururu.math.sci.hokudai.ac.jp</email></para> - </listitem> - - <listitem> - <para>Naoki Hamada <email>nao@tom-yam.or.jp</email></para> - </listitem> - - <listitem> - <para>Narvi <email>narvi@haldjas.folklore.ee</email></para> - </listitem> - - <listitem> - <para>Nathan Ahlstrom <email>nrahlstr@winternet.com</email></para> - </listitem> - - <listitem> - <para>Nathan Dorfman <email>nathan@rtfm.net</email></para> - </listitem> - - <listitem> - <para>Neal Fachan <email>kneel@ishiboo.com</email></para> - </listitem> - - <listitem> - <para>Neil Blakey-Milner <email>nbm@rucus.ru.ac.za</email></para> - </listitem> - - <listitem> - <para>Niall Smart <email>rotel@indigo.ie</email></para> - </listitem> - - <listitem> - <para>Nick Barnes <email>Nick.Barnes@pobox.com</email></para> - </listitem> - - <listitem> - <para>Nick Handel <email>nhandel@NeoSoft.com</email></para> - </listitem> - - <listitem> - <para>Nick Hilliard <email>nick@foobar.org</email></para> - </listitem> - - <listitem> - <para>&a.nsayer;</para> - </listitem> - - <listitem> - <para>Nick Williams <email>njw@cs.city.ac.uk</email></para> - </listitem> - - <listitem> - <para>Nickolay N. Dudorov <email>nnd@itfs.nsk.su</email></para> - </listitem> - - <listitem> - <para>Niklas Hallqvist <email>niklas@filippa.appli.se</email></para> - </listitem> - - <listitem> - <para>Nisha Talagala <email>nisha@cs.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>ZW6T-KND@j.asahi-net.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>adrian@virginia.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>alex@elvisti.kiev.ua</email></para> - </listitem> - - <listitem> - <para>No Name <email>anto@netscape.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>bobson@egg.ics.nitch.ac.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>bovynf@awe.be</email></para> - </listitem> - - <listitem> - <para>No Name <email>burg@is.ge.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>chris@gnome.co.uk</email></para> - </listitem> - - <listitem> - <para>No Name <email>colsen@usa.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>coredump@nervosa.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>dannyman@arh0300.urh.uiuc.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>davids@SECNET.COM</email></para> - </listitem> - - <listitem> - <para>No Name <email>derek@free.org</email></para> - </listitem> - - <listitem> - <para>No Name <email>devet@adv.IAEhv.nl</email></para> - </listitem> - - <listitem> - <para>No Name <email>djv@bedford.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>dvv@sprint.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>enami@ba2.so-net.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>flash@eru.tubank.msk.su</email></para> - </listitem> - - <listitem> - <para>No Name <email>flash@hway.ru</email></para> - </listitem> - - <listitem> - <para>No Name <email>fn@pain.csrv.uidaho.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>gclarkii@netport.neosoft.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>gordon@sheaky.lonestar.org</email></para> - </listitem> - - <listitem> - <para>No Name <email>graaf@iae.nl</email></para> - </listitem> - - <listitem> - <para>No Name <email>greg@greg.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>grossman@cygnus.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>gusw@fub46.zedat.fu-berlin.de</email></para> - </listitem> - - <listitem> - <para>No Name <email>hfir@math.rochester.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>hnokubi@yyy.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>iaint@css.tuu.utas.edu.au</email></para> - </listitem> - - <listitem> - <para>No Name <email>invis@visi.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>ishisone@sra.co.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>iverson@lionheart.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>jpt@magic.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>junker@jazz.snu.ac.kr</email></para> - </listitem> - - <listitem> - <para>No Name <email>k-sugyou@ccs.mt.nec.co.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>kenji@reseau.toyonaka.osaka.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>kfurge@worldnet.att.net</email></para> - </listitem> - - <listitem> - <para>No Name <email>lh@aus.org</email></para> - </listitem> - - <listitem> - <para>No Name <email>lhecking@nmrc.ucc.ie</email></para> - </listitem> - - <listitem> - <para>No Name <email>mrgreen@mame.mu.oz.au</email></para> - </listitem> - - <listitem> - <para>No Name <email>nakagawa@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>No Name <email>ohki@gssm.otsuka.tsukuba.ac.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>owaki@st.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>pechter@shell.monmouth.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>pete@pelican.pelican.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>pritc003@maroon.tc.umn.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>risner@stdio.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>roman@rpd.univ.kiev.ua</email></para> - </listitem> - - <listitem> - <para>No Name <email>root@ns2.redline.ru</email></para> - </listitem> - - <listitem> - <para>No Name <email>root@uglabgw.ug.cs.sunysb.edu</email></para> - </listitem> - - <listitem> - <para>No Name <email>stephen.ma@jtec.com.au</email></para> - </listitem> - - <listitem> - <para>No Name <email>sumii@is.s.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>takas-su@is.aist-nara.ac.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>tamone@eig.unige.ch</email></para> - </listitem> - - <listitem> - <para>No Name <email>tjevans@raleigh.ibm.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>tony-o@iij.ad.jp amurai@spec.co.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>torii@tcd.hitachi.co.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>uenami@imasy.or.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>uhlar@netlab.sk</email></para> - </listitem> - - <listitem> - <para>No Name <email>vode@hut.fi</email></para> - </listitem> - - <listitem> - <para>No Name <email>wlloyd@mpd.ca</email></para> - </listitem> - - <listitem> - <para>No Name <email>wlr@furball.wellsfargo.com</email></para> - </listitem> - - <listitem> - <para>No Name <email>wmbfmk@urc.tue.nl</email></para> - </listitem> - - <listitem> - <para>No Name <email>yamagata@nwgpc.kek.jp</email></para> - </listitem> - - <listitem> - <para>No Name <email>ziggy@ryan.org</email></para> - </listitem> - - <listitem> - <para>Nobuhiro Yasutomi <email>nobu@psrc.isac.co.jp</email></para> - </listitem> - - <listitem> - <para>Nobuyuki Koganemaru - <email>kogane@koganemaru.co.jp</email></para> - </listitem> - - <listitem> - <para>Norio Suzuki <email>nosuzuki@e-mail.ne.jp</email></para> - </listitem> - - <listitem> - <para>Noritaka Ishizumi <email>graphite@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Noriyuki Soda <email>soda@sra.co.jp</email></para> - </listitem> - - <listitem> - <para>Oh Junseon <email>hollywar@mail.holywar.net</email></para> - </listitem> - - <listitem> - <para>Olaf Wagner <email>wagner@luthien.in-berlin.de</email></para> - </listitem> - - <listitem> - <para>Oleg Sharoiko <email>os@rsu.ru</email></para> - </listitem> - - <listitem> - <para>Oleg V. Volkov <email>rover@lglobus.ru</email></para> - </listitem> - - <listitem> - <para>Oliver Breuninger <email>ob@seicom.NET</email></para> - </listitem> - - <listitem> - <para>Oliver Friedrichs <email>oliver@secnet.com</email></para> - </listitem> - - <listitem> - <para>Oliver Fromme - <email>oliver.fromme@heim3.tu-clausthal.de</email></para> - </listitem> - - <listitem> - <para>Oliver Laumann - <email>net@informatik.uni-bremen.de</email></para> - </listitem> - - <listitem> - <para>Oliver Oberdorf <email>oly@world.std.com</email></para> - </listitem> - - <listitem> - <para>Olof Johansson <email>offe@ludd.luth.se</email></para> - </listitem> - - <listitem> - <para>Osokin Sergey aka oZZ <email>ozz@FreeBSD.org.ru</email></para> - </listitem> - - <listitem> - <para>Pace Willisson <email>pace@blitz.com</email></para> - </listitem> - - <listitem> - <para>Paco Rosich <email>rosich@modico.eleinf.uv.es</email></para> - </listitem> - - <listitem> - <para>Palle Girgensohn <email>girgen@partitur.se</email></para> - </listitem> - - <listitem> - <para>Parag Patel <email>parag@cgt.com</email></para> - </listitem> - - <listitem> - <para>Pascal Pederiva <email>pascal@zuo.dec.com</email></para> - </listitem> - - <listitem> - <para>Pasvorn Boonmark <email>boonmark@juniper.net</email></para> - </listitem> - - <listitem> - <para>Patrick Gardella <email>patrick@cre8tivegroup.com</email></para> - </listitem> - - <listitem> - <para>Patrick Hausen <email>unknown</email></para> - </listitem> - - <listitem> - <para>Paul Antonov <email>apg@demos.su</email></para> - </listitem> - - <listitem> - <para>Paul F. Werkowski <email>unknown</email></para> - </listitem> - - <listitem> - <para>Paul Fox <email>pgf@foxharp.boston.ma.us</email></para> - </listitem> - - <listitem> - <para>Paul Koch <email>koch@thehub.com.au</email></para> - </listitem> - - <listitem> - <para>Paul Kranenburg <email>pk@NetBSD.org</email></para> - </listitem> - - <listitem> - <para>Paul Mackerras <email>paulus@cs.anu.edu.au</email></para> - </listitem> - - <listitem> - <para>Paul Popelka <email>paulp@uts.amdahl.com</email></para> - </listitem> - - <listitem> - <para>Paul S. LaFollette, Jr. <email>unknown</email></para> - </listitem> - - <listitem> - <para>Paul Saab <email>paul@mu.org</email></para> - </listitem> - - <listitem> - <para>Paul Sandys <email>myj@nyct.net</email></para> - </listitem> - - <listitem> - <para>Paul T. Root <email>proot@horton.iaces.com</email></para> - </listitem> - - <listitem> - <para>Paul Vixie <email>paul@vix.com</email></para> - </listitem> - - <listitem> - <para>Paulo Menezes <email>paulo@isr.uc.pt</email></para> - </listitem> - - <listitem> - <para>Paulo Menezes <email>pm@dee.uc.pt</email></para> - </listitem> - - <listitem> - <para>Pedro A M Vazquez <email>vazquez@IQM.Unicamp.BR</email></para> - </listitem> - - <listitem> - <para>Pedro Giffuni <email>giffunip@asme.org</email></para> - </listitem> - - <listitem> - <para>Pete Bentley <email>pete@demon.net</email></para> - </listitem> - - <listitem> - <para>Peter Childs <email>pjchilds@imforei.apana.org.au</email></para> - </listitem> - - <listitem> - <para>Peter Cornelius <email>pc@inr.fzk.de</email></para> - </listitem> - - <listitem> - <para>Peter Haight <email>peterh@prognet.com</email></para> - </listitem> - - <listitem> - <para>Peter Jeremy <email>perer.jeremy@alcatel.com.au</email></para> - </listitem> - - <listitem> - <para>Peter M. Chen <email>pmchen@eecs.umich.edu</email></para> - </listitem> - - <listitem> - <para>Peter Much <email>peter@citylink.dinoex.sub.org</email></para> - </listitem> - - <listitem> - <para>Peter Olsson <email>unknown</email></para> - </listitem> - - <listitem> - <para>Peter Philipp <email>pjp@bsd-daemon.net</email></para> - </listitem> - - <listitem> - <para>Peter Stubbs <email>PETERS@staidan.qld.edu.au</email></para> - </listitem> - - <listitem> - <para>Phil Maker <email>pjm@cs.ntu.edu.au</email></para> - </listitem> - - <listitem> - <para>Phil Sutherland - <email>philsuth@mycroft.dialix.oz.au</email></para> - </listitem> - - <listitem> - <para>Phil Taylor <email>phil@zipmail.co.uk</email></para> - </listitem> - - <listitem> - <para>Philip Musumeci <email>philip@rmit.edu.au</email></para> - </listitem> - - <listitem> - <para>Pierre Y. Dampure <email>pierre.dampure@k2c.co.uk</email></para> - </listitem> - - <listitem> - <para>Pius Fischer <email>pius@ienet.com</email></para> - </listitem> - - <listitem> - <para>Pomegranate <email>daver@flag.blackened.net</email></para> - </listitem> - - <listitem> - <para>Powerdog Industries - <email>kevin.ruddy@powerdog.com</email></para> - </listitem> - - <listitem> - <para>R. Kym Horsell</para> - </listitem> - - <listitem> - <para>Rajesh Vaidheeswarran <email>rv@fore.com</email></para> - </listitem> - - <listitem> - <para>Ralf Friedl <email>friedl@informatik.uni-kl.de</email></para> - </listitem> - - <listitem> - <para>Randal S. Masutani <email>randal@comtest.com</email></para> - </listitem> - - <listitem> - <para>Randall Hopper <email>rhh@ct.picker.com</email></para> - </listitem> - - <listitem> - <para>Randall W. Dean <email>rwd@osf.org</email></para> - </listitem> - - <listitem> - <para>Randy Bush <email>rbush@bainbridge.verio.net</email></para> - </listitem> - - <listitem> - <para>Reinier Bezuidenhout - <email>rbezuide@mikom.csir.co.za</email></para> - </listitem> - - <listitem> - <para>Remy Card <email>Remy.Card@masi.ibp.fr</email></para> - </listitem> - - <listitem> - <para>Ricardas Cepas <email>rch@richard.eu.org</email></para> - </listitem> - - <listitem> - <para>Riccardo Veraldi <email>veraldi@cs.unibo.it</email></para> - </listitem> - - <listitem> - <para>Richard Henderson <email>richard@atheist.tamu.edu</email></para> - </listitem> - - <listitem> - <para>Richard Hwang <email>rhwang@bigpanda.com</email></para> - </listitem> - - <listitem> - <para>Richard Kiss <email>richard@homemail.com</email></para> - </listitem> - - <listitem> - <para>Richard J Kuhns <email>rjk@watson.grauel.com</email></para> - </listitem> - - <listitem> - <para>Richard M. Neswold - <email>rneswold@drmemory.fnal.gov</email></para> - </listitem> - - <listitem> - <para>Richard Seaman, Jr. <email>dick@tar.com</email></para> - </listitem> - - <listitem> - <para>Richard Stallman <email>rms@gnu.ai.mit.edu</email></para> - </listitem> - - <listitem> - <para>Richard Straka <email>straka@user1.inficad.com</email></para> - </listitem> - - <listitem> - <para>Richard Tobin <email>richard@cogsci.ed.ac.uk</email></para> - </listitem> - - <listitem> - <para>Richard Wackerbarth <email>rkw@Dataplex.NET</email></para> - </listitem> - - <listitem> - <para>Richard Winkel <email>rich@math.missouri.edu</email></para> - </listitem> - - <listitem> - <para>Richard Wiwatowski <email>rjwiwat@adelaide.on.net</email></para> - </listitem> - - <listitem> - <para>Rick Macklem <email>rick@snowhite.cis.uoguelph.ca</email></para> - </listitem> - - <listitem> - <para>Rick Macklin <email>unknown</email></para> - </listitem> - - <listitem> - <para>Rob Austein <email>sra@epilogue.com</email></para> - </listitem> - - <listitem> - <para>Rob Mallory <email>rmallory@qualcomm.com</email></para> - </listitem> - - <listitem> - <para>Rob Snow <email>rsnow@txdirect.net</email></para> - </listitem> - - <listitem> - <para>Robert Crowe <email>bob@speakez.com</email></para> - </listitem> - - <listitem> - <para>Robert D. Thrush <email>rd@phoenix.aii.com</email></para> - </listitem> - - <listitem> - <para>Robert Eckardt - <email>roberte@MEP.Ruhr-Uni-Bochum.de</email></para> - </listitem> - - <listitem> - <para>Robert Sanders <email>rsanders@mindspring.com</email></para> - </listitem> - - <listitem> - <para>Robert Sexton <email>robert@kudra.com</email></para> - </listitem> - - <listitem> - <para>Robert Shady <email>rls@id.net</email></para> - </listitem> - - <listitem> - <para>Robert Swindells <email>swindellsr@genrad.co.uk</email></para> - </listitem> - - <listitem> - <para>Robert Watson <email>robert@cyrus.watson.org</email></para> - </listitem> - - <listitem> - <para>Robert Withrow <email>witr@rwwa.com</email></para> - </listitem> - - <listitem> - <para>Robert Yoder <email>unknown</email></para> - </listitem> - - <listitem> - <para>Robin Carey - <email>robin@mailgate.dtc.rankxerox.co.uk</email></para> - </listitem> - - <listitem> - <para>Roger Hardiman <email>roger@cs.strath.ac.uk</email></para> - </listitem> - - <listitem> - <para>Roland Jesse <email>jesse@cs.uni-magdeburg.de</email></para> - </listitem> - - <listitem> - <para>Ron Bickers <email>rbickers@intercenter.net</email></para> - </listitem> - - <listitem> - <para>Ron Lenk <email>rlenk@widget.xmission.com</email></para> - </listitem> - - <listitem> - <para>Ronald Kuehn <email>kuehn@rz.tu-clausthal.de</email></para> - </listitem> - - <listitem> - <para>Rudolf Cejka <email>unknown</email></para> - </listitem> - - <listitem> - <para>Ruslan Belkin <email>rus@home2.UA.net</email></para> - </listitem> - - <listitem> - <para>Ruslan Ermilov <email>ru@ucb.crimea.ua</email></para> - </listitem> - - <listitem> - <para>Ruslan Shevchenko <email>rssh@cam.grad.kiev.ua</email></para> - </listitem> - - <listitem> - <para>Russell L. Carter <email>rcarter@pinyon.org</email></para> - </listitem> - - <listitem> - <para>Russell Vincent <email>rv@groa.uct.ac.za</email></para> - </listitem> - - <listitem> - <para>Ryan Younce <email>ryany@pobox.com</email></para> - </listitem> - - <listitem> - <para>Ryuichiro IMURA <email>imura@cs.titech.ac.jp</email></para> - </listitem> - - <listitem> - <para>SANETO Takanori <email>sanewo@strg.sony.co.jp</email></para> - </listitem> - - <listitem> - <para>SAWADA Mizuki <email>miz@qb3.so-net.ne.jp</email></para> - </listitem> - - <listitem> - <para>SUGIMURA Takashi <email>sugimura@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>SURANYI Peter - <email>suranyip@jks.is.tsukuba.ac.jp</email></para> - </listitem> - - <listitem> - <para>Sakai Hiroaki <email>sakai@miya.ee.kagu.sut.ac.jp</email></para> - </listitem> - - <listitem> - <para>Sakari Jalovaara <email>sja@tekla.fi</email></para> - </listitem> - - <listitem> - <para>Sam Hartman <email>hartmans@mit.edu</email></para> - </listitem> - - <listitem> - <para>Samuel Lam <email>skl@ScalableNetwork.com</email></para> - </listitem> - - <listitem> - <para>Samuele Zannoli <email>zannoli@cs.unibo.it</email></para> - </listitem> - - <listitem> - <para>Sander Vesik <email>sander@haldjas.folklore.ee</email></para> - </listitem> - - <listitem> - <para>Sandro Sigala <email>ssigala@globalnet.it</email></para> - </listitem> - - <listitem> - <para>Sascha Blank <email>blank@fox.uni-trier.de</email></para> - </listitem> - - <listitem> - <para>Sascha Wildner <email>swildner@channelz.GUN.de</email></para> - </listitem> - - <listitem> - <para>Satoh Junichi <email>junichi@astec.co.jp</email></para> - </listitem> - - <listitem> - <para>Scot Elliott <email>scot@poptart.org</email></para> - </listitem> - - <listitem> - <para>Scot W. Hetzel <email>hetzels@westbend.net</email></para> - </listitem> - - <listitem> - <para>Scott A. Kenney <email>saken@rmta.ml.org</email></para> - </listitem> - - <listitem> - <para>Scott Blachowicz - <email>scott.blachowicz@seaslug.org</email></para> - </listitem> - - <listitem> - <para>Scott Burris <email>scott@pita.cns.ucla.edu</email></para> - </listitem> - - <listitem> - <para>Scott Hazen Mueller <email>scott@zorch.sf-bay.org</email></para> - </listitem> - - <listitem> - <para>Scott Michel <email>scottm@cs.ucla.edu</email></para> - </listitem> - - <listitem> - <para>Scott Mitchel <email>scott@uk.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Scott Reynolds <email>scott@clmqt.marquette.mi.us</email></para> - </listitem> - - <listitem> - <para>Sebastian Strollo <email>seb@erix.ericsson.se</email></para> - </listitem> - - <listitem> - <para>Serge A. Babkin <email>babkin@hq.icb.chel.su</email></para> - </listitem> - - <listitem> - <para>Serge V. Vakulenko <email>vak@zebub.msk.su</email></para> - </listitem> - - <listitem> - <para>Sergei Chechetkin - <email>csl@whale.sunbay.crimea.ua</email></para> - </listitem> - - <listitem> - <para>Sergei S. Laskavy <email>laskavy@pc759.cs.msu.su</email></para> - </listitem> - - <listitem> - <para>Sergey Gershtein <email>sg@mplik.ru</email></para> - </listitem> - - <listitem> - <para>Sergey Kosyakov <email>ks@itp.ac.ru</email></para> - </listitem> - - <listitem> - <para>Sergey Potapov <email>sp@alkor.ru</email></para> - </listitem> - - <listitem> - <para>Sergey Shkonda <email>serg@bcs.zp.ua</email></para> - </listitem> - - <listitem> - <para>Sergey V.Dorokhov <email>svd@kbtelecom.nalnet.ru</email></para> - </listitem> - - <listitem> - <para>Sergio Lenzi <email>lenzi@bsi.com.br</email></para> - </listitem> - - <listitem> - <para>Shaun Courtney <email>shaun@emma.eng.uct.ac.za</email></para> - </listitem> - - <listitem> - <para>Shawn M. Carey <email>smcarey@mailbox.syr.edu</email></para> - </listitem> - - <listitem> - <para>Shigio Yamaguchi <email>shigio@tamacom.com</email></para> - </listitem> - - <listitem> - <para>Shinya Esu <email>esu@yk.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Shuichi Tanaka <email>stanaka@bb.mbn.or.jp</email></para> - </listitem> - - <listitem> - <para>Shunsuke Akiyama <email>akiyama@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Simon <email>simon@masi.ibp.fr</email></para> - </listitem> - - <listitem> - <para>Simon Burge <email>simonb@telstra.com.au</email></para> - </listitem> - - <listitem> - <para>Simon J Gerraty <email>sjg@melb.bull.oz.au</email></para> - </listitem> - - <listitem> - <para>Simon Marlow <email>simonm@dcs.gla.ac.uk</email></para> - </listitem> - - <listitem> - <para>Simon Shapiro <email>shimon@simon-shapiro.org</email></para> - </listitem> - - <listitem> - <para>Sin'ichiro MIYATANI <email>siu@phaseone.co.jp</email></para> - </listitem> - - <listitem> - <para>Slaven Rezic <email>eserte@cs.tu-berlin.de</email></para> - </listitem> - - <listitem> - <para>Soochon Radee <email>slr@mitre.org</email></para> - </listitem> - - <listitem> - <para>Soren Dayton <email>csdayton@midway.uchicago.edu</email></para> - </listitem> - - <listitem> - <para>Soren Dossing <email>sauber@netcom.com</email></para> - </listitem> - - <listitem> - <para>Soren S. Jorvang <email>soren@dt.dk</email></para> - </listitem> - - <listitem> - <para>Stefan Bethke <email>stb@hanse.de</email></para> - </listitem> - - <listitem> - <para>Stefan Eggers <email>seggers@semyam.dinoco.de</email></para> - </listitem> - - <listitem> - <para>Stefan Moeding <email>s.moeding@ndh.net</email></para> - </listitem> - - <listitem> - <para>Stefan Petri <email>unknown</email></para> - </listitem> - - <listitem> - <para>Stefan `Sec` Zehl <email>sec@42.org</email></para> - </listitem> - - <listitem> - <para>Steinar Haug <email>sthaug@nethelp.no</email></para> - </listitem> - - <listitem> - <para>Stephane E. Potvin <email>sepotvin@videotron.ca</email></para> - </listitem> - - <listitem> - <para>Stephane Legrand <email>stephane@lituus.fr</email></para> - </listitem> - - <listitem> - <para>Stephen Clawson - <email>sclawson@marker.cs.utah.edu</email></para> - </listitem> - - <listitem> - <para>Stephen F. Combs <email>combssf@salem.ge.com</email></para> - </listitem> - - <listitem> - <para>Stephen Farrell <email>stephen@farrell.org</email></para> - </listitem> - - <listitem> - <para>Stephen Hocking <email>sysseh@devetir.qld.gov.au</email></para> - </listitem> - - <listitem> - <para>Stephen J. Roznowski <email>sjr@home.net</email></para> - </listitem> - - <listitem> - <para>Stephen McKay <email>syssgm@devetir.qld.gov.au</email></para> - </listitem> - - <listitem> - <para>Stephen Melvin <email>melvin@zytek.com</email></para> - </listitem> - - <listitem> - <para>Steve Bauer <email>sbauer@rock.sdsmt.edu</email></para> - </listitem> - - <listitem> - <para>Steve Coltrin <email>spcoltri@io.com</email></para> - </listitem> - - <listitem> - <para>Steve Deering <email>unknown</email></para> - </listitem> - - <listitem> - <para>Steve Gerakines <email>steve2@genesis.tiac.net</email></para> - </listitem> - - <listitem> - <para>Steve Gericke <email>steveg@comtrol.com</email></para> - </listitem> - - <listitem> - <para>Steve Piette <email>steve@simon.chi.il.US</email></para> - </listitem> - - <listitem> - <para>Steve Schwarz <email>schwarz@alpharel.com</email></para> - </listitem> - - <listitem> - <para>Steven G. Kargl - <email>kargl@troutmask.apl.washington.edu</email></para> - </listitem> - - <listitem> - <para>Steven H. Samorodin <email>samorodi@NUXI.com</email></para> - </listitem> - - <listitem> - <para>Steven McCanne <email>mccanne@cs.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>Steven Plite <email>splite@purdue.edu</email></para> - </listitem> - - <listitem> - <para>Steven Wallace <email>unknown</email></para> - </listitem> - - <listitem> - <para>Stuart Henderson - <email>stuart@internationalschool.co.uk</email></para> - </listitem> - - <listitem> - <para>Sue Blake <email>sue@welearn.com.au</email></para> - </listitem> - - <listitem> - <para>Sugimoto Sadahiro <email>ixtl@komaba.utmc.or.jp</email></para> - </listitem> - - <listitem> - <para>Sugiura Shiro <email>ssugiura@duo.co.jp</email></para> - </listitem> - - <listitem> - <para>Sujal Patel <email>smpatel@wam.umd.edu</email></para> - </listitem> - - <listitem> - <para>Sune Stjerneby <email>stjerneby@usa.net</email></para> - </listitem> - - <listitem> - <para>Suzuki Yoshiaki - <email>zensyo@ann.tama.kawasaki.jp</email></para> - </listitem> - - <listitem> - <para>Tadashi Kumano <email>kumano@strl.nhk.or.jp</email></para> - </listitem> - - <listitem> - <para>Taguchi Takeshi <email>taguchi@tohoku.iij.ad.jp</email></para> - </listitem> - - <listitem> - <para>Takahiro Yugawa <email>yugawa@orleans.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Takanori Watanabe - <email>takawata@shidahara1.planet.sci.kobe-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takashi Mega <email>mega@minz.org</email></para> - </listitem> - - <listitem> - <para>Takashi Uozu <email>j1594016@ed.kagu.sut.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takayuki Ariga <email>a00821@cc.hc.keio.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takeru NAIKI <email>naiki@bfd.es.hokudai.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takeshi Amaike <email>amaike@iri.co.jp</email></para> - </listitem> - - <listitem> - <para>Takeshi MUTOH <email>mutoh@info.nara-k.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takeshi Ohashi - <email>ohashi@mickey.ai.kyutech.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takeshi WATANABE - <email>watanabe@crayon.earth.s.kobe-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Takuya SHIOZAKI - <email>tshiozak@makino.ise.chuo-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Tatoku Ogaito <email>tacha@tera.fukui-med.ac.jp</email></para> - </listitem> - - <listitem> - <para>Tatsumi HOSOKAWA <email>hosokawa@jp.FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Ted Buswell <email>tbuswell@mediaone.net</email></para> - </listitem> - - <listitem> - <para>Ted Faber <email>faber@isi.edu</email></para> - </listitem> - - <listitem> - <para>Ted Lemon <email>mellon@isc.org</email></para> - </listitem> - - <listitem> - <para>Terry Lambert <email>terry@lambert.org</email></para> - </listitem> - - <listitem> - <para>Terry Lee <email>terry@uivlsi.csl.uiuc.edu</email></para> - </listitem> - - <listitem> - <para>Tetsuya Furukawa <email>tetsuya@secom-sis.co.jp</email></para> - </listitem> - - <listitem> - <para>Theo de Raadt <email>deraadt@OpenBSD.org</email></para> - </listitem> - - <listitem> - <para>Thomas <email>thomas@mathematik.uni-Bremen.de</email></para> - </listitem> - - <listitem> - <para>Thomas D. Dean <email>tomdean@ix.netcom.com</email></para> - </listitem> - - <listitem> - <para>Thomas David Rivers <email>rivers@dignus.com</email></para> - </listitem> - - <listitem> - <para>Thomas G. McWilliams <email>tgm@netcom.com</email></para> - </listitem> - - <listitem> - <para>Thomas Gellekum - <email>thomas@ghpc8.ihf.rwth-aachen.de</email></para> - </listitem> - - <listitem> - <para>Thomas Graichen - <email>graichen@omega.physik.fu-berlin.de</email></para> - </listitem> - - <listitem> - <para>Thomas König - <email>Thomas.Koenig@ciw.uni-karlsruhe.de</email></para> - </listitem> - - <listitem> - <para>Thomas Ptacek <email>unknown</email></para> - </listitem> - - <listitem> - <para>Thomas A. Stephens <email>tas@stephens.org</email></para> - </listitem> - - <listitem> - <para>Thomas Stromberg <email>tstrombe@rtci.com</email></para> - </listitem> - - <listitem> - <para>Thomas Valentino Crimi - <email>tcrimi+@andrew.cmu.edu</email></para> - </listitem> - - <listitem> - <para>Thomas Wintergerst <email>thomas@lemur.nord.de</email></para> - </listitem> - - <listitem> - <para>Þórður Ívarsson - <email>totii@est.is</email></para> - </listitem> - - <listitem> - <para>Tim Kientzle <email>kientzle@netcom.com</email></para> - </listitem> - - <listitem> - <para>Tim Singletary - <email>tsingle@sunland.gsfc.nasa.gov</email></para> - </listitem> - - <listitem> - <para>Tim Wilkinson <email>tim@sarc.city.ac.uk</email></para> - </listitem> - - <listitem> - <para>Timo J. Rinne <email>tri@iki.fi</email></para> - </listitem> - - <listitem> - <para>Todd Miller <email>millert@openbsd.org</email></para> - </listitem> - - <listitem> - <para>Tom <email>root@majestix.cmr.no</email></para> - </listitem> - - <listitem> - <para>Tom <email>tom@sdf.com</email></para> - </listitem> - - <listitem> - <para>Tom Gray - DCA <email>dcasba@rain.org</email></para> - </listitem> - - <listitem> - <para>Tom Jobbins <email>tom@tom.tj</email></para> - </listitem> - - <listitem> - <para>Tom Pusateri <email>pusateri@juniper.net</email></para> - </listitem> - - <listitem> - <para>Tom Rush <email>tarush@mindspring.com</email></para> - </listitem> - - <listitem> - <para>Tom Samplonius <email>tom@misery.sdf.com</email></para> - </listitem> - - <listitem> - <para>Tomohiko Kurahashi - <email>kura@melchior.q.t.u-tokyo.ac.jp</email></para> - </listitem> - - <listitem> - <para>Tony Kimball <email>alk@Think.COM</email></para> - </listitem> - - <listitem> - <para>Tony Li <email>tli@jnx.com</email></para> - </listitem> - - <listitem> - <para>Tony Lynn <email>wing@cc.nsysu.edu.tw</email></para> - </listitem> - - <listitem> - <para>Tony Maher <email>tonym@angis.org.au</email></para> - </listitem> - - <listitem> - <para>Torbjorn Granlund <email>tege@matematik.su.se</email></para> - </listitem> - - <listitem> - <para>Toshihiko ARAI <email>toshi@tenchi.ne.jp</email></para> - </listitem> - - <listitem> - <para>Toshihiko SHIMOKAWA <email>toshi@tea.forus.or.jp</email></para> - </listitem> - - <listitem> - <para>Toshihiro Kanda <email>candy@kgc.co.jp</email></para> - </listitem> - - <listitem> - <para>Toshiomi Moriki - <email>Toshiomi.Moriki@ma1.seikyou.ne.jp</email></para> - </listitem> - - <listitem> - <para>Trefor S. <email>trefor@flevel.co.uk</email></para> - </listitem> - - <listitem> - <para>Trevor Blackwell <email>tlb@viaweb.com</email></para> - </listitem> - - <listitem> - <para>URATA Shuichiro <email>s-urata@nmit.tmg.nec.co.jp</email></para> - </listitem> - - <listitem> - <para>Udo Schweigert <email>ust@cert.siemens.de</email></para> - </listitem> - - <listitem> - <para>Ugo Paternostro <email>paterno@dsi.unifi.it</email></para> - </listitem> - - <listitem> - <para>Ulf Kieber <email>kieber@sax.de</email></para> - </listitem> - - <listitem> - <para>Ulli Linzen <email>ulli@perceval.camelot.de</email></para> - </listitem> - - <listitem> - <para>Ustimenko Semen <email>semen@iclub.nsu.ru</email></para> - </listitem> - - <listitem> - <para>Uwe Arndt <email>arndt@mailhost.uni-koblenz.de</email></para> - </listitem> - - <listitem> - <para>Vadim Chekan <email>vadim@gc.lviv.ua</email></para> - </listitem> - - <listitem> - <para>Vadim Kolontsov <email>vadim@tversu.ac.ru</email></para> - </listitem> - - <listitem> - <para>Vadim Mikhailov <email>mvp@braz.ru</email></para> - </listitem> - - <listitem> - <para>Van Jacobson <email>van@ee.lbl.gov</email></para> - </listitem> - - <listitem> - <para>Vasily V. Grechishnikov - <email>bazilio@ns1.ied-vorstu.ac.ru</email></para> - </listitem> - - <listitem> - <para>Vasim Valejev <email>vasim@uddias.diaspro.com</email></para> - </listitem> - - <listitem> - <para>Vernon J. Schryver <email>vjs@mica.denver.sgi.com</email></para> - </listitem> - - <listitem> - <para>Vic Abell <email>abe@cc.purdue.edu</email></para> - </listitem> - - <listitem> - <para>Ville Eerola <email>ve@sci.fi</email></para> - </listitem> - - <listitem> - <para>Vincent Poy <email>vince@venus.gaianet.net</email></para> - </listitem> - - <listitem> - <para>Vincenzo Capuano - <email>VCAPUANO@vmprofs.esoc.esa.de</email></para> - </listitem> - - <listitem> - <para>Virgil Champlin <email>champlin@pa.dec.com</email></para> - </listitem> - - <listitem> - <para>Vladimir A. Jakovenko - <email>vovik@ntu-kpi.kiev.ua</email></para> - </listitem> - - <listitem> - <para>Vladimir Kushnir <email>kushn@mail.kar.net</email></para> - </listitem> - - <listitem> - <para>Vsevolod Lobko <email>seva@alex-ua.com</email></para> - </listitem> - - <listitem> - <para>W. Gerald Hicks <email>wghicks@bellsouth.net</email></para> - </listitem> - - <listitem> - <para>W. Richard Stevens <email>rstevens@noao.edu</email></para> - </listitem> - - <listitem> - <para>Walt Howard <email>howard@ee.utah.edu</email></para> - </listitem> - - <listitem> - <para>Warren Toomey <email>wkt@csadfa.cs.adfa.oz.au</email></para> - </listitem> - - <listitem> - <para>Wayne Scott <email>wscott@ichips.intel.com</email></para> - </listitem> - - <listitem> - <para>Werner Griessl - <email>werner@btp1da.phy.uni-bayreuth.de</email></para> - </listitem> - - <listitem> - <para>Wes Santee <email>wsantee@wsantee.oz.net</email></para> - </listitem> - - <listitem> - <para>Wietse Venema <email>wietse@wzv.win.tue.nl</email></para> - </listitem> - - <listitem> - <para>Wilfredo Sanchez <email>wsanchez@apple.com</email></para> - </listitem> - - <listitem> - <para>Wiljo Heinen <email>wiljo@freeside.ki.open.de</email></para> - </listitem> - - <listitem> - <para>Wilko Bulte <email>wilko@yedi.iaf.nl</email></para> - </listitem> - - <listitem> - <para>Will Andrews <email>andrews@technologist.com</email></para> - </listitem> - - <listitem> - <para>Willem Jan Withagen <email>wjw@surf.IAE.nl</email></para> - </listitem> - - <listitem> - <para>William Jolitz <email>withheld</email></para> - </listitem> - - <listitem> - <para>William Liao <email>william@tale.net</email></para> - </listitem> - - <listitem> - <para>Wojtek Pilorz - <email>wpilorz@celebris.bdk.lublin.pl</email></para> - </listitem> - - <listitem> - <para>Wolfgang Helbig <email>helbig@ba-stuttgart.de</email></para> - </listitem> - - <listitem> - <para>Wolfgang Solfrank <email>ws@tools.de</email></para> - </listitem> - - <listitem> - <para>Wolfgang Stanglmeier <email>wolf@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Wu Ching-hong <email>woju@FreeBSD.ee.Ntu.edu.TW</email></para> - </listitem> - - <listitem> - <para>Yarema <email>yds@ingress.com</email></para> - </listitem> - - <listitem> - <para>Yaroslav Terletsky <email>ts@polynet.lviv.ua</email></para> - </listitem> - - <listitem> - <para>Yasuhito FUTATSUKI <email>futatuki@fureai.or.jp</email></para> - </listitem> - - <listitem> - <para>Yasuhiro Fukama <email>yasuf@big.or.jp</email></para> - </listitem> - - <listitem> - <para>Yen-Shuo Su <email>yssu@CCCA.NCTU.edu.tw</email></para> - </listitem> - - <listitem> - <para>Ying-Chieh Liao <email>ijliao@csie.NCTU.edu.tw</email></para> - </listitem> - - <listitem> - <para>Yixin Jin <email>yjin@rain.cs.ucla.edu</email></para> - </listitem> - - <listitem> - <para>Yoshiaki Uchikawa <email>yoshiaki@kt.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Yoshihiko OHTA <email>yohta@bres.tsukuba.ac.jp</email></para> - </listitem> - - <listitem> - <para>Yoshihisa NAKAGAWA - <email>y-nakaga@ccs.mt.nec.co.jp</email></para> - </listitem> - - <listitem> - <para>Yoshikazu Goto <email>gotoh@ae.anritsu.co.jp</email></para> - </listitem> - - <listitem> - <para>Yoshimasa Ohnishi - <email>ohnishi@isc.kyutech.ac.jp</email></para> - </listitem> - - <listitem> - <para>Yoshishige Arai <email>ryo2@on.rim.or.jp</email></para> - </listitem> - - <listitem> - <para>Yuichi MATSUTAKA <email>matutaka@osa.att.ne.jp</email></para> - </listitem> - - <listitem> - <para>Yujiro MIYATA - <email>miyata@bioele.nuee.nagoya-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Yukihiro Nakai <email>nacai@iname.com</email></para> - </listitem> - - <listitem> - <para>Yusuke Nawano <email>azuki@azkey.org</email></para> - </listitem> - - <listitem> - <para>Yuu Yashiki <email>s974123@cc.matsuyama-u.ac.jp</email></para> - </listitem> - - <listitem> - <para>Yuval Yarom <email>yval@cs.huji.ac.il</email></para> - </listitem> - - <listitem> - <para>Yves Fonk <email>yves@cpcoup5.tn.tudelft.nl</email></para> - </listitem> - - <listitem> - <para>Yves Fonk <email>yves@dutncp8.tn.tudelft.nl</email></para> - </listitem> - - <listitem> - <para>Zach Heilig <email>zach@gaffaneys.com</email></para> - </listitem> - - <listitem> - <para>Zahemszhky Gabor <email>zgabor@code.hu</email></para> - </listitem> - - <listitem> - <para>Zhong Ming-Xun <email>zmx@mail.CDPA.nsysu.edu.tw</email></para> - </listitem> - - <listitem> - <para>arci <email>vega@sophia.inria.fr</email></para> - </listitem> - - <listitem> - <para>der Mouse <email>mouse@Collatz.McRCIM.McGill.EDU</email></para> - </listitem> - - <listitem> - <para>frf <email>frf@xocolatl.com</email></para> - </listitem> - - <listitem> - <para>Ege Rekk <email>aagero@aage.priv.no</email></para> - </listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>386BSD Patch Kit Patch Contributors</title> - - <para>(in alphabetical order by first name):</para> - - <itemizedlist> - <listitem> - <para>Adam Glass <email>glass@postgres.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>Adrian Hall <email>adrian@ibmpcug.co.uk</email></para> - </listitem> - - <listitem> - <para>Andrey A. Chernov <email>ache@astral.msk.su</email></para> - </listitem> - - <listitem> - <para>Andrew Herbert <email>andrew@werple.apana.org.au</email></para> - </listitem> - - <listitem> - <para>Andrew Moore <email>alm@netcom.com</email></para> - </listitem> - - <listitem> - <para>Andy Valencia <email>ajv@csd.mot.com</email> - <email>jtk@netcom.com</email></para> - </listitem> - - <listitem> - <para>Arne Henrik Juul <email>arnej@Lise.Unit.NO</email></para> - </listitem> - - <listitem> - <para>Bakul Shah <email>bvs@bitblocks.com</email></para> - </listitem> - - <listitem> - <para>Barry Lustig <email>barry@ictv.com</email></para> - </listitem> - - <listitem> - <para>Bob Wilcox <email>bob@obiwan.uucp</email></para> - </listitem> - - <listitem> - <para>Branko Lankester</para> - </listitem> - - <listitem> - <para>Brett Lymn <email>blymn@mulga.awadi.com.AU</email></para> - </listitem> - - <listitem> - <para>Charles Hannum <email>mycroft@ai.mit.edu</email></para> - </listitem> - - <listitem> - <para>Chris G. Demetriou - <email>cgd@postgres.berkeley.edu</email></para> - </listitem> - - <listitem> - <para>Chris Torek <email>torek@ee.lbl.gov</email></para> - </listitem> - - <listitem> - <para>Christoph Robitschko - <email>chmr@edvz.tu-graz.ac.at</email></para> - </listitem> - - <listitem> - <para>Daniel Poirot <email>poirot@aio.jsc.nasa.gov</email></para> - </listitem> - - <listitem> - <para>Dave Burgess <email>burgess@hrd769.brooks.af.mil</email></para> - </listitem> - - <listitem> - <para>Dave Rivers <email>rivers@ponds.uucp</email></para> - </listitem> - - <listitem> - <para>David Dawes <email>dawes@physics.su.OZ.AU</email></para> - </listitem> - - <listitem> - <para>David Greenman <email>dg@Root.COM</email></para> - </listitem> - - <listitem> - <para>Eric J. Haug <email>ejh@slustl.slu.edu</email></para> - </listitem> - - <listitem> - <para>Felix Gaehtgens - <email>felix@escape.vsse.in-berlin.de</email></para> - </listitem> - - <listitem> - <para>Frank Maclachlan <email>fpm@crash.cts.com</email></para> - </listitem> - - <listitem> - <para>Gary A. Browning <email>gab10@griffcd.amdahl.com</email></para> - </listitem> - - <listitem> - <para>Gary Howland <email>gary@hotlava.com</email></para> - </listitem> - - <listitem> - <para>Geoff Rehmet <email>csgr@alpha.ru.ac.za</email></para> - </listitem> - - <listitem> - <para>Goran Hammarback <email>goran@astro.uu.se</email></para> - </listitem> - - <listitem> - <para>Guido van Rooij <email>guido@gvr.org</email></para> - </listitem> - - <listitem> - <para>Guy Harris <email>guy@auspex.com</email></para> - </listitem> - - <listitem> - <para>Havard Eidnes - <email>Havard.Eidnes@runit.sintef.no</email></para> - </listitem> - - <listitem> - <para>Herb Peyerl <email>hpeyerl@novatel.cuc.ab.ca</email></para> - </listitem> - - <listitem> - <para>Holger Veit <email>Holger.Veit@gmd.de</email></para> - </listitem> - - <listitem> - <para>Ishii Masahiro, R. Kym Horsell</para> - </listitem> - - <listitem> - <para>J.T. Conklin <email>jtc@cygnus.com</email></para> - </listitem> - - <listitem> - <para>Jagane D Sundar <email>jagane@netcom.com</email></para> - </listitem> - - <listitem> - <para>James Clark <email>jjc@jclark.com</email></para> - </listitem> - - <listitem> - <para>James Jegers <email>jimj@miller.cs.uwm.edu</email></para> - </listitem> - - <listitem> - <para>James W. Dolter</para> - </listitem> - - <listitem> - <para>James da Silva <email>jds@cs.umd.edu</email> et al</para> - </listitem> - - <listitem> - <para>Jay Fenlason <email>hack@datacube.com</email></para> - </listitem> - - <listitem> - <para>Jim Wilson <email>wilson@moria.cygnus.com</email></para> - </listitem> - - <listitem> - <para>Jörg Lohse - <email>lohse@tech7.informatik.uni-hamburg.de</email></para> - </listitem> - - <listitem> - <para>Jörg Wunsch - <email>joerg_wunsch@uriah.heep.sax.de</email></para> - </listitem> - - <listitem> - <para>John Dyson</para> - </listitem> - - <listitem> - <para>John Woods <email>jfw@eddie.mit.edu</email></para> - </listitem> - - <listitem> - <para>Jordan K. Hubbard <email>jkh@whisker.hubbard.ie</email></para> - </listitem> - - <listitem> - <para>Julian Elischer <email>julian@dialix.oz.au</email></para> - </listitem> - - <listitem> - <para>Julian Stacey <email>jhs@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Karl Dietz <email>Karl.Dietz@triplan.com</email></para> - </listitem> - - <listitem> - <para>Karl Lehenbauer <email>karl@NeoSoft.com</email> - <email>karl@one.neosoft.com</email></para> - </listitem> - - <listitem> - <para>Keith Bostic <email>bostic@toe.CS.Berkeley.EDU</email></para> - </listitem> - - <listitem> - <para>Ken Hughes</para> - </listitem> - - <listitem> - <para>Kent Talarico <email>kent@shipwreck.tsoft.net</email></para> - </listitem> - - <listitem> - <para>Kevin Lahey <email>kml%rokkaku.UUCP@mathcs.emory.edu</email> - <email>kml@mosquito.cis.ufl.edu</email></para> - </listitem> - - <listitem> - <para>Marc Frajola <email>marc@dev.com</email></para> - </listitem> - - <listitem> - <para>Mark Tinguely <email>tinguely@plains.nodak.edu</email> - <email>tinguely@hookie.cs.ndsu.NoDak.edu</email></para> - </listitem> - - <listitem> - <para>Martin Renters <email>martin@tdc.on.ca</email></para> - </listitem> - - <listitem> - <para>Michael Clay <email>mclay@weareb.org</email></para> - </listitem> - - <listitem> - <para>Michael Galassi <email>nerd@percival.rain.com</email></para> - </listitem> - - <listitem> - <para>Mike Durkin <email>mdurkin@tsoft.sf-bay.org</email></para> - </listitem> - - <listitem> - <para>Naoki Hamada <email>nao@tom-yam.or.jp</email></para> - </listitem> - - <listitem> - <para>Nate Williams <email>nate@bsd.coe.montana.edu</email></para> - </listitem> - - <listitem> - <para>Nick Handel <email>nhandel@NeoSoft.com</email> - <email>nick@madhouse.neosoft.com</email></para> - </listitem> - - <listitem> - <para>Pace Willisson <email>pace@blitz.com</email></para> - </listitem> - - <listitem> - <para>Paul Kranenburg <email>pk@cs.few.eur.nl</email></para> - </listitem> - - <listitem> - <para>Paul Mackerras <email>paulus@cs.anu.edu.au</email></para> - </listitem> - - <listitem> - <para>Paul Popelka <email>paulp@uts.amdahl.com</email></para> - </listitem> - - <listitem> - <para>Peter da Silva <email>peter@NeoSoft.com</email></para> - </listitem> - - <listitem> - <para>Phil Sutherland - <email>philsuth@mycroft.dialix.oz.au</email></para> - </listitem> - - <listitem> - <para>Poul-Henning Kamp<email>phk@FreeBSD.org</email></para> - </listitem> - - <listitem> - <para>Ralf Friedl <email>friedl@informatik.uni-kl.de</email></para> - </listitem> - - <listitem> - <para>Rick Macklem <email>root@snowhite.cis.uoguelph.ca</email></para> - </listitem> - - <listitem> - <para>Robert D. Thrush <email>rd@phoenix.aii.com</email></para> - </listitem> - - <listitem> - <para>Rodney W. Grimes <email>rgrimes@cdrom.com</email></para> - </listitem> - - <listitem> - <para>Sascha Wildner <email>swildner@channelz.GUN.de</email></para> - </listitem> - - <listitem> - <para>Scott Burris <email>scott@pita.cns.ucla.edu</email></para> - </listitem> - - <listitem> - <para>Scott Reynolds <email>scott@clmqt.marquette.mi.us</email></para> - </listitem> - - <listitem> - <para>Sean Eric Fagan <email>sef@kithrup.com</email></para> - </listitem> - - <listitem> - <para>Simon J Gerraty <email>sjg@melb.bull.oz.au</email> - <email>sjg@zen.void.oz.au</email></para> - </listitem> - - <listitem> - <para>Stephen McKay <email>syssgm@devetir.qld.gov.au</email></para> - </listitem> - - <listitem> - <para>Terry Lambert <email>terry@icarus.weber.edu</email></para> - </listitem> - - <listitem> - <para>Terry Lee <email>terry@uivlsi.csl.uiuc.edu</email></para> - </listitem> - - <listitem> - <para>Tor Egge <email>Tor.Egge@idi.ntnu.no</email></para> - </listitem> - - <listitem> - <para>Warren Toomey <email>wkt@csadfa.cs.adfa.oz.au</email></para> - </listitem> - - <listitem> - <para>Wiljo Heinen <email>wiljo@freeside.ki.open.de</email></para> - </listitem> - - <listitem> - <para>William Jolitz <email>withheld</email></para> - </listitem> - - <listitem> - <para>Wolfgang Solfrank <email>ws@tools.de</email></para> - </listitem> - - <listitem> - <para>Wolfgang Stanglmeier <email>wolf@dentaro.GUN.de</email></para> - </listitem> - - <listitem> - <para>Yuval Yarom <email>yval@cs.huji.ac.il</email></para> - </listitem> - </itemizedlist> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../handbook.sgml" "part" "chapter") - End: ---> - diff --git a/en_US.ISO8859-1/books/arch-handbook/Makefile b/en_US.ISO8859-1/books/arch-handbook/Makefile deleted file mode 100644 index f0390ebe65..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -# $FreeBSD$ -# -# Build the FreeBSD Developers' Handbook. -# - -MAINTAINER=murray@FreeBSD.org - -DOC?= book - -FORMATS?= html-split - -HAS_INDEX= true - -INSTALL_COMPRESSED?= gz -INSTALL_ONLY_COMPRESSED?= - -# Images -IMAGES= sockets/layers.eps sockets/sain.eps sockets/sainfill.eps sockets/sainlsb.eps sockets/sainmsb.eps sockets/sainserv.eps sockets/serv.eps sockets/serv2.eps sockets/slayers.eps - -# -# SRCS lists the individual SGML files that make up the document. Changes -# to any of these files will force a rebuild -# - -# SGML content -SRCS= book.sgml -SRCS+= boot/chapter.sgml -SRCS+= dma/chapter.sgml -SRCS+= driverbasics/chapter.sgml -SRCS+= introduction/chapter.sgml -SRCS+= ipv6/chapter.sgml -SRCS+= isa/chapter.sgml -SRCS+= jail/chapter.sgml -SRCS+= kerneldebug/chapter.sgml -SRCS+= kobj/chapter.sgml -SRCS+= l10n/chapter.sgml -SRCS+= locking/chapter.sgml -SRCS+= mac/chapter.sgml -SRCS+= pci/chapter.sgml -SRCS+= policies/chapter.sgml -SRCS+= scsi/chapter.sgml -SRCS+= secure/chapter.sgml -SRCS+= sockets/chapter.sgml -SRCS+= sound/chapter.sgml -SRCS+= sysinit/chapter.sgml -SRCS+= tools/chapter.sgml -SRCS+= usb/chapter.sgml -SRCS+= vm/chapter.sgml -SRCS+= x86/chapter.sgml - -# Entities - -DOC_PREFIX?= ${.CURDIR}/../../.. -.include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/en_US.ISO8859-1/books/arch-handbook/book.sgml b/en_US.ISO8859-1/books/arch-handbook/book.sgml deleted file mode 100644 index cac7f1c53a..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/book.sgml +++ /dev/null @@ -1,300 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [ -<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN"> -%bookinfo; -<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"> -%man; -<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN"> -%freebsd; -<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters; -<!ENTITY % mac-entities SYSTEM "mac.ent"> %mac-entities; -<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN"> %authors -<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN"> %mailing-lists; -<!ENTITY % chap.index "IGNORE"> -]> - -<book> - <bookinfo> - <title>FreeBSD Developers' Handbook</title> - - <corpauthor>The FreeBSD Documentation Project</corpauthor> - - <pubdate>August 2000</pubdate> - - <copyright> - <year>2000</year> - <year>2001</year> - <year>2002</year> - <holder>The FreeBSD Documentation Project</holder> - </copyright> - - &bookinfo.legalnotice; - - <abstract> - <para>Welcome to the Developers' Handbook. This manual is a - <emphasis>work in progress</emphasis> and is the work of many - individuals. Many sections do not yet exist and some of those - that do exist need to be updated. If you are interested in - helping with this project, send email to the &a.doc;.</para> - - <para>The latest version of this document is always available - from the <ulink URL="../../../../index.html">FreeBSD World - Wide Web server</ulink>. It may also be downloaded in a - variety of formats and compression options from the <ulink - url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/">FreeBSD FTP - server</ulink> or one of the numerous <ulink - url="../handbook/mirrors-ftp.html">mirror - sites</ulink>.</para> - </abstract> - </bookinfo> - - <part id="Basics"> - <title>Basics</title> - - &chap.introduction; - &chap.tools; - &chap.secure; - &chap.l10n; - &chap.policies; - - </part> - - <part id="ipc"> - <title>Interprocess Communication</title> - - <chapter id="signals"> - <title>* Signals</title> - - <para>Signals, pipes, semaphores, message queues, shared memory, - ports, sockets, doors</para> - - </chapter> - - &chap.sockets; - &chap.ipv6; - - </part> - - <part id="kernel"> - <title>Kernel</title> - - &chap.boot; - &chap.locking; - &chap.kobj; - &chap.jail; - &chap.sysinit; - &chap.mac; - &chap.vm; - &chap.dma; - &chap.kerneldebug; - - <chapter id="ufs"> - <title>* UFS</title> - - <para>UFS, FFS, Ext2FS, JFS, inodes, buffer cache, labeling, - locking, metadata, soft-updates, LFS, portalfs, procfs, - vnodes, memory sharing, memory objects, TLBs, caching</para> - - </chapter> - - <chapter id="afs"> - <title>* AFS</title> - - <para>AFS, NFS, SANs, etc.</para> - - </chapter> - - <chapter id="syscons"> - <title>* Syscons</title> - - <para>Syscons, tty, PCVT, serial console, screen savers, - etc.</para> - - </chapter> - - <chapter id="compatibility"> - <title>* Compatibility Layers</title> - - <sect1 id="linux"> - <title>* Linux</title> - - <para>Linux, SVR4, etc.</para> - </sect1> - - </chapter> - </part> - - <part id="devicedrivers"> - <title>Device Drivers</title> - - &chap.driverbasics; - &chap.isa; - &chap.pci; - &chap.scsi; - &chap.usb; - &chap.newbus; - - &chap.snd; - - </part> - - <part id="architectures"> - <title>Architectures</title> - - &chap.x86; - - <chapter id="alpha"> - <title>* Alpha</title> - - <para>Talk about the architectural specifics of - FreeBSD/alpha.</para> - - <para>Explanation of alignment errors, how to fix, how to - ignore.</para> - - <para>Example assembly language code for FreeBSD/alpha.</para> - </chapter> - - <chapter id="ia64"> - <title>* IA-64</title> - - <para>Talk about the architectural specifics of - FreeBSD/ia64.</para> - - </chapter> - </part> - - <part id="appendices"> - <title>Appendices</title> - - <bibliography> - - <biblioentry id="COD" xreflabel="1"> - <authorgroup> - <author> - <firstname>Dave</firstname> - <othername role="MI">A</othername> - <surname>Patterson</surname> - </author> - <author> - <firstname>John</firstname> - <othername role="MI">L</othername> - <surname>Hennessy</surname> - </author> - </authorgroup> - <copyright><year>1998</year><holder>Morgan Kaufmann Publishers, - Inc.</holder></copyright> - <isbn>1-55860-428-6</isbn> - <publisher> - <publishername>Morgan Kaufmann Publishers, Inc.</publishername> - </publisher> - <title>Computer Organization and Design</title> - <subtitle>The Hardware / Software Interface</subtitle> - <pagenums>1-2</pagenums> - </biblioentry> - - <biblioentry xreflabel="2"> - <authorgroup> - <author> - <firstname>W.</firstname> - <othername role="Middle">Richard</othername> - <surname>Stevens</surname> - </author> - </authorgroup> - <copyright><year>1993</year><holder>Addison Wesley Longman, - Inc.</holder></copyright> - <isbn>0-201-56317-7</isbn> - <publisher> - <publishername>Addison Wesley Longman, Inc.</publishername> - </publisher> - <title>Advanced Programming in the Unix Environment</title> - <pagenums>1-2</pagenums> - </biblioentry> - - <biblioentry xreflabel="3"> - <authorgroup> - <author> - <firstname>Marshall</firstname> - <othername role="Middle">Kirk</othername> - <surname>McKusick</surname> - </author> - <author> - <firstname>Keith</firstname> - <surname>Bostic</surname> - </author> - <author> - <firstname>Michael</firstname> - <othername role="MI">J</othername> - <surname>Karels</surname> - </author> - <author> - <firstname>John</firstname> - <othername role="MI">S</othername> - <surname>Quarterman</surname> - </author> - </authorgroup> - <copyright><year>1996</year><holder>Addison-Wesley Publishing Company, - Inc.</holder></copyright> - <isbn>0-201-54979-4</isbn> - <publisher> - <publishername>Addison-Wesley Publishing Company, Inc.</publishername> - </publisher> - <title>The Design and Implementation of the 4.4 BSD Operating System</title> - <pagenums>1-2</pagenums> - </biblioentry> - - <biblioentry id="Phrack" xreflabel="4"> - <authorgroup> - <author> - <firstname>Aleph</firstname> - <surname>One</surname> - </author> - </authorgroup> - <title>Phrack 49; "Smashing the Stack for Fun and Profit"</title> - </biblioentry> - - <biblioentry id="StackGuard" xreflabel="5"> - <authorgroup> - <author> - <firstname>Chrispin</firstname> - <surname>Cowan</surname> - </author> - <author> - <firstname>Calton</firstname> - <surname>Pu</surname> - </author> - <author> - <firstname>Dave</firstname> - <surname>Maier</surname> - </author> - </authorgroup> - <title>StackGuard; Automatic Adaptive Detection and Prevention of - Buffer-Overflow Attacks</title> - </biblioentry> - - <biblioentry id="OpenBSD" xreflabel="6"> - <authorgroup> - <author> - <firstname>Todd</firstname> - <surname>Miller</surname> - </author> - <author> - <firstname>Theo</firstname> - <surname>de Raadt</surname> - </author> - </authorgroup> - <title>strlcpy and strlcat -- consistent, safe string copy and - concatenation.</title> - </biblioentry> - - </bibliography> - - <![ %chap.index; [ &chap.index; ]]> - </part> - -</book> diff --git a/en_US.ISO8859-1/books/arch-handbook/boot/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/boot/chapter.sgml deleted file mode 100644 index 4fbb435473..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/boot/chapter.sgml +++ /dev/null @@ -1,1023 +0,0 @@ -<!-- -The FreeBSD Documentation Project - -Copyright (c) 2002 Sergey Lyubka <devnull@uptsoft.com> -All rights reserved -$FreeBSD$ ---> - -<chapter id="boot"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Sergey</firstname> - <surname>Lyubka</surname> - <contrib>Contributed by </contrib> - </author> <!-- devnull@uptsoft.com 12 Jun 2002 --> - </authorgroup> - </chapterinfo> - <title>Bootstrapping and kernel initialization</title> - - <sect1> - <title>Synopsis</title> - - <para>This chapter is an overview of the boot and system - initialization process, starting from the BIOS (firmware) POST, - to the first user process creation. Since the initial steps of - system startup are very architecture dependent, the IA-32 - architecture is used as an example.</para> - </sect1> - - <sect1> - <title>Overview</title> - - <para>A computer running FreeBSD can boot by several methods, - although the most common method, booting from a harddisk where - the OS is installed, will be discussed here. The boot process - is divided into several steps:</para> - - <itemizedlist> - <listitem><para>BIOS POST</para></listitem> - <listitem><para><literal>boot0</literal> stage</para></listitem> - <listitem><para><literal>boot2</literal> stage</para></listitem> - <listitem><para>loader stage</para></listitem> - <listitem><para>kernel initialization</para></listitem> - </itemizedlist> - - <para>The <literal>boot0</literal> and <literal>boot2</literal> - stages are also referred to as <emphasis>bootstrap stages 1 and - 2</emphasis> in &man.boot.8; as the first steps in FreeBSD's - 3-stage bootstrapping procedure. Various information is printed - on the screen at each stage, so you may visually recognize them - using the table that follows. Please note that the actual data - may differ from machine to machine:</para> - - <informaltable> - <tgroup cols="2"> - <tbody> - <row> - <entry><para>may vary</para></entry> - - <entry><para>BIOS (firmware) messages</para></entry> - </row> - - <row> - <entry><para> -<screen>F1 FreeBSD -F2 BSD -F5 Disk 2</screen> - </para></entry> - - <entry><para><literal>boot0</literal></para></entry> - </row> - - <row> - <entry><para> -<screen>>>FreeBSD/i386 BOOT -Default: 1:ad(1,a)/boot/loader -boot:</screen> - </para></entry> - - <entry><para><literal>boot2</literal><footnote><para>This - prompt will appear if the user presses a key just after - selecting an OS to boot at the <literal>boot0</literal> - stage.</para></footnote></para></entry> - </row> - - <row> - <entry><para> -<screen>BTX loader 1.0 BTX version is 1.01 -BIOS drive A: is disk0 -BIOS drive C: is disk1 -BIOS 639kB/64512kB available memory -FreeBSD/i386 bootstrap loader, Revision 0.8 -Console internal video/keyboard -(jkh@bento.freebsd.org, Mon Nov 20 11:41:23 GMT 2000) -/kernel text=0x1234 data=0x2345 syms=[0x4+0x3456] -Hit [Enter] to boot immediately, or any other key for command prompt -Booting [kernel] in 9 seconds..._</screen> - </para></entry> - - <entry><para>loader</para></entry> - </row> - - <row> - <entry><para> - <screen>Copyright (c) 1992-2002 The FreeBSD Project. -Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 - The Regents of the University of California. All rights reserved. -FreeBSD 4.6-RC #0: Sat May 4 22:49:02 GMT 2002 - devnull@kukas:/usr/obj/usr/src/sys/DEVNULL -Timecounter "i8254" frequency 1193182 Hz</screen></para></entry> - - <entry><para>kernel</para></entry> - </row> - </tbody> - </tgroup> - </informaltable> - </sect1> - - <sect1> - <title>BIOS POST</title> - - <para>When the PC powers on, the processor's registers are set - to some predefined values. One of the registers is the - <emphasis>instruction pointer</emphasis> register, and its value - after a power on is well defined: it is a 32-bit value of - 0xffffff00. The instruction pointer register points to code to - be executed by the processor. One of the registers is the - <literal>cr1</literal> 32-bit control register, and its value - just after the reboot is 0. One of the cr1's bits, the bit PE - (Protected Enabled) indicates whether the processor is running - in protected or real mode. Since at boot time this bit is - cleared, the processor boots in real mode. Real mode means, - among other things, that linear and physical addresses are - identical.</para> - - <para>The value of 0xffffff00 is slightly less then 4Gb, so unless - the machine has 4Gb physical memory, it cannot point to a valid - memory address. The computer's hardware translates this address - so that it points to a BIOS memory block.</para> - - <para>BIOS stands for <emphasis>Basic Input Output - System</emphasis>, and it is a chip on the motherboard that has - a relatively small amount of read-only memory (ROM). This - memory contains various low-level routines that are specific to - the hardware supplied with the motherboard. So, the processor - will first jump to the address 0xffffff00, which really resides - in the BIOS's memory. Usually this address contains a jump - instruction to the BIOS's POST routines.</para> - - <para>POST stands for <emphasis>Power On Self Test</emphasis>. - This is a set of routines including the memory check, system bus - check and other low-level stuff so that the CPU can initialize - the computer properly. The important step on this stage is - determining the boot device. All modern BIOS's allow the boot - device to be set manually, so you can boot from a floppy, - CD-ROM, harddisk etc.</para> - - <para>The very last thing in the POST is the <literal>INT - 0x19</literal> instruction. That instruction reads 512 bytes - from the first sector of boot device into the memory at address - 0x7c00. The term <emphasis>first sector</emphasis> originates - from harddrive architecture, where the magnetic plate is divided - to a number of cylindrical tracks. Tracks are numbered, and - every track is divided by a number (usually 64) sectors. Track - number 0 is the outermost on the magnetic plate, and sector 1, - the first sector (tracks, or, cylinders, are numbered starting - from 0, but sectors - starting from 1), has a special meaning. - It is also called Master Boot Record, or MBR. The remaining - sectors on the first track are never used <footnote><para>Some - utilities such as &man.disklabel.8; may store the information in - this area, mostly in the second - sector.</para></footnote>.</para> - </sect1> - - <sect1> - <title><literal>boot0</literal> stage</title> - - <para>Take a look at the file <filename>/boot/boot0</filename>. - This is a small 512-byte file, and it is exactly what FreeBSD's - installation procedure wrote to your harddisk's MBR if you chose - the <quote>bootmanager</quote> option at installation time.</para> - - <para>As mentioned previously, the <literal>INT 0x19</literal> - instruction loads an MBR, i.e. the <filename>boot0</filename> - content, into the memory at address 0x7c00. Taking a look at - the file <filename>sys/boot/i386/boot0/boot0.s</filename> can - give a guess at what is happening there - this is the boot - manager, which is an awesome piece of code written by Robert - Nordier.</para> - - <para>The MBR, or, <filename>boot0</filename>, has a special - structure starting from offset 0x1be, called the - <emphasis>partition table</emphasis>. It has 4 records of 16 - bytes each, called <emphasis>partition records</emphasis>, which - represent how the harddisk(s) are partitioned, or, in FreeBSD's - terminology, sliced. One byte of those 16 says whether a - partition (slice) is bootable or not. Exactly one record must - have that flag set, otherwise <filename>boot0</filename>'s code - will refuse to proceed.</para> - - <para>A partition record has the following fields:</para> - - <itemizedlist> - <listitem> - <para>the 1-byte filesystem type</para> - </listitem> - - <listitem> - <para>the 1-byte bootable flag</para> - </listitem> - - <listitem> - <para>the 6 byte descriptor in CHS format</para> - </listitem> - - <listitem> - <para>the 8 byte descriptor in LBA format</para> - </listitem> - </itemizedlist> - - <para>A partition record descriptor has the information about - where exactly the partition resides on the drive. Both - descriptors, LBA and CHS, describe the same information, but in - different ways: LBA (Logical Block Addressing) has the starting - sector for the partition and the partition's length, while CHS - (Cylinder Head Sector) has coordinates for the first and last - sectors of the partition.</para> - - <para>The boot manager scans the partition table and prints the - menu on the screen so the user can select what disk and what - slice to boot. By pressing an appropriate key, - <filename>boot0</filename> performs the following - actions:</para> - - <itemizedlist> - <listitem> - <para>modifies the bootable flag for the selected partition to - make it bootable, and clears the previous</para> - </listitem> - - <listitem> - <para>saves itself to disk to remember what partition (slice) - has been selected so to use it as the default on the next - boot</para> - </listitem> - - <listitem> - <para>loads the first sector of the selected partition (slice) - into memory and jumps there</para> - </listitem> - </itemizedlist> - - <para>What kind of data should reside on the very first sector of - a bootable partition (slice), in our case, a FreeBSD slice? As - you may have already guessed, it is - <filename>boot2</filename>.</para> - </sect1> - - <sect1> - <title><literal>boot2</literal> stage</title> - - <para>You might wonder, why <literal>boot2</literal> comes after - <literal>boot0</literal>, and not boot1. Actually, there is a - 512-byte file called <filename>boot1</filename> in the directory - <filename>/boot</filename> as well. It is used for booting from - a floppy. When booting from a floppy, - <filename>boot1</filename> plays the same role as - <filename>boot0</filename> for a harddisk: it locates - <filename>boot2</filename> and runs it.</para> - - <para>You may have realized that a file - <filename>/boot/mbr</filename> exists as well. It is a - simplified version of <filename>boot0</filename>. The code in - <filename>mbr</filename> does not provide a menu for the user, - it just blindly boots the partition marked active.</para> - - <para>The code implementing <filename>boot2</filename> resides in - <filename>sys/boot/i386/boot2/</filename>, and the executable - itself is in <filename>/boot</filename>. The files - <filename>boot0</filename> and <filename>boot2</filename> that - are in <filename>/boot</filename> are not used by the bootstrap, - but by utilities such as <application>boot0cfg</application>. - The actual position for <filename>boot0</filename> is in the - MBR. For <filename>boot2</filename> it is the beginning of a - bootable FreeBSD slice. These locations are not under the - filesystem's control, so they are invisible to commands like - <application>ls</application>.</para> - - <para>The main task for <literal>boot2</literal> is to load the - file <filename>/boot/loader</filename>, which is the third stage - in the bootstrapping procedure. The code in - <literal>boot2</literal> cannot use any services like - <function>open()</function> and <function>read()</function>, - since the kernel is not yet loaded. It must scan the harddisk, - knowing about the filesystem structure, find the file - <filename>/boot/loader</filename>, read it into memory using a - BIOS service, and then pass the execution to the loader's entry - point.</para> - - <para>Besides that, <literal>boot2</literal> prompts for user - input so the loader can be booted from different disk, unit, - slice and partition.</para> - - <para>The <literal>boot2</literal> binary is created in special - way:</para> - - <programlisting><filename>sys/boot/i386/boot2/Makefile</filename> -boot2: boot2.ldr boot2.bin ${BTX}/btx/btx - btxld -v -E ${ORG2} -f bin -b ${BTX}/btx/btx -l boot2.ldr \ - -o boot2.ld -P 1 boot2.bin</programlisting> - - <para>This Makefile snippet shows that &man.btxld.8; is used to - link the binary. BTX, which stands for BooT eXtender, is a - piece of code that provides a protected mode environment for the - program, called the client, that it is linked with. So - <literal>boot2</literal> is a BTX client, i.e. it uses the - service provided by BTX.</para> - - <para>The <application>btxld</application> utility is the linker. - It links two binaries together. The difference between - &man.btxld.8; and &man.ld.1; is that - <application>ld</application> usually links object files into a - shared object or executable, while - <application>btxld</application> links an object file with the - BTX, producing the binary file suitable to be put on the - beginning of the partition for the system boot.</para> - - <para><literal>boot0</literal> passes the execution to BTX's entry - point. BTX then switches the processor to protected mode, and - prepares a simple environment before calling the client. This - includes:</para> - - <itemizedlist> - <listitem><para>virtual v86 mode. That means, the BTX is a v86 - monitor. Real mode instructions like posh, popf, cli, sti, if - called by the client, will work.</para></listitem> - - <listitem><para>Interrupt Descriptor Table (IDT) is set up so - all hardware interrupts are routed to the default BIOS's - handlers, and interrupt 0x30 is set up to be the syscall - gate.</para></listitem> - - <listitem><para>Two system calls: <function>exec</function> and - <function>exit</function>, are defined:</para> - - <programlisting><filename>sys/boot/i386/btx/lib/btxsys.s:</filename> - .set INT_SYS,0x30 # Interrupt number -# -# System call: exit -# -__exit: xorl %eax,%eax # BTX system - int $INT_SYS # call 0x0 -# -# System call: exec -# -__exec: movl $0x1,%eax # BTX system - int $INT_SYS # call 0x1</programlisting></listitem> - </itemizedlist> - - <para>BTX creates a Global Descriptor Table (GDT):</para> - - <programlisting><filename>sys/boot/i386/btx/btx/btx.s:</filename> -gdt: .word 0x0,0x0,0x0,0x0 # Null entry - .word 0xffff,0x0,0x9a00,0xcf # SEL_SCODE - .word 0xffff,0x0,0x9200,0xcf # SEL_SDATA - .word 0xffff,0x0,0x9a00,0x0 # SEL_RCODE - .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA - .word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE - .word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA - .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS</programlisting> - - <para>The client's code and data start from address MEM_USR - (0xa000), and a selector (SEL_UCODE) points to the client's code - segment. The SEL_UCODE descriptor has Descriptor Privilege - Level (DPL) 3, which is the lowest privilege level. But the - <literal>INT 0x30</literal> instruction handler resides in a - segment pointed to by the SEL_SCODE (supervisor code) selector, - as shown from the code that creates an IDT:</para> - - <programlisting> mov $SEL_SCODE,%dh # Segment selector -init.2: shr %bx # Handle this int? - jnc init.3 # No - mov %ax,(%di) # Set handler offset - mov %dh,0x2(%di) # and selector - mov %dl,0x5(%di) # Set P:DPL:type - add $0x4,%ax # Next handler</programlisting> - - <para>So, when the client calls <function>__exec()</function>, the - code will be executed with the highest privileges. This allows - the kernel to change the protected mode data structures, such as - page tables, GDT, IDT, etc later, if needed.</para> - - <para><literal>boot2</literal> defines an important structure, - <literal>struct bootinfo</literal>. This structure is - initialized by <literal>boot2</literal> and passed to the - loader, and then further to the kernel. Some nodes of this - structures are set by <literal>boot2</literal>, the rest by the - loader. This structure, among other information, contains the - kernel filename, BIOS harddisk geometry, BIOS drive number for - boot device, physical memory available, <literal>envp</literal> - pointer etc. The definition for it is:</para> - - <programlisting><filename>/usr/include/machine/bootinfo.h</filename> -struct bootinfo { - u_int32_t bi_version; - u_int32_t bi_kernelname; /* represents a char * */ - u_int32_t bi_nfs_diskless; /* struct nfs_diskless * */ - /* End of fields that are always present. */ -#define bi_endcommon bi_n_bios_used - u_int32_t bi_n_bios_used; - u_int32_t bi_bios_geom[N_BIOS_GEOM]; - u_int32_t bi_size; - u_int8_t bi_memsizes_valid; - u_int8_t bi_bios_dev; /* bootdev BIOS unit number */ - u_int8_t bi_pad[2]; - u_int32_t bi_basemem; - u_int32_t bi_extmem; - u_int32_t bi_symtab; /* struct symtab * */ - u_int32_t bi_esymtab; /* struct symtab * */ - /* Items below only from advanced bootloader */ - u_int32_t bi_kernend; /* end of kernel space */ - u_int32_t bi_envp; /* environment */ - u_int32_t bi_modulep; /* preloaded modules */ -};</programlisting> - - <para><literal>boot2</literal> enters into an infinite loop waiting - for user input, then calls <function>load()</function>. If the - user does not press anything, the loop brakes by a timeout, so - <function>load()</function> will load the default file - (<filename>/boot/loader</filename>). Functions <function>ino_t - lookup(char *filename)</function> and <function>int xfsread(ino_t - inode, void *buf, size_t nbyte)</function> are used to read the - content of a file into memory. <filename>/boot/loader</filename> - is an ELF binary, but where the ELF header is prepended with - a.out's <literal>struct exec</literal> structure. - <function>load()</function> scans the loader's ELF header, loading - the content of <filename>/boot/loader</filename> into memory, and - passing the execution to the loader's entry:</para> - - <programlisting><filename>sys/boot/i386/boot2/boot2.c:</filename> - __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK), - MAKEBOOTDEV(dev_maj[dsk.type], 0, dsk.slice, dsk.unit, dsk.part), - 0, 0, 0, VTOP(&bootinfo));</programlisting> - </sect1> - - <sect1> - <title><application>loader</application> stage</title> - - <para><application>loader</application> is a BTX client as well. - I will not describe it here in detail, there is a comprehensive - manpage written by Mike Smith, &man.loader.8;. The underlying - mechanisms and BTX were discussed above.</para> - - <para>The main task for the loader is to boot the kernel. When - the kernel is loaded into memory, it is being called by the - loader:</para> - - <programlisting><filename>sys/boot/common/boot.c:</filename> - /* Call the exec handler from the loader matching the kernel */ - module_formats[km->m_loader]->l_exec(km);</programlisting> - </sect1> - - <sect1> - <title>Kernel initialization</title> - - <para>To where exactly is the execution passed by the loader, - i.e. what is the kernel's actual entry point. Let us take a - look at the command that links the kernel:</para> - - <programlisting><filename>sys/conf/Makefile.i386:</filename> -ld -elf -Bdynamic -T /usr/src/sys/conf/ldscript.i386 -export-dynamic \ --dynamic-linker /red/herring -o kernel -X locore.o \ -<lots of kernel .o files></programlisting> - - <para>A few interesting things can be seen in this line. First, - the kernel is an ELF dynamically linked binary, but the dynamic - linker for kernel is <filename>/red/herring</filename>, which is - definitely a bogus file. Second, taking a look at the file - <filename>sys/conf/ldscript.i386</filename> gives an idea about - what <application>ld</application> options are used when - compiling a kernel. Reading through the first few lines, the - string</para> - - <programlisting><filename>sys/conf/ldscript.i386:</filename> -ENTRY(btext)</programlisting> - - <para>says that a kernel's entry point is the symbol `btext'. - This symbol is defined in <filename>locore.s</filename>:</para> - - <programlisting><filename>sys/i386/i386/locore.s:</filename> - .text -/********************************************************************** - * - * This is where the bootblocks start us, set the ball rolling... - * - */ -NON_GPROF_ENTRY(btext)</programlisting> - - <para>First what is done is the register EFLAGS is set to a - predefined value of 0x00000002, and then all the segment - registers are initialized:</para> - - <programlisting><filename>sys/i386/i386/locore.s</filename> -/* Don't trust what the BIOS gives for eflags. */ - pushl $PSL_KERNEL - popfl - -/* - * Don't trust what the BIOS gives for %fs and %gs. Trust the bootstrap - * to set %cs, %ds, %es and %ss. - */ - mov %ds, %ax - mov %ax, %fs - mov %ax, %gs</programlisting> - - <para>btext calls the routines - <function>recover_bootinfo()</function>, - <function>identify_cpu()</function>, - <function>create_pagetables()</function>, which are also defined - in <filename>locore.s</filename>. Here is a description of what - they do:</para> - - <informaltable> - <tgroup cols=2 align=left> - <tbody> - <row> - <entry><function>recover_bootinfo</function></entry> - - <entry>This routine parses the parameters to the kernel - passed from the bootstrap. The kernel may have been - booted in 3 ways: by the loader, described above, by the - old disk boot blocks, and by the old diskless boot - procedure. This function determines the booting method, - and stores the <literal>struct bootinfo</literal> - structure into the kernel memory.</entry> - </row> - - <row> - <entry><function>identify_cpu</function></entry> - - <entry>This functions tries to find out what CPU it is - running on, storing the value found in a variable - <varname>_cpu</varname>.</entry> - </row> - - <row> - <entry><function>create_pagetables</function></entry> - - <entry>This function allocates and fills out a Page Table - Directory at the top of the kernel memory area.</entry> - </row> - </tgroup> - </informaltable> - - <para>The next steps are enabling VME, if the CPU supports - it:</para> - - <programlisting> testl $CPUID_VME, R(_cpu_feature) - jz 1f - movl %cr4, %eax - orl $CR4_VME, %eax - movl %eax, %cr4</programlisting> - - <para>Then, enabling paging:</para> - <programlisting>/* Now enable paging */ - movl R(_IdlePTD), %eax - movl %eax,%cr3 /* load ptd addr into mmu */ - movl %cr0,%eax /* get control word */ - orl $CR0_PE|CR0_PG,%eax /* enable paging */ - movl %eax,%cr0 /* and let's page NOW! */</programlisting> - - <para>The next three lines of code are because the paging was set, - so the jump is needed to continue the execution in virtualized - address space:</para> - - <programlisting> pushl $begin /* jump to high virtualized address */ - ret - -/* now running relocated at KERNBASE where the system is linked to run */ -begin:</programlisting> - - <para>The function <function>init386()</function> is called, with - a pointer to the first free physical page, after that - <function>mi_startup()</function>. <function>init386</function> - is an architecture dependent initialization function, and - <function>mi_startup()</function> is an architecture independent - one (the 'mi_' prefix stands for Machine Independent). The - kernel never returns from <function>mi_startup()</function>, and - by calling it, the kernel finishes booting:</para> - - <programlisting><filename>sys/i386/i386/locore.s:</filename> - movl physfree, %esi - pushl %esi /* value of first for init386(first) */ - call _init386 /* wire 386 chip for unix operation */ - call _mi_startup /* autoconfiguration, mountroot etc */ - hlt /* never returns to here */</programlisting> - - <sect2> - <title><function>init386()</function></title> - - <para><function>init386()</function> is defined in - <filename>sys/i386/i386/machdep.c</filename> and performs - low-level initialization, specific to the i386 chip. The - switch to protected mode was performed by the loader. The - loader has created the very first task, in which the kernel - continues to operate. Before running straight away to the - code, I will enumerate the tasks the processor must complete - to initialize protected mode execution:</para> - - <itemizedlist> - <listitem> - <para>Initialize the kernel tunable parameters, passed from - the bootstrapping program.</para> - </listitem> - - <listitem> - <para>Prepare the GDT.</para> - </listitem> - - <listitem> - <para>Prepare the IDT.</para> - </listitem> - - <listitem> - <para>Initialize the system console.</para> - </listitem> - - <listitem> - <para>Initialize the DDB, if it is compiled into - kernel.</para> - </listitem> - - <listitem> - <para>Initialize the TSS.</para> - </listitem> - - <listitem> - <para>Prepare the LDT.</para> - </listitem> - - <listitem> - <para>Setup proc0's pcb.</para> - </listitem> - </itemizedlist> - - <para>What <function>init386()</function> first does is - initialize the tunable parameters passed from bootstrap. This - is done by setting the environment pointer (envp) and calling - <function>init_param1()</function>. The envp pointer has been - passed from loader in the <literal>bootinfo</literal> - structure:</para> - - <programlisting><filename>sys/i386/i386/machdep.c:</filename> - kern_envp = (caddr_t)bootinfo.bi_envp + KERNBASE; - - /* Init basic tunables, hz etc */ - init_param1();</programlisting> - - <para><function>init_param1()</function> is defined in - <filename>sys/kern/subr_param.c</filename>. That file has a - number of sysctls, and two functions, - <function>init_param1()</function> and - <function>init_param2()</function>, that are called from - <function>init386()</function>:</para> - - <programlisting><filename>sys/kern/subr_param.c</filename> - hz = HZ; - TUNABLE_INT_FETCH("kern.hz", &hz);</programlisting> - - <para>TUNABLE_<typename>_FETCH is used to fetch the value - from the environment:</para> - - <programlisting><filename>/usr/src/sys/sys/kernel.h</filename> -#define TUNABLE_INT_FETCH(path, var) getenv_int((path), (var)) -</programlisting> - - <para>Sysctl <literal>kern.hz</literal> is the system clock tick. Along with - this, the following sysctls are set by - <function>init_param1()</function>: <literal>kern.maxswzone, - kern.maxbcache, kern.maxtsiz, kern.dfldsiz, kern.dflssiz, - kern.maxssiz, kern.sgrowsiz</literal>.</para> - - <para>Then <function>init386()</function> prepares the Global - Descriptors Table (GDT). Every task on an x86 is running in - its own virtual address space, and this space is addressed by - a segment:offset pair. Say, for instance, the current - instruction to be executed by the processor lies at CS:EIP, - then the linear virtual address for that instruction would be - <quote>the virtual address of code segment CS</quote> + EIP. For - convenience, segments begin at virtual address 0 and end at a - 4Gb boundary. Therefore, the instruction's linear virtual - address for this example would just be the value of EIP. - Segment registers such as CS, DS etc are the selectors, - i.e. indexes, into GDT (to be more precise, an index is not a - selector itself, but the INDEX field of a selector). - FreeBSD's GDT holds descriptors for 15 selectors per - CPU:</para> - - <programlisting><filename>sys/i386/i386/machdep.c:</filename> -union descriptor gdt[NGDT * MAXCPU]; /* global descriptor table */ - -<filename>sys/i386/include/segments.h:</filename> -/* - * Entries in the Global Descriptor Table (GDT) - */ -#define GNULL_SEL 0 /* Null Descriptor */ -#define GCODE_SEL 1 /* Kernel Code Descriptor */ -#define GDATA_SEL 2 /* Kernel Data Descriptor */ -#define GPRIV_SEL 3 /* SMP Per-Processor Private Data */ -#define GPROC0_SEL 4 /* Task state process slot zero and up */ -#define GLDT_SEL 5 /* LDT - eventually one per process */ -#define GUSERLDT_SEL 6 /* User LDT */ -#define GTGATE_SEL 7 /* Process task switch gate */ -#define GBIOSLOWMEM_SEL 8 /* BIOS low memory access (must be entry 8) */ -#define GPANIC_SEL 9 /* Task state to consider panic from */ -#define GBIOSCODE32_SEL 10 /* BIOS interface (32bit Code) */ -#define GBIOSCODE16_SEL 11 /* BIOS interface (16bit Code) */ -#define GBIOSDATA_SEL 12 /* BIOS interface (Data) */ -#define GBIOSUTIL_SEL 13 /* BIOS interface (Utility) */ -#define GBIOSARGS_SEL 14 /* BIOS interface (Arguments) */</programlisting> - - <para>Note that those #defines are not selectors themselves, but - just a field INDEX of a selector, so they are exactly the - indices of the GDT. for example, an actual selector for the - kernel code (GCODE_SEL) has the value 0x08.</para> - - <para>The next step is to initialize the Interrupt Descriptor - Table (IDT). This table is to be referenced by the processor - when a software or hardware interrupt occurs. For example, to - make a system call, user application issues the <literal>INT - 0x80</literal> instruction. This is a software interrupt, so - the processor's hardware looks up a record with index 0x80 in - the IDT. This record points to the routine that handles this - interrupt, in this particular case, this will be the kernel's - syscall gate. The IDT may have a maximum of 256 (0x100) - records. The kernel allocates NIDT records for the IDT, where - NIDT is the maximum (256):</para> - - <programlisting><filename>sys/i386/i386/machdep.c:</filename> -static struct gate_descriptor idt0[NIDT]; -struct gate_descriptor *idt = &idt0[0]; /* interrupt descriptor table */ -</programlisting> - - <para>For each interrupt, an appropriate handler is set. The - syscall gate for <literal>INT 0x80</literal> is set as - well:</para> - - <programlisting><filename>sys/i386/i386/machdep.c:</filename> - setidt(0x80, &IDTVEC(int0x80_syscall), - SDT_SYS386TGT, SEL_UPL, GSEL(GCODE_SEL, SEL_KPL));</programlisting> - - <para>So when a userland application issues the <literal>INT - 0x80</literal> instruction, control will transfer to the - function <function>_Xint0x80_syscall</function>, which is in - the kernel code segment and will be executed with supervisor - privileges.</para> - - <para>Console and DDB are then initialized:</para> - - <programlisting><filename>sys/i386/i386/machdep.c:</filename> - cninit(); -/* skipped */ -#ifdef DDB - kdb_init(); - if (boothowto & RB_KDB) - Debugger("Boot flags requested debugger"); -#endif</programlisting> - - <para>The Task State Segment is another x86 protected mode - structure, the TSS is used by the hardware to store task - information when a task switch occurs.</para> - - <para>The Local Descriptors Table is used to reference userland - code and data. Several selectors are defined to point to the - LDT, they are the system call gates and the user code and data - selectors:</para> - - <programlisting><filename>/usr/include/machine/segments.h</filename> -#define LSYS5CALLS_SEL 0 /* forced by intel BCS */ -#define LSYS5SIGR_SEL 1 -#define L43BSDCALLS_SEL 2 /* notyet */ -#define LUCODE_SEL 3 -#define LSOL26CALLS_SEL 4 /* Solaris >= 2.6 system call gate */ -#define LUDATA_SEL 5 -/* separate stack, es,fs,gs sels ? */ -/* #define LPOSIXCALLS_SEL 5*/ /* notyet */ -#define LBSDICALLS_SEL 16 /* BSDI system call gate */ -#define NLDT (LBSDICALLS_SEL + 1) -</programlisting> - - <para>Next, proc0's Process Control Block (<literal>struct - pcb</literal>) structure is initialized. proc0 is a - <literal>struct proc</literal> structure that describes a kernel - process. It is always present while the kernel is running, - therefore it is declared as global:</para> - - <programlisting><filename>sys/kern/kern_init.c:</filename> - struct proc proc0;</programlisting> - - <para>The structure <literal>struct pcb</literal> is a part of a - proc structure. It is defined in - <filename>/usr/include/machine/pcb.h</filename> and has a - process's information specific to the i386 architecture, such as - registers values.</para> - </sect2> - - <sect2> - <title><function>mi_startup()</function></title> - - <para>This function performs a bubble sort of all the system - initialization objects and then calls the entry of each object - one by one:</para> - - <programlisting><filename>sys/kern/init_main.c:</filename> - for (sipp = sysinit; *sipp; sipp++) { - - /* ... skipped ... */ - - /* Call function */ - (*((*sipp)->func))((*sipp)->udata); - /* ... skipped ... */ - }</programlisting> - - <para>Although the sysinit framework is described in the - Developers' Handbook, I will discuss the internals of it.</para> - - <para>Every system initialization object (sysinit object) is - created by calling a SYSINIT() macro. Let us take as example an - <literal>announce</literal> sysinit object. This object prints - the copyright message:</para> - - <programlisting><filename>sys/kern/init_main.c:</filename> -static void -print_caddr_t(void *data __unused) -{ - printf("%s", (char *)data); -} -SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright)</programlisting> - - <para>The subsystem ID for this object is SI_SUB_COPYRIGHT - (0x0800001), which comes right after the SI_SUB_CONSOLE - (0x0800000). So, the copyright message will be printed out - first, just after the console initialization.</para> - - <para>Let us take a look at what exactly the macro - <literal>SYSINIT()</literal> does. It expands to a - <literal>C_SYSINIT()</literal> macro. The - <literal>C_SYSINIT()</literal> macro then expands to a static - <literal>struct sysinit</literal> structure declaration with - another <literal>DATA_SET</literal> macro call:</para> - <programlisting><filename>/usr/include/sys/kernel.h:</filename> - #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \ - static struct sysinit uniquifier ## _sys_init = { \ subsystem, \ - order, \ func, \ ident \ }; \ DATA_SET(sysinit_set,uniquifier ## - _sys_init); - -#define SYSINIT(uniquifier, subsystem, order, func, ident) \ - C_SYSINIT(uniquifier, subsystem, order, \ - (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)ident)</programlisting> - - <para>The <literal>DATA_SET()</literal> macro expands to a - <literal>MAKE_SET()</literal>, and that macro is the point where - the all sysinit magic is hidden:</para> - - <programlisting><filename>/usr/include/linker_set.h</filename> -#define MAKE_SET(set, sym) \ - static void const * const __set_##set##_sym_##sym = &sym; \ - __asm(".section .set." #set ",\"aw\""); \ - __asm(".long " #sym); \ - __asm(".previous") -#endif -#define TEXT_SET(set, sym) MAKE_SET(set, sym) -#define DATA_SET(set, sym) MAKE_SET(set, sym)</programlisting> - - <para>In our case, the following declaration will occur:</para> - - <programlisting>static struct sysinit announce_sys_init = { - SI_SUB_COPYRIGHT, - SI_ORDER_FIRST, - (sysinit_cfunc_t)(sysinit_nfunc_t) print_caddr_t, - (void *) copyright -}; - -static void const *const __set_sysinit_set_sym_announce_sys_init = - &announce_sys_init; -__asm(".section .set.sysinit_set" ",\"aw\""); -__asm(".long " "announce_sys_init"); -__asm(".previous");</programlisting> - - <para>The first <literal>__asm</literal> instruction will create - an ELF section within the kernel's executable. This will happen - at kernel link time. The section will have the name - <literal>.set.sysinit_set</literal>. The content of this section is one 32-bit - value, the address of announce_sys_init structure, and that is - what the second <literal>__asm</literal> is. The third - <literal>__asm</literal> instruction marks the end of a section. - If a directive with the same section name occured before, the - content, i.e. the 32-bit value, will be appended to the existing - section, so forming an array of 32-bit pointers.</para> - - <para>Running <application>objdump</application> on a kernel - binary, you may notice the presence of such small - sections:</para> - - <screen>&prompt.user; <userinput>objdump -h /kernel</userinput> - 7 .set.cons_set 00000014 c03164c0 c03164c0 002154c0 2**2 - CONTENTS, ALLOC, LOAD, DATA - 8 .set.kbddriver_set 00000010 c03164d4 c03164d4 002154d4 2**2 - CONTENTS, ALLOC, LOAD, DATA - 9 .set.scrndr_set 00000024 c03164e4 c03164e4 002154e4 2**2 - CONTENTS, ALLOC, LOAD, DATA - 10 .set.scterm_set 0000000c c0316508 c0316508 00215508 2**2 - CONTENTS, ALLOC, LOAD, DATA - 11 .set.sysctl_set 0000097c c0316514 c0316514 00215514 2**2 - CONTENTS, ALLOC, LOAD, DATA - 12 .set.sysinit_set 00000664 c0316e90 c0316e90 00215e90 2**2 - CONTENTS, ALLOC, LOAD, DATA</screen> - - <para>This screen dump shows that the size of .set.sysinit_set - section is 0x664 bytes, so <literal>0x664/sizeof(void - *)</literal> sysinit objects are compiled into the kernel. The - other sections such as <literal>.set.sysctl_set</literal> - represent other linker sets.</para> - - <para>By defining a variable of type <literal>struct - linker_set</literal> the content of - <literal>.set.sysinit_set</literal> section will be <quote>collected</quote> - into that variable:</para> - <programlisting><filename>sys/kern/init_main.c:</filename> - extern struct linker_set sysinit_set; /* XXX */</programlisting> - - <para>The <literal>struct linker_set</literal> is defined as - follows:</para> - - <programlisting><filename>/usr/include/linker_set.h:</filename> - struct linker_set { - int ls_length; - void *ls_items[1]; /* really ls_length of them, trailing NULL */ -};</programlisting> - - <para>The first node will be equal to the number of a sysinit - objects, and the second node will be a NULL-terminated array of - pointers to them.</para> - - <para>Returning to the <function>mi_startup()</function> - discussion, it is must be clear now, how the sysinit objects are - being organized. The <function>mi_startup()</function> function - sorts them and calls each. The very last object is the system - scheduler:</para> - - <programlisting><filename>/usr/include/sys/kernel.h:</filename> -enum sysinit_sub_id { - SI_SUB_DUMMY = 0x0000000, /* not executed; for linker*/ - SI_SUB_DONE = 0x0000001, /* processed*/ - SI_SUB_CONSOLE = 0x0800000, /* console*/ - SI_SUB_COPYRIGHT = 0x0800001, /* first use of console*/ -... - SI_SUB_RUN_SCHEDULER = 0xfffffff /* scheduler: no return*/ -};</programlisting> - - <para>The system scheduler sysinit object is defined in the file - <filename>sys/vm/vm_glue.c</filename>, and the entry point for - that object is <function>scheduler()</function>. That function - is actually an infinite loop, and it represents a process with - PID 0, the swapper process. The proc0 structure, mentioned - before, is used to describe it.</para> - - <para>The first user process, called <emphasis>init</emphasis>, is - created by the sysinit object <literal>init</literal>:</para> - - <programlisting><filename>sys/kern/init_main.c:</filename> -static void -create_init(const void *udata __unused) -{ - int error; - int s; - - s = splhigh(); - error = fork1(&proc0, RFFDG | RFPROC, &initproc); - if (error) - panic("cannot fork init: %d\n", error); - initproc->p_flag |= P_INMEM | P_SYSTEM; - cpu_set_fork_handler(initproc, start_init, NULL); - remrunqueue(initproc); - splx(s); -} -SYSINIT(init,SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL)</programlisting> - - <para>The <function>create_init()</function> allocates a new process - by calling <function>fork1()</function>, but does not mark it - runnable. When this new process is scheduled for execution by the - scheduler, the <function>start_init()</function> will be called. - That function is defined in <filename>init_main.c</filename>. It - tries to load and exec the <filename>init</filename> binary, - probing <filename>/sbin/init</filename> first, then - <filename>/sbin/oinit</filename>, - <filename>/sbin/init.bak</filename>, and finally - <filename>/stand/sysinstall</filename>:</para> - - <programlisting><filename>sys/kern/init_main.c:</filename> -static char init_path[MAXPATHLEN] = -#ifdef INIT_PATH - __XSTRING(INIT_PATH); -#else - "/sbin/init:/sbin/oinit:/sbin/init.bak:/stand/sysinstall"; -#endif</programlisting> - - </sect2> -</sect1> - -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/chapters.ent b/en_US.ISO8859-1/books/arch-handbook/chapters.ent deleted file mode 100644 index 38db6f5f93..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/chapters.ent +++ /dev/null @@ -1,48 +0,0 @@ -<!-- - Creates entities for each chapter in the FreeBSD Developer's - Handbook. Each entity is named chap.foo, where foo is the value - of the id attribute on that chapter, and corresponds to the name of - the directory in which that chapter's .sgml file is stored. - - Chapters should be listed in the order in which they are referenced. - - $FreeBSD$ ---> - -<!-- Part one --> -<!ENTITY chap.introduction SYSTEM "introduction/chapter.sgml"> -<!ENTITY chap.tools SYSTEM "tools/chapter.sgml"> -<!ENTITY chap.secure SYSTEM "secure/chapter.sgml"> -<!ENTITY chap.l10n SYSTEM "l10n/chapter.sgml"> -<!ENTITY chap.policies SYSTEM "policies/chapter.sgml"> - -<!-- Part two - IPC --> -<!ENTITY chap.sockets SYSTEM "sockets/chapter.sgml"> -<!ENTITY chap.ipv6 SYSTEM "ipv6/chapter.sgml"> - -<!-- Part three - Kernel --> -<!ENTITY chap.boot SYSTEM "boot/chapter.sgml"> -<!ENTITY chap.kobj SYSTEM "kobj/chapter.sgml"> -<!ENTITY chap.sysinit SYSTEM "sysinit/chapter.sgml"> -<!ENTITY chap.locking SYSTEM "locking/chapter.sgml"> -<!ENTITY chap.vm SYSTEM "vm/chapter.sgml"> -<!ENTITY chap.dma SYSTEM "dma/chapter.sgml"> -<!ENTITY chap.kerneldebug SYSTEM "kerneldebug/chapter.sgml"> -<!ENTITY chap.jail SYSTEM "jail/chapter.sgml"> -<!ENTITY chap.mac SYSTEM "mac/chapter.sgml"> - -<!-- Part four - Device Drivers --> -<!ENTITY chap.driverbasics SYSTEM "driverbasics/chapter.sgml"> -<!ENTITY chap.isa SYSTEM "isa/chapter.sgml"> -<!ENTITY chap.pci SYSTEM "pci/chapter.sgml"> -<!ENTITY chap.scsi SYSTEM "scsi/chapter.sgml"> -<!ENTITY chap.usb SYSTEM "usb/chapter.sgml"> -<!ENTITY chap.newbus SYSTEM "newbus/chapter.sgml"> -<!ENTITY chap.snd SYSTEM "sound/chapter.sgml"> - -<!-- Part five - Architectures --> -<!ENTITY chap.x86 SYSTEM "x86/chapter.sgml"> - -<!-- Part six - Appendices --> -<!ENTITY chap.bibliography SYSTEM "bibliography/chapter.sgml"> -<!ENTITY chap.index SYSTEM "index.sgml"> diff --git a/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml deleted file mode 100644 index d24c06c5c4..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml +++ /dev/null @@ -1,390 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="driverbasics"> - <title>Writing FreeBSD Device Drivers</title> - - <para>This chapter was written by &a.murray; with selections from a - variety of sources including the intro(4) manual page by - &a.joerg;.</para> - - <sect1> - <title>Introduction</title> - <para>This chapter provides a brief introduction to writing device - drivers for FreeBSD. A device in this context is a term used - mostly for hardware-related stuff that belongs to the system, - like disks, printers, or a graphics display with its keyboard. - A device driver is the software component of the operating - system that controls a specific device. There are also - so-called pseudo-devices where a device driver emulates the - behavior of a device in software without any particular - underlying hardware. Device drivers can be compiled into the - system statically or loaded on demand through the dynamic kernel - linker facility `kld'.</para> - - <para>Most devices in a Unix-like operating system are accessed - through device-nodes, sometimes also called special files. - These files are usually located under the directory - <filename>/dev</filename> in the filesystem hierarchy. Until - devfs is fully integrated into FreeBSD, each device node must be - created statically and independent of the existence of the - associated device driver. Most device nodes on the system are - created by running <command>MAKEDEV</command>.</para> - - <para>Device drivers can roughly be broken down into two - categories; character and network device drivers.</para> - - </sect1> - - <sect1> - <title>Dynamic Kernel Linker Facility - KLD</title> - - <para>The kld interface allows system administrators to - dynamically add and remove functionality from a running system. - This allows device driver writers to load their new changes into - a running kernel without constantly rebooting to test - changes.</para> - - <para>The kld interface is used through the following - privileged commands: - - <itemizedlist> - <listitem><simpara><command>kldload</command> - loads a new kernel - module</simpara></listitem> - <listitem><simpara><command>kldunload</command> - unloads a kernel - module</simpara></listitem> - <listitem><simpara><command>kldstat</command> - lists the currently loaded - modules</simpara></listitem> - </itemizedlist> - </para> - - <para>Skeleton Layout of a kernel module</para> - -<programlisting>/* - * KLD Skeleton - * Inspired by Andrew Reiter's Daemonnews article - */ - -#include <sys/types.h> -#include <sys/module.h> -#include <sys/systm.h> /* uprintf */ -#include <sys/errno.h> -#include <sys/param.h> /* defines used in kernel.h */ -#include <sys/kernel.h> /* types used in module initialization */ - -/* - * Load handler that deals with the loading and unloading of a KLD. - */ - -static int -skel_loader(struct module *m, int what, void *arg) -{ - int err = 0; - - switch (what) { - case MOD_LOAD: /* kldload */ - uprintf("Skeleton KLD loaded.\n"); - break; - case MOD_UNLOAD: - uprintf("Skeleton KLD unloaded.\n"); - break; - default: - err = EINVAL; - break; - } - return(err); -} - -/* Declare this module to the rest of the kernel */ - -static moduledata_t skel_mod = { - "skel", - skel_loader, - NULL -}; - -DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);</programlisting> - - - <sect2> - <title>Makefile</title> - - <para>FreeBSD provides a makefile include that you can use to - quickly compile your kernel addition.</para> - - <programlisting>SRCS=skeleton.c -KMOD=skeleton - -.include <bsd.kmod.mk></programlisting> - - <para>Simply running <command>make</command> with this makefile - will create a file <filename>skeleton.ko</filename> that can - be loaded into your system by typing: -<screen>&prompt.root; <userinput>kldload -v ./skeleton.ko</userinput></screen> - </para> - </sect2> - </sect1> - - <sect1> - <title>Accessing a device driver</title> - - <para>Unix provides a common set of system calls for user - applications to use. The upper layers of the kernel dispatch - these calls to the corresponding device driver when a user - accesses a device node. The <command>/dev/MAKEDEV</command> - script makes most of the device nodes for your system but if you - are doing your own driver development it may be necessary to - create your own device nodes with <command>mknod</command>. - </para> - - <sect2> - <title>Creating static device nodes</title> - - <para>The <command>mknod</command> command requires four - arguments to create a device node. You must specify the name - of the device node, the type of device, the major number of - the device, and the minor number of the device.</para> - </sect2> - - <sect2> - <title>Dynamic device nodes</title> - - <para>The device filesystem, or devfs, provides access to the - kernel's device namespace in the global filesystem namespace. - This eliminates the problems of potentially having a device - driver without a static device node, or a device node without - an installed device driver. Devfs is still a work in - progress, but it is already working quite nicely.</para> - </sect2> - - </sect1> - - <sect1> - <title>Character Devices</title> - - <para>A character device driver is one that transfers data - directly to and from a user process. This is the most common - type of device driver and there are plenty of simple examples in - the source tree.</para> - - <para>This simple example pseudo-device remembers whatever values - you write to it and can then supply them back to you when you - read from it.</para> - - <programlisting>/* - * Simple `echo' pseudo-device KLD - * - * Murray Stokely - */ - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -#include <sys/types.h> -#include <sys/module.h> -#include <sys/systm.h> /* uprintf */ -#include <sys/errno.h> -#include <sys/param.h> /* defines used in kernel.h */ -#include <sys/kernel.h> /* types used in module initialization */ -#include <sys/conf.h> /* cdevsw struct */ -#include <sys/uio.h> /* uio struct */ -#include <sys/malloc.h> - -#define BUFFERSIZE 256 - -/* Function prototypes */ -d_open_t echo_open; -d_close_t echo_close; -d_read_t echo_read; -d_write_t echo_write; - -/* Character device entry points */ -static struct cdevsw echo_cdevsw = { - echo_open, - echo_close, - echo_read, - echo_write, - noioctl, - nopoll, - nommap, - nostrategy, - "echo", - 33, /* reserved for lkms - /usr/src/sys/conf/majors */ - nodump, - nopsize, - D_TTY, - -1 -}; - -typedef struct s_echo { - char msg[BUFFERSIZE]; - int len; -} t_echo; - -/* vars */ -static dev_t sdev; -static int len; -static int count; -static t_echo *echomsg; - -MALLOC_DECLARE(M_ECHOBUF); -MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module"); - -/* - * This function acts is called by the kld[un]load(2) system calls to - * determine what actions to take when a module is loaded or unloaded. - */ - -static int -echo_loader(struct module *m, int what, void *arg) -{ - int err = 0; - - switch (what) { - case MOD_LOAD: /* kldload */ - sdev = make_dev(<literal>&</literal>echo_cdevsw, - 0, - UID_ROOT, - GID_WHEEL, - 0600, - "echo"); - /* kmalloc memory for use by this driver */ - /* malloc(256,M_ECHOBUF,M_WAITOK); */ - MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK); - printf("Echo device loaded.\n"); - break; - case MOD_UNLOAD: - destroy_dev(sdev); - FREE(echomsg,M_ECHOBUF); - printf("Echo device unloaded.\n"); - break; - default: - err = EINVAL; - break; - } - return(err); -} - -int -echo_open(dev_t dev, int oflags, int devtype, struct proc *p) -{ - int err = 0; - - uprintf("Opened device \"echo\" successfully.\n"); - return(err); -} - -int -echo_close(dev_t dev, int fflag, int devtype, struct proc *p) -{ - uprintf("Closing device \"echo.\"\n"); - return(0); -} - -/* - * The read function just takes the buf that was saved via - * echo_write() and returns it to userland for accessing. - * uio(9) - */ - -int -echo_read(dev_t dev, struct uio *uio, int ioflag) -{ - int err = 0; - int amt; - - /* How big is this read operation? Either as big as the user wants, - or as big as the remaining data */ - amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ? echomsg->len - uio->uio_offset : 0); - if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) { - uprintf("uiomove failed!\n"); - } - - return err; -} - -/* - * echo_write takes in a character string and saves it - * to buf for later accessing. - */ - -int -echo_write(dev_t dev, struct uio *uio, int ioflag) -{ - int err = 0; - - /* Copy the string in from user memory to kernel memory */ - err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE)); - - /* Now we need to null terminate */ - *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0; - /* Record the length */ - echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE); - - if (err != 0) { - uprintf("Write failed: bad address!\n"); - } - - count++; - return(err); -} - -DEV_MODULE(echo,echo_loader,NULL);</programlisting> - - <para>To install this driver you will first need to make a node on - your filesystem with a command such as:</para> - - <screen>&prompt.root; <userinput>mknod /dev/echo c 33 0</userinput></screen> - - <para>With this driver loaded you should now be able to type - something like:</para> - - <screen>&prompt.root; <userinput>echo -n "Test Data" > /dev/echo</userinput> -&prompt.root; <userinput>cat /dev/echo</userinput> -Test Data</screen> - - <para>Real hardware devices in the next chapter..</para> - - <para>Additional Resources - <itemizedlist> - <listitem><simpara><ulink - url="http://www.daemonnews.org/200010/blueprints.html">Dynamic - Kernel Linker (KLD) Facility Programming Tutorial</ulink> - - <ulink url="http://www.daemonnews.org/">Daemonnews</ulink> October 2000</simpara></listitem> - <listitem><simpara><ulink - url="http://www.daemonnews.org/200007/newbus-intro.html">How - to Write Kernel Drivers with NEWBUS</ulink> - <ulink - url="http://www.daemonnews.org/">Daemonnews</ulink> July - 2000</simpara></listitem> - </itemizedlist> - </para> - </sect1> - - <sect1> - <title>Network Drivers</title> - - <para>Drivers for network devices do not use device nodes in order - to be accessed. Their selection is based on other decisions - made inside the kernel and instead of calling open(), use of a - network device is generally introduced by using the system call - socket(2).</para> - - <para>man ifnet(), loopback device, Bill Paul's drivers, - etc..</para> - - </sect1> - -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml deleted file mode 100644 index f48cd1ac06..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml +++ /dev/null @@ -1,2483 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="isa-driver"> - <title>ISA device drivers</title> - - <para> - <emphasis> - This chapter was written by &a.babkin; Modifications for the - handbook made by &a.murray;, &a.wylie;, and &a.logo;. - </emphasis> - </para> - - <sect1> - <title>Synopsis</title> - - <para>This chapter introduces the issues relevant to writing a - driver for an ISA device. The pseudo-code presented here is - rather detailed and reminiscent of the real code but is still - only pseudo-code. It avoids the details irrelevant to the - subject of the discussion. The real-life examples can be found - in the source code of real drivers. In particular the drivers - <literal>ep</literal> and <literal>aha</literal> are good sources of information.</para> - </sect1> - - <sect1> - <title>Basic information</title> - - <para>A typical ISA driver would need the following include - files:</para> - -<programlisting>#include <sys/module.h> -#include <sys/bus.h> -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <isa/isavar.h> -#include <isa/pnpvar.h></programlisting> - - <para>They describe the things specific to the ISA and generic - bus subsystem.</para> - - <para>The bus subsystem is implemented in an object-oriented - fashion, its main structures are accessed by associated method - functions.</para> - - <para>The list of bus methods implemented by an ISA driver is like - one for any other bus. For a hypothetical driver named <quote>xxx</quote> - they would be:</para> - - <itemizedlist> - <listitem> - <para><function>static void xxx_isa_identify (driver_t *, - device_t);</function> Normally used for bus drivers, not - device drivers. But for ISA devices this method may have - special use: if the device provides some device-specific - (non-PnP) way to auto-detect devices this routine may - implement it.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_probe (device_t - dev);</function> Probe for a device at a known (or PnP) - location. This routine can also accommodate device-specific - auto-detection of parameters for partially configured - devices.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_attach (device_t - dev);</function> Attach and initialize device.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_detach (device_t - dev);</function> Detach device before unloading the driver - module.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_shutdown (device_t - dev);</function> Execute shutdown of the device before - system shutdown.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_suspend (device_t - dev);</function> Suspend the device before the system goes - to the power-save state. May also abort transition to the - power-save state.</para> - </listitem> - - <listitem> - <para><function>static int xxx_isa_resume (device_t - dev);</function> Resume the device activity after return - from power-save state.</para> - </listitem> - - </itemizedlist> - - <para><function>xxx_isa_probe()</function> and - <function>xxx_isa_attach()</function> are mandatory, the rest of - the routines are optional, depending on the device's - needs.</para> - - <para>The driver is linked to the system with the following set of - descriptions.</para> - -<programlisting> /* table of supported bus methods */ - static device_method_t xxx_isa_methods[] = { - /* list all the bus method functions supported by the driver */ - /* omit the unsupported methods */ - DEVMETHOD(device_identify, xxx_isa_identify), - DEVMETHOD(device_probe, xxx_isa_probe), - DEVMETHOD(device_attach, xxx_isa_attach), - DEVMETHOD(device_detach, xxx_isa_detach), - DEVMETHOD(device_shutdown, xxx_isa_shutdown), - DEVMETHOD(device_suspend, xxx_isa_suspend), - DEVMETHOD(device_resume, xxx_isa_resume), - - { 0, 0 } - }; - - static driver_t xxx_isa_driver = { - "xxx", - xxx_isa_methods, - sizeof(struct xxx_softc), - }; - - - static devclass_t xxx_devclass; - - DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass, - load_function, load_argument);</programlisting> - - <para>Here struct <structname>xxx_softc</structname> is a - device-specific structure that contains private driver data - and descriptors for the driver's resources. The bus code - automatically allocates one softc descriptor per device as - needed.</para> - - <para>If the driver is implemented as a loadable module then - <function>load_function()</function> is called to do - driver-specific initialization or clean-up when the driver is - loaded or unloaded and load_argument is passed as one of its - arguments. If the driver does not support dynamic loading (in - other words it must always be linked into kernel) then these - values should be set to 0 and the last definition would look - like:</para> - - <programlisting> DRIVER_MODULE(xxx, isa, xxx_isa_driver, - xxx_devclass, 0, 0);</programlisting> - - <para>If the driver is for a device which supports PnP then a - table of supported PnP IDs must be defined. The table - consists of a list of PnP IDs supported by this driver and - human-readable descriptions of the hardware types and models - having these IDs. It looks like:</para> - -<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = { - /* a line for each supported PnP ID */ - { 0x12345678, "Our device model 1234A" }, - { 0x12345679, "Our device model 1234B" }, - { 0, NULL }, /* end of table */ - };</programlisting> - - <para>If the driver does not support PnP devices it still needs - an empty PnP ID table, like:</para> - -<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = { - { 0, NULL }, /* end of table */ - };</programlisting> - - </sect1> - - <sect1> - <title>Device_t pointer</title> - - <para><structname>Device_t</structname> is the pointer type for - the device structure. Here we consider only the methods - interesting from the device driver writer's standpoint. The - methods to manipulate values in the device structure - are:</para> - - <itemizedlist> - - <listitem><para><function>device_t - device_get_parent(dev)</function> Get the parent bus of a - device.</para></listitem> - - <listitem><para><function>driver_t - device_get_driver(dev)</function> Get pointer to its driver - structure.</para></listitem> - - <listitem><para><function>char - *device_get_name(dev)</function> Get the driver name, such - as <literal>"xxx"</literal> for our example.</para></listitem> - - <listitem><para><function>int device_get_unit(dev)</function> - Get the unit number (units are numbered from 0 for the - devices associated with each driver).</para></listitem> - - <listitem><para><function>char - *device_get_nameunit(dev)</function> Get the device name - including the unit number, such as <quote>xxx0</quote>, <quote>xxx1</quote> and so - on.</para></listitem> - - <listitem><para><function>char - *device_get_desc(dev)</function> Get the device - description. Normally it describes the exact model of device - in human-readable form.</para></listitem> - - <listitem><para><function>device_set_desc(dev, - desc)</function> Set the description. This makes the device - description point to the string desc which may not be - deallocated or changed after that.</para></listitem> - - <listitem><para><function>device_set_desc_copy(dev, - desc)</function> Set the description. The description is - copied into an internal dynamically allocated buffer, so the - string desc may be changed afterwards without adverse - effects.</para></listitem> - - <listitem><para><function>void - *device_get_softc(dev)</function> Get pointer to the device - descriptor (struct <structname>xxx_softc</structname>) - associated with this device.</para></listitem> - - <listitem><para><function>u_int32_t - device_get_flags(dev)</function> Get the flags specified for - the device in the configuration file.</para></listitem> - - </itemizedlist> - - <para>A convenience function <function>device_printf(dev, fmt, - ...)</function> may be used to print the messages from the - device driver. It automatically prepends the unitname and - colon to the message.</para> - - <para>The device_t methods are implemented in the file - <filename>kern/bus_subr.c</filename>.</para> - - </sect1> - - <sect1> - <title>Configuration file and the order of identifying and probing - during auto-configuration</title> - - <para>The ISA devices are described in the kernel configuration file - like:</para> - - <programlisting>device xxx0 at isa? port 0x300 irq 10 drq 5 - iomem 0xd0000 flags 0x1 sensitive</programlisting> - - <para>The values of port, IRQ and so on are converted to the - resource values associated with the device. They are optional, - depending on the device's needs and abilities for - auto-configuration. For example, some devices do not need DRQ - at all and some allow the driver to read the IRQ setting from - the device configuration ports. If a machine has multiple ISA - buses the exact bus may be specified in the configuration - line, like <literal>isa0</literal> or <literal>isa1</literal>, otherwise the device would be - searched for on all the ISA buses.</para> - - <para><literal>sensitive</literal> is a resource requesting that this device must - be probed before all non-sensitive devices. It is supported - but does not seem to be used in any current driver.</para> - - <para>For legacy ISA devices in many cases the drivers are still - able to detect the configuration parameters. But each device - to be configured in the system must have a config line. If two - devices of some type are installed in the system but there is - only one configuration line for the corresponding driver, ie: - <programlisting>device xxx0 at isa?</programlisting> then only - one device will be configured.</para> - - <para>But for the devices supporting automatic identification by - the means of Plug-n-Play or some proprietary protocol one - configuration line is enough to configure all the devices in - the system, like the one above or just simply:</para> - - <programlisting>device xxx at isa?</programlisting> - - <para>If a driver supports both auto-identified and legacy - devices and both kinds are installed at once in one machine - then it is enough to describe in the config file the legacy - devices only. The auto-identified devices will be added - automatically.</para> - - <para>When an ISA bus is auto-configured the events happen as - follows:</para> - - <para>All the drivers' identify routines (including the PnP - identify routine which identifies all the PnP devices) are - called in random order. As they identify the devices they add - them to the list on the ISA bus. Normally the drivers' - identify routines associate their drivers with the new - devices. The PnP identify routine does not know about the - other drivers yet so it does not associate any with the new - devices it adds.</para> - - <para>The PnP devices are put to sleep using the PnP protocol to - prevent them from being probed as legacy devices.</para> - - <para>The probe routines of non-PnP devices marked as - <literal>sensitive</literal> are called. If probe for a device went - successfully, the attach routine is called for it.</para> - - <para>The probe and attach routines of all non-PNP devices are - called likewise.</para> - - <para>The PnP devices are brought back from the sleep state and - assigned the resources they request: I/O and memory address - ranges, IRQs and DRQs, all of them not conflicting with the - attached legacy devices.</para> - - <para>Then for each PnP device the probe routines of all the - present ISA drivers are called. The first one that claims the - device gets attached. It is possible that multiple drivers - would claim the device with different priority; in this case, the - highest-priority driver wins. The probe routines must call - <function>ISA_PNP_PROBE()</function> to compare the actual PnP - ID with the list of the IDs supported by the driver and if the - ID is not in the table return failure. That means that - absolutely every driver, even the ones not supporting any PnP - devices must call <function>ISA_PNP_PROBE()</function>, at - least with an empty PnP ID table to return failure on unknown - PnP devices.</para> - - <para>The probe routine returns a positive value (the error - code) on error, zero or negative value on success.</para> - - <para>The negative return values are used when a PnP device - supports multiple interfaces. For example, an older - compatibility interface and a newer advanced interface which - are supported by different drivers. Then both drivers would - detect the device. The driver which returns a higher value in - the probe routine takes precedence (in other words, the driver - returning 0 has highest precedence, returning -1 is next, - returning -2 is after it and so on). In result the devices - which support only the old interface will be handled by the - old driver (which should return -1 from the probe routine) - while the devices supporting the new interface as well will be - handled by the new driver (which should return 0 from the - probe routine). If multiple drivers return the same value then - the one called first wins. So if a driver returns value 0 it - may be sure that it won the priority arbitration.</para> - - <para>The device-specific identify routines can also assign not - a driver but a class of drivers to the device. Then all the - drivers in the class are probed for this device, like the case - with PnP. This feature is not implemented in any existing - driver and is not considered further in this document.</para> - - <para>Because the PnP devices are disabled when probing the - legacy devices they will not be attached twice (once as legacy - and once as PnP). But in case of device-dependent identify - routines it is the responsibility of the driver to make sure - that the same device will not be attached by the driver twice: - once as legacy user-configured and once as - auto-identified.</para> - - <para>Another practical consequence for the auto-identified - devices (both PnP and device-specific) is that the flags can - not be passed to them from the kernel configuration file. So - they must either not use the flags at all or use the flags - from the device unit 0 for all the auto-identified devices or - use the sysctl interface instead of flags.</para> - - <para>Other unusual configurations may be accommodated by - accessing the configuration resources directly with functions - of families <function>resource_query_*()</function> and - <function>resource_*_value()</function>. Their implementations - are located in <filename>kern/subr_bus.h</filename>. The old IDE disk driver - <filename>i386/isa/wd.c</filename> contains examples of such use. But the standard - means of configuration must always be preferred. Leave parsing - the configuration resources to the bus configuration - code.</para> - - </sect1> - - <sect1> - <title>Resources</title> - - <para>The information that a user enters into the kernel - configuration file is processed and passed to the kernel as - configuration resources. This information is parsed by the bus - configuration code and transformed into a value of structure - device_t and the bus resources associated with it. The drivers - may access the configuration resources directly using - functions resource_* for more complex cases of - configuration. However, generally this is neither needed nor recommended, - so this issue is not discussed further here.</para> - - <para>The bus resources are associated with each device. They - are identified by type and number within the type. For the ISA - bus the following types are defined:</para> - - <itemizedlist> - <listitem> - <para><emphasis>SYS_RES_IRQ</emphasis> - interrupt - number</para> - </listitem> - - <listitem> - <para><emphasis>SYS_RES_DRQ</emphasis> - ISA DMA channel - number</para> - </listitem> - - <listitem> - <para><emphasis>SYS_RES_MEMORY</emphasis> - range of - device memory mapped into the system memory space - </para> - </listitem> - - <listitem> - <para><emphasis>SYS_RES_IOPORT</emphasis> - range of - device I/O registers</para> - </listitem> - </itemizedlist> - - <para>The enumeration within types starts from 0, so if a device - has two memory regions it would have resources of type - SYS_RES_MEMORY numbered 0 and 1. The resource type has - nothing to do with the C language type, all the resource - values have the C language type <literal>unsigned long</literal> and must be - cast as necessary. The resource numbers do not have to be - contiguous, although for ISA they normally would be. The - permitted resource numbers for ISA devices are:</para> - - <programlisting> IRQ: 0-1 - DRQ: 0-1 - MEMORY: 0-3 - IOPORT: 0-7</programlisting> - - <para>All the resources are represented as ranges, with a start - value and count. For IRQ and DRQ resources the count would - normally be equal to 1. The values for memory refer to the - physical addresses.</para> - - <para>Three types of activities can be performed on - resources:</para> - - <itemizedlist> - <listitem><para>set/get</para></listitem> - <listitem><para>allocate/release</para></listitem> - <listitem><para>activate/deactivate</para></listitem> - </itemizedlist> - - <para>Setting sets the range used by the resource. Allocation - reserves the requested range that no other driver would be - able to reserve it (and checking that no other driver reserved - this range already). Activation makes the resource accessible - to the driver by doing whatever is necessary for that (for - example, for memory it would be mapping into the kernel - virtual address space).</para> - - <para>The functions to manipulate resources are:</para> - - <itemizedlist> - <listitem> - <para><function>int bus_set_resource(device_t dev, int type, - int rid, u_long start, u_long count)</function></para> - - <para>Set a range for a resource. Returns 0 if successful, - error code otherwise. Normally, this function will - return an error only if one of <literal>type</literal>, - <literal>rid</literal>, <literal>start</literal> or - <literal>count</literal> has a value that falls out of the - permitted range.</para> - - <itemizedlist> - <listitem> - <para> dev - driver's device</para> - </listitem> - <listitem> - <para> type - type of resource, SYS_RES_* </para> - </listitem> - <listitem> - <para> rid - resource number (ID) within type </para> - </listitem> - <listitem> - <para> start, count - resource range </para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><function>int bus_get_resource(device_t dev, int type, - int rid, u_long *startp, u_long *countp)</function></para> - - <para>Get the range of resource. Returns 0 if successful, - error code if the resource is not defined yet.</para> - </listitem> - - <listitem> - <para><function>u_long bus_get_resource_start(device_t dev, - int type, int rid) u_long bus_get_resource_count (device_t - dev, int type, int rid)</function></para> - - <para>Convenience functions to get only the start or - count. Return 0 in case of error, so if the resource start - has 0 among the legitimate values it would be impossible - to tell if the value is 0 or an error occurred. Luckily, - no ISA resources for add-on drivers may have a start value - equal to 0.</para> - </listitem> - - <listitem> - <para><function>void bus_delete_resource(device_t dev, int - type, int rid)</function></para> - <para> Delete a resource, make it undefined.</para> - </listitem> - - <listitem> - <para><function>struct resource * - bus_alloc_resource(device_t dev, int type, int *rid, - u_long start, u_long end, u_long count, u_int - flags)</function></para> - - <para>Allocate a resource as a range of count values not - allocated by anyone else, somewhere between start and - end. Alas, alignment is not supported. If the resource - was not set yet it is automatically created. The special - values of start 0 and end ~0 (all ones) means that the - fixed values previously set by - <function>bus_set_resource()</function> must be used - instead: start and count as themselves and - end=(start+count), in this case if the resource was not - defined before then an error is returned. Although rid is - passed by reference it is not set anywhere by the resource - allocation code of the ISA bus. (The other buses may use a - different approach and modify it).</para> - </listitem> - </itemizedlist> - - <para>Flags are a bitmap, the flags interesting for the caller - are:</para> - - <itemizedlist> - <listitem> - <para><emphasis>RF_ACTIVE</emphasis> - causes the resource - to be automatically activated after allocation.</para> - </listitem> - - <listitem> - <para><emphasis>RF_SHAREABLE</emphasis> - resource may be - shared at the same time by multiple drivers.</para> - </listitem> - - <listitem> - <para><emphasis>RF_TIMESHARE</emphasis> - resource may be - time-shared by multiple drivers, i.e. allocated at the - same time by many but activated only by one at any given - moment of time.</para> - </listitem> -<!-- XXXDONT KNOW IT THESE SHOULD BE TWO SEPERATE LISTS OR NOT --> - <listitem> - <para>Returns 0 on error. The allocated values may be - obtained from the returned handle using methods - <function>rhand_*()</function>.</para> - </listitem> - <listitem> - <para><function>int bus_release_resource(device_t dev, int - type, int rid, struct resource *r)</function></para> - </listitem> - - <listitem> - <para>Release the resource, r is the handle returned by - <function>bus_alloc_resource()</function>. Returns 0 on - success, error code otherwise.</para> - </listitem> - - <listitem> - <para><function>int bus_activate_resource(device_t dev, int - type, int rid, struct resource *r)</function> - <function>int bus_deactivate_resource(device_t dev, int - type, int rid, struct resource *r)</function></para> - </listitem> - - <listitem> - <para>Activate or deactivate resource. Return 0 on success, - error code otherwise. If the resource is time-shared and - currently activated by another driver then EBUSY is - returned.</para> - </listitem> - - <listitem> - <para><function>int bus_setup_intr(device_t dev, struct - resource *r, int flags, driver_intr_t *handler, void *arg, - void **cookiep)</function> <function>int - bus_teardown_intr(device_t dev, struct resource *r, void - *cookie)</function></para> - </listitem> - - <listitem> - <para>Associate or de-associate the interrupt handler with a - device. Return 0 on success, error code otherwise.</para> - </listitem> - - <listitem> - <para>r - the activated resource handler describing the - IRQ</para> - <para>flags - the interrupt priority level, one of:</para> - - <itemizedlist> - <listitem> - <para><function>INTR_TYPE_TTY</function> - terminals and - other likewise character-type devices. To mask them - use <function>spltty()</function>.</para> - </listitem> - <listitem> - <para><function>(INTR_TYPE_TTY | - INTR_TYPE_FAST)</function> - terminal type devices - with small input buffer, critical to the data loss on - input (such as the old-fashioned serial ports). To - mask them use <function>spltty()</function>.</para> - </listitem> - <listitem> - <para><function>INTR_TYPE_BIO</function> - block-type - devices, except those on the CAM controllers. To mask - them use <function>splbio()</function>.</para> - </listitem> - <listitem> - <para><function>INTR_TYPE_CAM</function> - CAM (Common - Access Method) bus controllers. To mask them use - <function>splcam()</function>.</para> - </listitem> - <listitem> - <para><function>INTR_TYPE_NET</function> - network - interface controllers. To mask them use - <function>splimp()</function>.</para> - </listitem> - <listitem> - <para><function>INTR_TYPE_MISC</function> - - miscellaneous devices. There is no other way to mask - them than by <function>splhigh()</function> which - masks all interrupts.</para> - </listitem> - </itemizedlist> - </listitem> - </itemizedlist> - - <para>When an interrupt handler executes all the other - interrupts matching its priority level will be masked. The - only exception is the MISC level for which no other interrupts - are masked and which is not masked by any other - interrupt.</para> - - <itemizedlist> - <listitem> - <para><emphasis>handler</emphasis> - pointer to the handler - function, the type driver_intr_t is defined as <function>void - driver_intr_t(void *)</function></para> - </listitem> - <listitem> - <para><emphasis>arg</emphasis> - the argument passed to the - handler to identify this particular device. It is cast - from void* to any real type by the handler. The old - convention for the ISA interrupt handlers was to use the - unit number as argument, the new (recommended) convention - is using a pointer to the device softc structure.</para> - </listitem> - <listitem> - <para><emphasis>cookie[p]</emphasis> - the value received - from <function>setup()</function> is used to identify the - handler when passed to - <function>teardown()</function></para> - </listitem> - </itemizedlist> - - <para>A number of methods are defined to operate on the resource - handlers (struct resource *). Those of interest to the device - driver writers are:</para> - - <itemizedlist> - <listitem> - <para><function>u_long rman_get_start(r) u_long - rman_get_end(r)</function> Get the start and end of - allocated resource range.</para> - </listitem> - <listitem> - <para><function>void *rman_get_virtual(r)</function> Get - the virtual address of activated memory resource.</para> - </listitem> - </itemizedlist> - - </sect1> - - <sect1> - <title>Bus memory mapping</title> - - <para>In many cases data is exchanged between the driver and the - device through the memory. Two variants are possible:</para> - - <para>(a) memory is located on the device card</para> - <para>(b) memory is the main memory of the computer</para> - - <para>In case (a) the driver always copies the data back and - forth between the on-card memory and the main memory as - necessary. To map the on-card memory into the kernel virtual - address space the physical address and length of the on-card - memory must be defined as a SYS_RES_MEMORY resource. That - resource can then be allocated and activated, and its virtual - address obtained using - <function>rman_get_virtual()</function>. The older drivers - used the function <function>pmap_mapdev()</function> for this - purpose, which should not be used directly any more. Now it is - one of the internal steps of resource activation.</para> - - <para>Most of the ISA cards will have their memory configured - for physical location somewhere in range 640KB-1MB. Some of - the ISA cards require larger memory ranges which should be - placed somewhere under 16MB (because of the 24-bit address - limitation on the ISA bus). In that case if the machine has - more memory than the start address of the device memory (in - other words, they overlap) a memory hole must be configured at - the address range used by devices. Many BIOSes allow - configuration of a memory hole of 1MB starting at 14MB or - 15MB. FreeBSD can handle the memory holes properly if the BIOS - reports them properly (this feature may be broken on old BIOSes).</para> - - <para>In case (b) just the address of the data is sent to - the device, and the device uses DMA to actually access the - data in the main memory. Two limitations are present: First, - ISA cards can only access memory below 16MB. Second, the - contiguous pages in virtual address space may not be - contiguous in physical address space, so the device may have - to do scatter/gather operations. The bus subsystem provides - ready solutions for some of these problems, the rest has to be - done by the drivers themselves.</para> - - <para>Two structures are used for DMA memory allocation, - bus_dma_tag_t and bus_dmamap_t. Tag describes the properties - required for the DMA memory. Map represents a memory block - allocated according to these properties. Multiple maps may be - associated with the same tag.</para> - - <para>Tags are organized into a tree-like hierarchy with - inheritance of the properties. A child tag inherits all the - requirements of its parent tag, and may make them more strict - but never more loose.</para> - - <para>Normally one top-level tag (with no parent) is created for - each device unit. If multiple memory areas with different - requirements are needed for each device then a tag for each of - them may be created as a child of the parent tag.</para> - - <para>The tags can be used to create a map in two ways.</para> - - <para>First, a chunk of contiguous memory conformant with the - tag requirements may be allocated (and later may be - freed). This is normally used to allocate relatively - long-living areas of memory for communication with the - device. Loading of such memory into a map is trivial: it is - always considered as one chunk in the appropriate physical - memory range.</para> - - <para>Second, an arbitrary area of virtual memory may be loaded - into a map. Each page of this memory will be checked for - conformance to the map requirement. If it conforms then it is - left at its original location. If it is not then a fresh - conformant <quote>bounce page</quote> is allocated and used as intermediate - storage. When writing the data from the non-conformant - original pages they will be copied to their bounce pages first - and then transferred from the bounce pages to the device. When - reading the data would go from the device to the bounce pages - and then copied to their non-conformant original pages. The - process of copying between the original and bounce pages is - called synchronization. This is normally used on a per-transfer - basis: buffer for each transfer would be loaded, transfer done - and buffer unloaded.</para> - - <para>The functions working on the DMA memory are:</para> - - <itemizedlist> - <listitem> - <para><function>int bus_dma_tag_create(bus_dma_tag_t parent, - bus_size_t alignment, bus_size_t boundary, bus_addr_t - lowaddr, bus_addr_t highaddr, bus_dma_filter_t *filter, void - *filterarg, bus_size_t maxsize, int nsegments, bus_size_t - maxsegsz, int flags, bus_dma_tag_t *dmat)</function></para> - - <para>Create a new tag. Returns 0 on success, the error code - otherwise.</para> - - <itemizedlist> - <listitem> - <para><emphasis>parent</emphasis> - parent tag, or NULL to - create a top-level tag <emphasis>alignment</emphasis> - - required physical alignment of the memory area to be - allocated for this tag. Use value 1 for <quote>no specific - alignment</quote>. Applies only to the future - <function>bus_dmamem_alloc()</function> but not - <function>bus_dmamap_create()</function> calls.</para> - </listitem> - - <listitem> - <para><emphasis>boundary</emphasis> - physical address - boundary that must not be crossed when allocating the - memory. Use value 0 for <quote>no boundary</quote>. Applies only to - the future <function>bus_dmamem_alloc()</function> but - not <function>bus_dmamap_create()</function> calls. - Must be power of 2. If the memory is planned to be used - in non-cascaded DMA mode (i.e. the DMA addresses will be - supplied not by the device itself but by the ISA DMA - controller) then the boundary must be no larger than - 64KB (64*1024) due to the limitations of the DMA - hardware.</para> - </listitem> - - <listitem> - <para><emphasis>lowaddr, highaddr</emphasis> - the names - are slightly misleading; these values are used to limit - the permitted range of physical addresses used to - allocate the memory. The exact meaning varies depending - on the planned future use:</para> - - <itemizedlist> - <listitem> - <para>For <function>bus_dmamem_alloc()</function> all - the addresses from 0 to lowaddr-1 are considered - permitted, the higher ones are forbidden.</para> - </listitem> - - <listitem> - <para>For <function>bus_dmamap_create()</function> all - the addresses outside the inclusive range [lowaddr; - highaddr] are considered accessible. The addresses - of pages inside the range are passed to the filter - function which decides if they are accessible. If no - filter function is supplied then all the range is - considered unaccessible.</para> - </listitem> - - <listitem> - <para>For the ISA devices the normal values (with no - filter function) are:</para> - <para>lowaddr = BUS_SPACE_MAXADDR_24BIT</para> - <para>highaddr = BUS_SPACE_MAXADDR</para> - </listitem> - </itemizedlist> - - </listitem> - - <listitem> - <para><emphasis>filter, filterarg</emphasis> - the filter - function and its argument. If NULL is passed for filter - then the whole range [lowaddr, highaddr] is considered - unaccessible when doing - <function>bus_dmamap_create()</function>. Otherwise the - physical address of each attempted page in range - [lowaddr; highaddr] is passed to the filter function - which decides if it is accessible. The prototype of the - filter function is: <function>int filterfunc(void *arg, - bus_addr_t paddr)</function>. It must return 0 if the - page is accessible, non-zero otherwise.</para> - </listitem> - - <listitem> - <para><emphasis>maxsize</emphasis> - the maximal size of - memory (in bytes) that may be allocated through this - tag. In case it is difficult to estimate or could be - arbitrarily big, the value for ISA devices would be - BUS_SPACE_MAXSIZE_24BIT.</para> - </listitem> - - <listitem> - <para><emphasis>nsegments</emphasis> - maximal number of - scatter-gather segments supported by the device. If - unrestricted then the value BUS_SPACE_UNRESTRICTED - should be used. This value is recommended for the parent - tags, the actual restrictions would then be specified - for the descendant tags. Tags with nsegments equal to - BUS_SPACE_UNRESTRICTED may not be used to actually load - maps, they may be used only as parent tags. The - practical limit for nsegments seems to be about 250-300, - higher values will cause kernel stack overflow (the hardware - can not normally support that many - scatter-gather buffers anyway).</para> - </listitem> - - <listitem> - <para><emphasis>maxsegsz</emphasis> - maximal size of a - scatter-gather segment supported by the device. The - maximal value for ISA device would be - BUS_SPACE_MAXSIZE_24BIT.</para> - </listitem> - - <listitem> - <para><emphasis>flags</emphasis> - a bitmap of flags. The - only interesting flags are:</para> - - <itemizedlist> - <listitem> - <para><emphasis>BUS_DMA_ALLOCNOW</emphasis> - requests - to allocate all the potentially needed bounce pages - when creating the tag.</para> - </listitem> - - <listitem> - <para><emphasis>BUS_DMA_ISA</emphasis> - mysterious - flag used only on Alpha machines. It is not defined - for the i386 machines. Probably it should be used - by all the ISA drivers for Alpha machines but it - looks like there are no such drivers yet.</para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> - <para><emphasis>dmat</emphasis> - pointer to the storage - for the new tag to be returned.</para> - </listitem> - - </itemizedlist> - - </listitem> - - <listitem> <!-- Second entry in list alpha --> - <para><function>int bus_dma_tag_destroy(bus_dma_tag_t - dmat)</function></para> - - <para>Destroy a tag. Returns 0 on success, the error code - otherwise.</para> - - <para>dmat - the tag to be destroyed.</para> - - </listitem> - - <listitem> <!-- Third entry in list alpha --> - <para><function>int bus_dmamem_alloc(bus_dma_tag_t dmat, - void** vaddr, int flags, bus_dmamap_t - *mapp)</function></para> - - <para>Allocate an area of contiguous memory described by the - tag. The size of memory to be allocated is tag's maxsize. - Returns 0 on success, the error code otherwise. The result - still has to be loaded by - <function>bus_dmamap_load()</function> before being used to get - the physical address of the memory.</para> - -<!-- XXX What it is Wylie, I got to here --> - - <itemizedlist> - <listitem> - <para> - <emphasis>dmat</emphasis> - the tag - </para> - </listitem> - <listitem> - <para> - <emphasis>vaddr</emphasis> - pointer to the storage - for the kernel virtual address of the allocated area - to be returned. - </para> - </listitem> - <listitem> - <para> - flags - a bitmap of flags. The only interesting flag is: - </para> - <itemizedlist> - <listitem> - <para> - <emphasis>BUS_DMA_NOWAIT</emphasis> - if the - memory is not immediately available return the - error. If this flag is not set then the routine - is allowed to sleep until the memory - becomes available. - </para> - </listitem> - </itemizedlist> - </listitem> - <listitem> - <para> - <emphasis>mapp</emphasis> - pointer to the storage - for the new map to be returned. - </para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> <!-- Fourth entry in list alpha --> - <para> - <function>void bus_dmamem_free(bus_dma_tag_t dmat, void - *vaddr, bus_dmamap_t map)</function> - </para> - <para> - Free the memory allocated by - <function>bus_dmamem_alloc()</function>. At present, - freeing of the memory allocated with ISA restrictions is - not implemented. Because of this the recommended model - of use is to keep and re-use the allocated areas for as - long as possible. Do not lightly free some area and then - shortly allocate it again. That does not mean that - <function>bus_dmamem_free()</function> should not be - used at all: hopefully it will be properly implemented - soon. - </para> - - <itemizedlist> - <listitem> - <para><emphasis>dmat</emphasis> - the tag - </para> - </listitem> - <listitem> - <para> - <emphasis>vaddr</emphasis> - the kernel virtual - address of the memory - </para> - </listitem> - <listitem> - <para> - <emphasis>map</emphasis> - the map of the memory (as - returned from - <function>bus_dmamem_alloc()</function>) - </para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> <!-- The fifth entry in list alpha --> - <para> - <function>int bus_dmamap_create(bus_dma_tag_t dmat, int - flags, bus_dmamap_t *mapp)</function> - </para> - <para> - Create a map for the tag, to be used in - <function>bus_dmamap_load()</function> later. Returns 0 - on success, the error code otherwise. - </para> - <itemizedlist> - <listitem> - <para> - <emphasis>dmat</emphasis> - the tag - </para> - </listitem> - <listitem> - <para> - <emphasis>flags</emphasis> - theoretically, a bit map - of flags. But no flags are defined yet, so at present - it will be always 0. - </para> - </listitem> - <listitem> - <para> - <emphasis>mapp</emphasis> - pointer to the storage - for the new map to be returned - </para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> <!-- Sixth entry in the alpha list --> - <para> - <function>int bus_dmamap_destroy(bus_dma_tag_t dmat, - bus_dmamap_t map)</function> - </para> - <para> - Destroy a map. Returns 0 on success, the error code otherwise. - </para> - - <itemizedlist> - <listitem> - <para> - dmat - the tag to which the map is associated - </para> - </listitem> - <listitem> - <para> - map - the map to be destroyed - </para> - </listitem> - </itemizedlist> - </listitem> - - <listitem> <!-- Seventh entry in list alpha --> - <para> - <function>int bus_dmamap_load(bus_dma_tag_t dmat, - bus_dmamap_t map, void *buf, bus_size_t buflen, - bus_dmamap_callback_t *callback, void *callback_arg, int - flags)</function> - </para> - <para> - Load a buffer into the map (the map must be previously - created by <function>bus_dmamap_create()</function> or - <function>bus_dmamem_alloc()</function>). All the pages - of the buffer are checked for conformance to the tag - requirements and for those not conformant the bounce - pages are allocated. An array of physical segment - descriptors is built and passed to the callback - routine. This callback routine is then expected to - handle it in some way. The number of bounce buffers in - the system is limited, so if the bounce buffers are - needed but not immediately available the request will be - queued and the callback will be called when the bounce - buffers will become available. Returns 0 if the callback - was executed immediately or EINPROGRESS if the request - was queued for future execution. In the latter case the - synchronization with queued callback routine is the - responsibility of the driver. - </para> - <!--<blockquote>--> - <itemizedlist> - <listitem> - <para> - <emphasis>dmat</emphasis> - the tag - </para> - </listitem> - <listitem> - <para> - <emphasis>map</emphasis> - the map - </para> - </listitem> - <listitem> - <para> - <emphasis>buf</emphasis> - kernel virtual address of - the buffer - </para> - </listitem> - <listitem> - <para> - <emphasis>buflen</emphasis> - length of the buffer - </para> - </listitem> - <listitem> - <para> - <emphasis>callback</emphasis>,<function> - callback_arg</function> - the callback function and - its argument - </para> - </listitem> - </itemizedlist> - <!--</blockquote>--> - <para> - The prototype of callback function is: - </para> - <para> - <function>void callback(void *arg, bus_dma_segment_t - *seg, int nseg, int error)</function> - </para> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <emphasis>arg</emphasis> - the same as callback_arg - passed to <function>bus_dmamap_load()</function> - </para> - </listitem> - <listitem> - <para> - <emphasis>seg</emphasis> - array of the segment - descriptors - </para> - </listitem> - <listitem> - <para> - <emphasis>nseg</emphasis> - number of descriptors in - array - </para> - </listitem> - <listitem> - <para> - <emphasis>error</emphasis> - indication of the - segment number overflow: if it is set to EFBIG then - the buffer did not fit into the maximal number of - segments permitted by the tag. In this case only the - permitted number of descriptors will be in the - array. Handling of this situation is up to the - driver: depending on the desired semantics it can - either consider this an error or split the buffer in - two and handle the second part separately - </para> - </listitem> - </itemizedlist> - <!-- </blockquote> --> - <para> - Each entry in the segments array contains the fields: - </para> - - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <emphasis>ds_addr</emphasis> - physical bus address - of the segment - </para> - </listitem> - <listitem> - <para> - <emphasis>ds_len</emphasis> - length of the segment - </para> - </listitem> - </itemizedlist> - <!-- </blockquote>--> - </listitem> - - <listitem> <!-- Eighth entry in alpha list --> - <para> - <function>void bus_dmamap_unload(bus_dma_tag_t dmat, - bus_dmamap_t map)</function> - </para> - <para>unload the map. - </para> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <emphasis>dmat</emphasis> - tag - </para> - </listitem> - <listitem> - <para> - <emphasis>map</emphasis> - loaded map - </para> - </listitem> - </itemizedlist> - <!-- </blockquote> --> - </listitem> - - <listitem> <!-- Ninth entry list alpha --> - <para> - <function>void bus_dmamap_sync (bus_dma_tag_t dmat, - bus_dmamap_t map, bus_dmasync_op_t op)</function> - </para> - <para> - Synchronise a loaded buffer with its bounce pages before - and after physical transfer to or from device. This is - the function that does all the necessary copying of data - between the original buffer and its mapped version. The - buffers must be synchronized both before and after doing - the transfer. - </para> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <emphasis>dmat</emphasis> - tag - </para> - </listitem> - <listitem> - <para> - <emphasis>map</emphasis> - loaded map - </para> - </listitem> - <listitem> - <para> - <emphasis>op</emphasis> - type of synchronization - operation to perform: - </para> - </listitem> - </itemizedlist> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <function>BUS_DMASYNC_PREREAD</function> - before - reading from device into buffer - </para> - </listitem> - <listitem> - <para> - <function>BUS_DMASYNC_POSTREAD</function> - after - reading from device into buffer - </para> - </listitem> - <listitem> - <para> - <function>BUS_DMASYNC_PREWRITE</function> - before - writing the buffer to device - </para> - </listitem> - <listitem> - <para> - <function>BUS_DMASYNC_POSTWRITE</function> - after - writing the buffer to device - </para> - </listitem> - </itemizedlist> - </listitem> - </itemizedlist> <!-- End of list alpha --> -<!-- </blockquote> -</blockquote> --> - - <para> - As of now PREREAD and POSTWRITE are null operations but that - may change in the future, so they must not be ignored in the - driver. Synchronization is not needed for the memory - obtained from <function>bus_dmamem_alloc()</function>. - </para> - <para> - Before calling the callback function from - <function>bus_dmamap_load()</function> the segment array is - stored in the stack. And it gets pre-allocated for the - maximal number of segments allowed by the tag. Because of - this the practical limit for the number of segments on i386 - architecture is about 250-300 (the kernel stack is 4KB minus - the size of the user structure, size of a segment array - entry is 8 bytes, and some space must be left). Because the - array is allocated based on the maximal number this value - must not be set higher than really needed. Fortunately, for - most of hardware the maximal supported number of segments is - much lower. But if the driver wants to handle buffers with a - very large number of scatter-gather segments it should do - that in portions: load part of the buffer, transfer it to - the device, load next part of the buffer, and so on. - </para> - <para> - Another practical consequence is that the number of segments - may limit the size of the buffer. If all the pages in the - buffer happen to be physically non-contiguous then the - maximal supported buffer size for that fragmented case would - be (nsegments * page_size). For example, if a maximal number - of 10 segments is supported then on i386 maximal guaranteed - supported buffer size would be 40K. If a higher size is - desired then special tricks should be used in the driver. - </para> - <para> - If the hardware does not support scatter-gather at all or - the driver wants to support some buffer size even if it is - heavily fragmented then the solution is to allocate a - contiguous buffer in the driver and use it as intermediate - storage if the original buffer does not fit. - </para> - <para> - Below are the typical call sequences when using a map depend - on the use of the map. The characters -> are used to show - the flow of time. - </para> - <para> - For a buffer which stays practically fixed during all the - time between attachment and detachment of a device:</para> - <para> - bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... -> - -> bus_dmamap_unload -> bus_dmamem_free - </para> - - <para>For a buffer that changes frequently and is passed from - outside the driver: - - <!-- XXX is this correct? --> - <programlisting> bus_dmamap_create -> - -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer -> - -> bus_dmamap_sync(POST...) -> bus_dmamap_unload -> - ... - -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer -> - -> bus_dmamap_sync(POST...) -> bus_dmamap_unload -> - -> bus_dmamap_destroy </programlisting> - - </para> - <para> - When loading a map created by - <function>bus_dmamem_alloc()</function> the passed address - and size of the buffer must be the same as used in - <function>bus_dmamem_alloc()</function>. In this case it is - guaranteed that the whole buffer will be mapped as one - segment (so the callback may be based on this assumption) - and the request will be executed immediately (EINPROGRESS - will never be returned). All the callback needs to do in - this case is to save the physical address. - </para> - <para> - A typical example would be: - </para> - - <programlisting> static void - alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error) - { - *(bus_addr_t *)arg = seg[0].ds_addr; - } - - ... - int error; - struct somedata { - .... - }; - struct somedata *vsomedata; /* virtual address */ - bus_addr_t psomedata; /* physical bus-relative address */ - bus_dma_tag_t tag_somedata; - bus_dmamap_t map_somedata; - ... - - error=bus_dma_tag_create(parent_tag, alignment, - boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL, - /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1, - /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0, - &tag_somedata); - if(error) - return error; - - error = bus_dmamem_alloc(tag_somedata, &vsomedata, /* flags*/ 0, - &map_somedata); - if(error) - return error; - - bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata, - sizeof (struct somedata), alloc_callback, - (void *) &psomedata, /*flags*/0); </programlisting> - - <para> - Looks a bit long and complicated but that is the way to do - it. The practical consequence is: if multiple memory areas - are allocated always together it would be a really good idea - to combine them all into one structure and allocate as one - (if the alignment and boundary limitations permit). - </para> - <para> - When loading an arbitrary buffer into the map created by - <function>bus_dmamap_create()</function> special measures - must be taken to synchronize with the callback in case it - would be delayed. The code would look like: - </para> - - <programlisting> { - int s; - int error; - - s = splsoftvm(); - error = bus_dmamap_load( - dmat, - dmamap, - buffer_ptr, - buffer_len, - callback, - /*callback_arg*/ buffer_descriptor, - /*flags*/0); - if (error == EINPROGRESS) { - /* - * Do whatever is needed to ensure synchronization - * with callback. Callback is guaranteed not to be started - * until we do splx() or tsleep(). - */ - } - splx(s); - } </programlisting> - - <para> - Two possible approaches for the processing of requests are: - </para> - <para> - 1. If requests are completed by marking them explicitly as - done (such as the CAM requests) then it would be simpler to - put all the further processing into the callback driver - which would mark the request when it is done. Then not much - extra synchronization is needed. For the flow control - reasons it may be a good idea to freeze the request queue - until this request gets completed. - </para> - <para> - 2. If requests are completed when the function returns (such - as classic read or write requests on character devices) then - a synchronization flag should be set in the buffer - descriptor and <function>tsleep()</function> called. Later - when the callback gets called it will do its processing and - check this synchronization flag. If it is set then the - callback should issue a wakeup. In this approach the - callback function could either do all the needed processing - (just like the previous case) or simply save the segments - array in the buffer descriptor. Then after callback - completes the calling function could use this saved segments - array and do all the processing. - - </para> - </sect1> -<!--_________________________________________________________________________--> -<!--~~~~~~~~~~~~~~~~~~~~END OF SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--> - - <sect1> - <title>DMA</title> - <!-- Section Marked up by Wylie --> - <para> - The Direct Memory Access (DMA) is implemented in the ISA bus - through the DMA controller (actually, two of them but that is - an irrelevant detail). To make the early ISA devices simple - and cheap the logic of the bus control and address - generation was concentrated in the DMA controller. - Fortunately, FreeBSD provides a set of functions that mostly - hide the annoying details of the DMA controller from the - device drivers. - </para> - - <para> - The simplest case is for the fairly intelligent - devices. Like the bus master devices on PCI they can - generate the bus cycles and memory addresses all by - themselves. The only thing they really need from the DMA - controller is bus arbitration. So for this purpose they - pretend to be cascaded slave DMA controllers. And the only - thing needed from the system DMA controller is to enable the - cascaded mode on a DMA channel by calling the following - function when attaching the driver: - </para> - - <para> - <function>void isa_dmacascade(int channel_number)</function> - </para> - - <para> - All the further activity is done by programming the - device. When detaching the driver no DMA-related functions - need to be called. - </para> - - <para> - For the simpler devices things get more complicated. The - functions used are: - </para> - - <itemizedlist> - - <listitem> - <para> - <function>int isa_dma_acquire(int chanel_number)</function> - </para> - <para> - Reserve a DMA channel. Returns 0 on success or EBUSY - if the channel was already reserved by this or a - different driver. Most of the ISA devices are not able - to share DMA channels anyway, so normally this - function is called when attaching a device. This - reservation was made redundant by the modern interface - of bus resources but still must be used in addition to - the latter. If not used then later, other DMA routines - will panic. - </para> - </listitem> - - <listitem> - <para> - <function>int isa_dma_release(int chanel_number)</function> - </para> - <para> - Release a previously reserved DMA channel. No - transfers must be in progress when the channel is - released (in addition the device must not try to - initiate transfer after the channel is released). - </para> - </listitem> - - <listitem> - <para> - <function>void isa_dmainit(int chan, u_int - bouncebufsize)</function> - </para> - <para> - Allocate a bounce buffer for use with the specified - channel. The requested size of the buffer can not exceed - 64KB. This bounce buffer will be automatically used - later if a transfer buffer happens to be not - physically contiguous or outside of the memory - accessible by the ISA bus or crossing the 64KB - boundary. If the transfers will be always done from - buffers which conform to these conditions (such as - those allocated by - <function>bus_dmamem_alloc()</function> with proper - limitations) then <function>isa_dmainit()</function> - does not have to be called. But it is quite convenient - to transfer arbitrary data using the DMA controller. - The bounce buffer will automatically care of the - scatter-gather issues. - </para> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - <emphasis>chan</emphasis> - channel number - </para> - </listitem> - <listitem> - <para> - <emphasis>bouncebufsize</emphasis> - size of the - bounce buffer in bytes - </para> - </listitem> - </itemizedlist> -<!-- </blockquote> --> -<!--</para> --> - </listitem> - - <listitem> - <para> - <function>void isa_dmastart(int flags, caddr_t addr, u_int - nbytes, int chan)</function> - </para> - <para> - Prepare to start a DMA transfer. This function must be - called to set up the DMA controller before actually - starting transfer on the device. It checks that the - buffer is contiguous and falls into the ISA memory - range, if not then the bounce buffer is automatically - used. If bounce buffer is required but not set up by - <function>isa_dmainit()</function> or too small for - the requested transfer size then the system will - panic. In case of a write request with bounce buffer - the data will be automatically copied to the bounce - buffer. - </para> - </listitem> - <listitem> - <para>flags - a bitmask determining the type of operation to - be done. The direction bits B_READ and B_WRITE are mutually - exclusive. - </para> - <!-- <blockquote> --> - <itemizedlist> - <listitem> - <para> - B_READ - read from the ISA bus into memory - </para> - </listitem> - <listitem> - <para> - B_WRITE - write from the memory to the ISA bus - </para> - </listitem> - <listitem> - <para> - B_RAW - if set then the DMA controller will remember - the buffer and after the end of transfer will - automatically re-initialize itself to repeat transfer - of the same buffer again (of course, the driver may - change the data in the buffer before initiating - another transfer in the device). If not set then the - parameters will work only for one transfer, and - <function>isa_dmastart()</function> will have to be - called again before initiating the next - transfer. Using B_RAW makes sense only if the bounce - buffer is not used. - </para> - </listitem> - </itemizedlist> -<!-- </blockquote> --> - </listitem> - <listitem> - <para> - addr - virtual address of the buffer - </para> - </listitem> - <listitem> - <para> - nbytes - length of the buffer. Must be less or equal to - 64KB. Length of 0 is not allowed: the DMA controller will - understand it as 64KB while the kernel code will - understand it as 0 and that would cause unpredictable - effects. For channels number 4 and higher the length must - be even because these channels transfer 2 bytes at a - time. In case of an odd length the last byte will not be - transferred. - </para> - </listitem> - <listitem> - <para> - chan - channel number - </para> - </listitem> - - <listitem> - <para> - <function>void isa_dmadone(int flags, caddr_t addr, int - nbytes, int chan)</function> - </para> - <para> - Synchronize the memory after device reports that transfer - is done. If that was a read operation with a bounce buffer - then the data will be copied from the bounce buffer to the - original buffer. Arguments are the same as for - <function>isa_dmastart()</function>. Flag B_RAW is - permitted but it does not affect - <function>isa_dmadone()</function> in any way. - </para> - </listitem> - - <listitem> - <para> - <function>int isa_dmastatus(int channel_number)</function> - </para> - <para> - Returns the number of bytes left in the current transfer - to be transferred. In case the flag B_READ was set in - <function>isa_dmastart()</function> the number returned - will never be equal to zero. At the end of transfer it - will be automatically reset back to the length of - buffer. The normal use is to check the number of bytes - left after the device signals that the transfer is - completed. If the number of bytes is not 0 then something - probably went wrong with that transfer. - </para> - </listitem> - - <listitem> - <para> - <function>int isa_dmastop(int channel_number)</function> - </para> - <para> - Aborts the current transfer and returns the number of - bytes left untransferred. - </para> - </listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>xxx_isa_probe</title> - <!-- Section marked up by Wylie --> - - <para> - This function probes if a device is present. If the driver - supports auto-detection of some part of device configuration - (such as interrupt vector or memory address) this - auto-detection must be done in this routine. - </para> - - <para> - As for any other bus, if the device cannot be detected or - is detected but failed the self-test or some other problem - happened then it returns a positive value of error. The - value ENXIO must be returned if the device is not - present. Other error values may mean other conditions. Zero - or negative values mean success. Most of the drivers return - zero as success. - </para> - - <para> - The negative return values are used when a PnP device - supports multiple interfaces. For example, an older - compatibility interface and a newer advanced interface which - are supported by different drivers. Then both drivers would - detect the device. The driver which returns a higher value - in the probe routine takes precedence (in other words, the - driver returning 0 has highest precedence, one returning -1 - is next, one returning -2 is after it and so on). In result - the devices which support only the old interface will be - handled by the old driver (which should return -1 from the - probe routine) while the devices supporting the new - interface as well will be handled by the new driver (which - should return 0 from the probe routine). - </para> - - <para> - The device descriptor struct xxx_softc is allocated by the - system before calling the probe routine. If the probe - routine returns an error the descriptor will be - automatically deallocated by the system. So if a probing - error occurs the driver must make sure that all the - resources it used during probe are deallocated and that - nothing keeps the descriptor from being safely - deallocated. If the probe completes successfully the - descriptor will be preserved by the system and later passed - to the routine <function>xxx_isa_attach()</function>. If a - driver returns a negative value it can not be sure that it - will have the highest priority and its attach routine will - be called. So in this case it also must release all the - resources before returning and if necessary allocate them - again in the attach routine. When - <function>xxx_isa_probe()</function> returns 0 releasing the - resources before returning is also a good idea and a - well-behaved driver should do so. But in cases where there is - some problem with releasing the resources the driver is - allowed to keep resources between returning 0 from the probe - routine and execution of the attach routine. - </para> - - <para> - A typical probe routine starts with getting the device - descriptor and unit: - </para> - - <programlisting> struct xxx_softc *sc = device_get_softc(dev); - int unit = device_get_unit(dev); - int pnperror; - int error = 0; - - sc->dev = dev; /* link it back */ - sc->unit = unit; </programlisting> - - <para> - Then check for the PnP devices. The check is carried out by - a table containing the list of PnP IDs supported by this - driver and human-readable descriptions of the device models - corresponding to these IDs. - </para> - - <programlisting> - pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev, - xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO; - </programlisting> - - <para> - The logic of ISA_PNP_PROBE is the following: If this card - (device unit) was not detected as PnP then ENOENT will be - returned. If it was detected as PnP but its detected ID does - not match any of the IDs in the table then ENXIO is - returned. Finally, if it has PnP support and it matches on - of the IDs in the table, 0 is returned and the appropriate - description from the table is set by - <function>device_set_desc()</function>. - </para> - - <para> - If a driver supports only PnP devices then the condition - would look like: - </para> - - <programlisting> if(pnperror != 0) - return pnperror; </programlisting> - - <para> - No special treatment is required for the drivers which do not - support PnP because they pass an empty PnP ID table and will - always get ENXIO if called on a PnP card. - </para> - - <para> - The probe routine normally needs at least some minimal set - of resources, such as I/O port number to find the card and - probe it. Depending on the hardware the driver may be able - to discover the other necessary resources automatically. The - PnP devices have all the resources pre-set by the PnP - subsystem, so the driver does not need to discover them by - itself. - </para> - - <para> - Typically the minimal information required to get access to - the device is the I/O port number. Then some devices allow - to get the rest of information from the device configuration - registers (though not all devices do that). So first we try - to get the port start value: - </para> - - <programlisting> sc->port0 = bus_get_resource_start(dev, - SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO; - </programlisting> - - <para> - The base port address is saved in the structure softc for - future use. If it will be used very often then calling the - resource function each time would be prohibitively slow. If - we do not get a port we just return an error. Some device - drivers can instead be clever and try to probe all the - possible ports, like this: - </para> - - <programlisting> - /* table of all possible base I/O port addresses for this device */ - static struct xxx_allports { - u_short port; /* port address */ - short used; /* flag: if this port is already used by some unit */ - } xxx_allports = { - { 0x300, 0 }, - { 0x320, 0 }, - { 0x340, 0 }, - { 0, 0 } /* end of table */ - }; - - ... - int port, i; - ... - - port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/); - if(port !=0 ) { - for(i=0; xxx_allports[i].port!=0; i++) { - if(xxx_allports[i].used || xxx_allports[i].port != port) - continue; - - /* found it */ - xxx_allports[i].used = 1; - /* do probe on a known port */ - return xxx_really_probe(dev, port); - } - return ENXIO; /* port is unknown or already used */ - } - - /* we get here only if we need to guess the port */ - for(i=0; xxx_allports[i].port!=0; i++) { - if(xxx_allports[i].used) - continue; - - /* mark as used - even if we find nothing at this port - * at least we won't probe it in future - */ - xxx_allports[i].used = 1; - - error = xxx_really_probe(dev, xxx_allports[i].port); - if(error == 0) /* found a device at that port */ - return 0; - } - /* probed all possible addresses, none worked */ - return ENXIO;</programlisting> - - <para> - Of course, normally the driver's - <function>identify()</function> routine should be used for - such things. But there may be one valid reason why it may be - better to be done in <function>probe()</function>: if this - probe would drive some other sensitive device crazy. The - probe routines are ordered with consideration of the - <literal>sensitive</literal> flag: the sensitive devices get probed first and - the rest of the devices later. But the - <function>identify()</function> routines are called before - any probes, so they show no respect to the sensitive devices - and may upset them. - </para> - - <para> - Now, after we got the starting port we need to set the port - count (except for PnP devices) because the kernel does not - have this information in the configuration file. - </para> - - <programlisting> - if(pnperror /* only for non-PnP devices */ - && bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0, - XXX_PORT_COUNT)<0) - return ENXIO;</programlisting> - - <para> - Finally allocate and activate a piece of port address space - (special values of start and end mean <quote>use those we set by - <function>bus_set_resource()</function></quote>): - </para> - - <programlisting> - sc->port0_rid = 0; - sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, - &sc->port0_rid, - /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE); - - if(sc->port0_r == NULL) - return ENXIO;</programlisting> - - <para> - Now having access to the port-mapped registers we can poke - the device in some way and check if it reacts like it is - expected to. If it does not then there is probably some - other device or no device at all at this address. - </para> - - <para> - Normally drivers do not set up the interrupt handlers until - the attach routine. Instead they do probes in the polling - mode using the <function>DELAY()</function> function for - timeout. The probe routine must never hang forever, all the - waits for the device must be done with timeouts. If the - device does not respond within the time it is probably broken - or misconfigured and the driver must return error. When - determining the timeout interval give the device some extra - time to be on the safe side: although - <function>DELAY()</function> is supposed to delay for the - same amount of time on any machine it has some margin of - error, depending on the exact CPU. - </para> - - <para> - If the probe routine really wants to check that the - interrupts really work it may configure and probe the - interrupts too. But that is not recommended. - </para> - - <programlisting> - /* implemented in some very device-specific way */ - if(error = xxx_probe_ports(sc)) - goto bad; /* will deallocate the resources before returning */ - </programlisting> - - <para> - The function <function>xxx_probe_ports()</function> may also - set the device description depending on the exact model of - device it discovers. But if there is only one supported - device model this can be as well done in a hardcoded way. - Of course, for the PnP devices the PnP support sets the - description from the table automatically. - </para> - - - <programlisting> if(pnperror) - device_set_desc(dev, "Our device model 1234"); - </programlisting> - - <para> - Then the probe routine should either discover the ranges of - all the resources by reading the device configuration - registers or make sure that they were set explicitly by the - user. We will consider it with an example of on-board - memory. The probe routine should be as non-intrusive as - possible, so allocation and check of functionality of the - rest of resources (besides the ports) would be better left - to the attach routine. - </para> - - <para> - The memory address may be specified in the kernel - configuration file or on some devices it may be - pre-configured in non-volatile configuration registers. If - both sources are available and different, which one should - be used? Probably if the user bothered to set the address - explicitly in the kernel configuration file they know what - they are doing and this one should take precedence. An - example of implementation could be: - </para> - <programlisting> - /* try to find out the config address first */ - sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/); - if(sc->mem0_p == 0) { /* nope, not specified by user */ - sc->mem0_p = xxx_read_mem0_from_device_config(sc); - - - if(sc->mem0_p == 0) - /* can't get it from device config registers either */ - goto bad; - } else { - if(xxx_set_mem0_address_on_device(sc) < 0) - goto bad; /* device does not support that address */ - } - - /* just like the port, set the memory size, - * for some devices the memory size would not be constant - * but should be read from the device configuration registers instead - * to accommodate different models of devices. Another option would - * be to let the user set the memory size as "msize" configuration - * resource which will be automatically handled by the ISA bus. - */ - if(pnperror) { /* only for non-PnP devices */ - sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/); - if(sc->mem0_size == 0) /* not specified by user */ - sc->mem0_size = xxx_read_mem0_size_from_device_config(sc); - - if(sc->mem0_size == 0) { - /* suppose this is a very old model of device without - * auto-configuration features and the user gave no preference, - * so assume the minimalistic case - * (of course, the real value will vary with the driver) - */ - sc->mem0_size = 8*1024; - } - - if(xxx_set_mem0_size_on_device(sc) < 0) - goto bad; /* device does not support that size */ - - if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0, - sc->mem0_p, sc->mem0_size)<0) - goto bad; - } else { - sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/); - } </programlisting> - - <para> - Resources for IRQ and DRQ are easy to check by analogy. - </para> - - <para> - If all went well then release all the resources and return success. - </para> - - <programlisting> xxx_free_resources(sc); - return 0;</programlisting> - - <para> - Finally, handle the troublesome situations. All the - resources should be deallocated before returning. We make - use of the fact that before the structure softc is passed to - us it gets zeroed out, so we can find out if some resource - was allocated: then its descriptor is non-zero. - </para> - - <programlisting> bad: - - xxx_free_resources(sc); - if(error) - return error; - else /* exact error is unknown */ - return ENXIO;</programlisting> - - <para> - That would be all for the probe routine. Freeing of - resources is done from multiple places, so it is moved to a - function which may look like: - </para> - -<programlisting>static void - xxx_free_resources(sc) - struct xxx_softc *sc; - { - /* check every resource and free if not zero */ - - /* interrupt handler */ - if(sc->intr_r) { - bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie); - bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid, - sc->intr_r); - sc->intr_r = 0; - } - - /* all kinds of memory maps we could have allocated */ - if(sc->data_p) { - bus_dmamap_unload(sc->data_tag, sc->data_map); - sc->data_p = 0; - } - if(sc->data) { /* sc->data_map may be legitimately equal to 0 */ - /* the map will also be freed */ - bus_dmamem_free(sc->data_tag, sc->data, sc->data_map); - sc->data = 0; - } - if(sc->data_tag) { - bus_dma_tag_destroy(sc->data_tag); - sc->data_tag = 0; - } - - ... free other maps and tags if we have them ... - - if(sc->parent_tag) { - bus_dma_tag_destroy(sc->parent_tag); - sc->parent_tag = 0; - } - - /* release all the bus resources */ - if(sc->mem0_r) { - bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid, - sc->mem0_r); - sc->mem0_r = 0; - } - ... - if(sc->port0_r) { - bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid, - sc->port0_r); - sc->port0_r = 0; - } - }</programlisting> - - </sect1> - - <sect1> - <title>xxx_isa_attach</title> - <!-- Section Marked up by Wylie --> - - <para>The attach routine actually connects the driver to the - system if the probe routine returned success and the system - had chosen to attach that driver. If the probe routine - returned 0 then the attach routine may expect to receive the - device structure softc intact, as it was set by the probe - routine. Also if the probe routine returns 0 it may expect - that the attach routine for this device shall be called at - some point in the future. If the probe routine returns a - negative value then the driver may make none of these - assumptions. - </para> - - <para>The attach routine returns 0 if it completed successfully or - error code otherwise. - </para> - - <para>The attach routine starts just like the probe routine, - with getting some frequently used data into more accessible - variables. - </para> - - <programlisting> struct xxx_softc *sc = device_get_softc(dev); - int unit = device_get_unit(dev); - int error = 0;</programlisting> - - <para>Then allocate and activate all the necessary - resources. Because normally the port range will be released - before returning from probe, it has to be allocated - again. We expect that the probe routine had properly set all - the resource ranges, as well as saved them in the structure - softc. If the probe routine had left some resource allocated - then it does not need to be allocated again (which would be - considered an error). - </para> - - <programlisting> sc->port0_rid = 0; - sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port0_rid, - /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE); - - if(sc->port0_r == NULL) - return ENXIO; - - /* on-board memory */ - sc->mem0_rid = 0; - sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem0_rid, - /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE); - - if(sc->mem0_r == NULL) - goto bad; - - /* get its virtual address */ - sc->mem0_v = rman_get_virtual(sc->mem0_r);</programlisting> - - <para>The DMA request channel (DRQ) is allocated likewise. To - initialize it use functions of the - <function>isa_dma*()</function> family. For example: - </para> - - <para><function>isa_dmacascade(sc->drq0);</function></para> - - <para>The interrupt request line (IRQ) is a bit - special. Besides allocation the driver's interrupt handler - should be associated with it. Historically in the old ISA - drivers the argument passed by the system to the interrupt - handler was the device unit number. But in modern drivers - the convention suggests passing the pointer to structure - softc. The important reason is that when the structures - softc are allocated dynamically then getting the unit number - from softc is easy while getting softc from the unit number is - difficult. Also this convention makes the drivers for - different buses look more uniform and allows them to share - the code: each bus gets its own probe, attach, detach and - other bus-specific routines while the bulk of the driver - code may be shared among them. - </para> - - <programlisting> - sc->intr_rid = 0; - sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->intr_rid, - /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE); - - if(sc->intr_r == NULL) - goto bad; - - /* - * XXX_INTR_TYPE is supposed to be defined depending on the type of - * the driver, for example as INTR_TYPE_CAM for a CAM driver - */ - error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE, - (driver_intr_t *) xxx_intr, (void *) sc, &sc->intr_cookie); - if(error) - goto bad; - - </programlisting> - - - <para>If the device needs to make DMA to the main memory then - this memory should be allocated like described before: - </para> - - <programlisting> error=bus_dma_tag_create(NULL, /*alignment*/ 4, - /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT, - /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL, - /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT, - /*nsegments*/ BUS_SPACE_UNRESTRICTED, - /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0, - &sc->parent_tag); - if(error) - goto bad; - - /* many things get inherited from the parent tag - * sc->data is supposed to point to the structure with the shared data, - * for example for a ring buffer it could be: - * struct { - * u_short rd_pos; - * u_short wr_pos; - * char bf[XXX_RING_BUFFER_SIZE] - * } *data; - */ - error=bus_dma_tag_create(sc->parent_tag, 1, - 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL, - /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1, - /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0, - &sc->data_tag); - if(error) - goto bad; - - error = bus_dmamem_alloc(sc->data_tag, &sc->data, /* flags*/ 0, - &sc->data_map); - if(error) - goto bad; - - /* xxx_alloc_callback() just saves the physical address at - * the pointer passed as its argument, in this case &sc->data_p. - * See details in the section on bus memory mapping. - * It can be implemented like: - * - * static void - * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg, - * int nseg, int error) - * { - * *(bus_addr_t *)arg = seg[0].ds_addr; - * } - */ - bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data, - sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p, - /*flags*/0);</programlisting> - - - <para>After all the necessary resources are allocated the - device should be initialized. The initialization may include - testing that all the expected features are functional.</para> - - <programlisting> if(xxx_initialize(sc) < 0) - goto bad; </programlisting> - - - <para>The bus subsystem will automatically print on the - console the device description set by probe. But if the - driver wants to print some extra information about the - device it may do so, for example:</para> - - <programlisting> - device_printf(dev, "has on-card FIFO buffer of %d bytes\n", sc->fifosize); - </programlisting> - - <para>If the initialization routine experiences any problems - then printing messages about them before returning error is - also recommended.</para> - - <para>The final step of the attach routine is attaching the - device to its functional subsystem in the kernel. The exact - way to do it depends on the type of the driver: a character - device, a block device, a network device, a CAM SCSI bus - device and so on.</para> - - <para>If all went well then return success.</para> - - <programlisting> error = xxx_attach_subsystem(sc); - if(error) - goto bad; - - return 0; </programlisting> - - <para>Finally, handle the troublesome situations. All the - resources should be deallocated before returning an - error. We make use of the fact that before the structure - softc is passed to us it gets zeroed out, so we can find out - if some resource was allocated: then its descriptor is - non-zero.</para> - - <programlisting> bad: - - xxx_free_resources(sc); - if(error) - return error; - else /* exact error is unknown */ - return ENXIO;</programlisting> - - <para>That would be all for the attach routine.</para> - - </sect1> - - - <sect1> - <title>xxx_isa_detach</title> - - <para> - If this function is present in the driver and the driver is - compiled as a loadable module then the driver gets the - ability to be unloaded. This is an important feature if the - hardware supports hot plug. But the ISA bus does not support - hot plug, so this feature is not particularly important for - the ISA devices. The ability to unload a driver may be - useful when debugging it, but in many cases installation of - the new version of the driver would be required only after - the old version somehow wedges the system and a reboot will be - needed anyway, so the efforts spent on writing the detach - routine may not be worth it. Another argument that - unloading would allow upgrading the drivers on a production - machine seems to be mostly theoretical. Installing a new - version of a driver is a dangerous operation which should - never be performed on a production machine (and which is not - permitted when the system is running in secure mode). Still, - the detach routine may be provided for the sake of - completeness. - </para> - - <para> - The detach routine returns 0 if the driver was successfully - detached or the error code otherwise. - </para> - - <para> - The logic of detach is a mirror of the attach. The first - thing to do is to detach the driver from its kernel - subsystem. If the device is currently open then the driver - has two choices: refuse to be detached or forcibly close and - proceed with detach. The choice used depends on the ability - of the particular kernel subsystem to do a forced close and - on the preferences of the driver's author. Generally the - forced close seems to be the preferred alternative. - <programlisting> struct xxx_softc *sc = device_get_softc(dev); - int error; - - error = xxx_detach_subsystem(sc); - if(error) - return error;</programlisting> - </para> - <para> - Next the driver may want to reset the hardware to some - consistent state. That includes stopping any ongoing - transfers, disabling the DMA channels and interrupts to - avoid memory corruption by the device. For most of the - drivers this is exactly what the shutdown routine does, so - if it is included in the driver we can just call it. - </para> - <para><function>xxx_isa_shutdown(dev);</function></para> - - <para> - And finally release all the resources and return success. - <programlisting> xxx_free_resources(sc); - return 0;</programlisting> - - </para> - </sect1> - - <sect1> - <title>xxx_isa_shutdown</title> - - <para> - This routine is called when the system is about to be shut - down. It is expected to bring the hardware to some - consistent state. For most of the ISA devices no special - action is required, so the function is not really necessary - because the device will be re-initialized on reboot - anyway. But some devices have to be shut down with a special - procedure, to make sure that they will be properly detected - after soft reboot (this is especially true for many devices - with proprietary identification protocols). In any case - disabling DMA and interrupts in the device registers and - stopping any ongoing transfers is a good idea. The exact - action depends on the hardware, so we do not consider it here - in any detail. - </para> - </sect1> - - <sect1> - <title>xxx_intr</title> - - <para> - The interrupt handler is called when an interrupt is - received which may be from this particular device. The ISA - bus does not support interrupt sharing (except in some special - cases) so in practice if the interrupt handler is called - then the interrupt almost for sure came from its - device. Still, the interrupt handler must poll the device - registers and make sure that the interrupt was generated by - its device. If not it should just return. - </para> - - <para> - The old convention for the ISA drivers was getting the - device unit number as an argument. This is obsolete, and the - new drivers receive whatever argument was specified for them - in the attach routine when calling - <function>bus_setup_intr()</function>. By the new convention - it should be the pointer to the structure softc. So the - interrupt handler commonly starts as: - </para> - - <programlisting> - static void - xxx_intr(struct xxx_softc *sc) - { - - </programlisting> - - <para> - It runs at the interrupt priority level specified by the - interrupt type parameter of - <function>bus_setup_intr()</function>. That means that all - the other interrupts of the same type as well as all the - software interrupts are disabled. - </para> - - <para> - To avoid races it is commonly written as a loop: - </para> - - <programlisting> - while(xxx_interrupt_pending(sc)) { - xxx_process_interrupt(sc); - xxx_acknowledge_interrupt(sc); - } </programlisting> - - <para> - The interrupt handler has to acknowledge interrupt to the - device only but not to the interrupt controller, the system - takes care of the latter. - </para> - - </sect1> -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/jail/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/jail/chapter.sgml deleted file mode 100644 index 7de06d5182..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/jail/chapter.sgml +++ /dev/null @@ -1,611 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="jail"> - <chapterinfo> - <author><firstname>Evan Sarmiento</firstname> - <affiliation><address><email>evms@cs.bu.edu</email></address> - </affiliation> - </author> - <copyright> - <year>2001</year> - <holder role="mailto:evms@cs.bu.edu">Evan Sarmiento</holder> - </copyright> - </chapterinfo> - <title>The Jail Subsystem</title> - - <para>On most UNIX systems, root has omnipotent power. This promotes - insecurity. If an attacker were to gain root on a system, he would - have every function at his fingertips. In FreeBSD there are - sysctls which dilute the power of root, in order to minimize the - damage caused by an attacker. Specifically, one of these functions - is called secure levels. Similarly, another function which is - present from FreeBSD 4.0 and onward, is a utility called - &man.jail.8;. <application>Jail</application> chroots an - environment and sets certain restrictions on processes which are - forked from within. For example, a jailed process cannot affect - processes outside of the jail, utilize certain system calls, or - inflict any damage on the main computer.</para> - - <para><application>Jail</application> is becoming the new security - model. People are running potentially vulnerable servers such as - Apache, BIND, and sendmail within jails, so that if an attacker - gains root within the <application>Jail</application>, it is only - an annoyance, and not a devastation. This article focuses on the - internals (source code) of <application>Jail</application> and - <application>Jail</application> NG. It will also suggest - improvements upon the jail code base which are already being - worked on. If you are looking for a how-to on setting up a - <application>Jail</application>, I suggest you look at my other - article in Sys Admin Magazine, May 2001, entitled "Securing - FreeBSD using <application>Jail</application>."</para> - - <sect1> - <title>Architecture</title> - - <para> - <application>Jail</application> consists of two realms: the - user-space program, jail, and the code implemented within the - kernel: the <literal>jail()</literal> system call and associated - restrictions. I will be discussing the user-space program and - then how jail is implemented within the kernel.</para> - - <sect2> - <title>Userland code</title> - - <para>The source for the user-land jail is located in - <filename>/usr/src/usr.sbin/jail</filename>, consisting of - one file, <filename>jail.c</filename>. The program takes these - arguments: the path of the jail, hostname, ip address, and the - command to be executed.</para> - - <sect3> - <title>Data Structures</title> - - <para>In <filename>jail.c</filename>, the first thing I would - note is the declaration of an important structure - <literal>struct jail j</literal>; which was included from - <filename>/usr/include/sys/jail.h</filename>. - - <para>The definition of the jail structure is:</para> - -<programlisting><filename>/usr/include/sys/jail.h</filename>: - -struct jail { - u_int32_t version; - char *path; - char *hostname; - u_int32_t ip_number; -};</programlisting> - - <para>As you can see, there is an entry for each of the - arguments passed to the jail program, and indeed, they are - set during it's execution.</para> - - <programlisting><filename>/usr/src/usr.sbin/jail.c</filename> -j.version = 0; -j.path = argv[1]; -j.hostname = argv[2];</programlisting> - - </sect3> - - <sect3> - <title>Networking</title> - - <para>One of the arguments passed to the Jail program is an IP - address with which the jail can be accessed over the - network. Jail translates the ip address given into network - byte order and then stores it in j (the jail structure).</para> - - <programlisting><filename>/usr/src/usr.sbin/jail/jail.c</filename>: -struct in.addr in; -... -i = inet.aton(argv[3], <![CDATA[&in]]>); -... -j.ip_number = ntohl(in.s.addr);</programlisting> - - <para>The - <citerefentry><refentrytitle>inet_aton</refentrytitle><manvolnum>3</manvolnum></citerefentry> - function "interprets the specified character string as an - Internet address, placing the address into the structure - provided." The ip number node in the jail structure is set - only when the ip address placed onto the in structure by - inet aton is translated into network byte order by - <function>ntohl()</function>.</para> - - </sect3> - - <sect3> - <title>Jailing The Process</title> - - <para>Finally, the userland program jails the process, and - executes the command specified. Jail now becomes an - imprisoned process itself and forks a child process which - then executes the command given using &man.execv.3; - - <programlisting><filename>/usr/src/sys/usr.sbin/jail/jail.c</filename> -i = jail(<![CDATA[&j]]>); -... -i = execv(argv[4], argv + 4);</programlisting> - - <para>As you can see, the jail function is being called, and - its argument is the jail structure which has been filled - with the arguments given to the program. Finally, the - program you specify is executed. I will now discuss how Jail - is implemented within the kernel.</para> - </sect3> - </sect2> - - <sect2> - <title>Kernel Space</title> - - <para>We will now be looking at the file - <filename>/usr/src/sys/kern/kern_jail.c</filename>. This is - the file where the jail system call, appropriate sysctls, and - networking functions are defined.</para> - - <sect3> - <title>sysctls</title> - - <para>In <filename>kern_jail.c</filename>, the following - sysctls are defined:</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c:</filename> - -int jail_set_hostname_allowed = 1; -SYSCTL_INT(_jail, OID_AUTO, set_hostname_allowed, CTLFLAG_RW, - <![CDATA[&jail]]>_set_hostname_allowed, 0, - "Processes in jail can set their hostnames"); - -int jail_socket_unixiproute_only = 1; -SYSCTL_INT(_jail, OID_AUTO, socket_unixiproute_only, CTLFLAG_RW, - <![CDATA[&jail]]>_socket_unixiproute_only, 0, - "Processes in jail are limited to creating UNIX/IPv4/route sockets only -"); - -int jail_sysvipc_allowed = 0; -SYSCTL_INT(_jail, OID_AUTO, sysvipc_allowed, CTLFLAG_RW, - <![CDATA[&jail]]>_sysvipc_allowed, 0, - "Processes in jail can use System V IPC primitives");</programlisting> - - <para>Each of these sysctls can be accessed by the user - through the sysctl program. Throughout the kernel, these - specific sysctls are recognized by their name. For example, - the name of the first sysctl is - <literal>jail.set.hostname.allowed</literal>.</para> - </sect3> - - <sect3> - <title>&man.jail.2; system call</title> - - <para>Like all system calls, the &man.jail.2; system call takes - two arguments, <literal>struct proc *p</literal> and - <literal>struct jail_args - *uap</literal>. <literal>p</literal> is a pointer to a proc - structure which describes the calling process. In this - context, uap is a pointer to a structure which specifies the - arguments given to &man.jail.2; from the userland program - <filename>jail.c</filename>. When I described the userland - program before, you saw that the &man.jail.2; system call was - given a jail structure as its own argument.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c:</filename> -int -jail(p, uap) - struct proc *p; - struct jail_args /* { - syscallarg(struct jail *) jail; - } */ *uap;</programlisting> - - <para>Therefore, <literal>uap->jail</literal> would access the - jail structure which was passed to the system call. Next, - the system call copies the jail structure into kernel space - using the <literal>copyin()</literal> - function. <literal>copyin()</literal> takes three arguments: - the data which is to be copied into kernel space, - <literal>uap->jail</literal>, where to store it, - <literal>j</literal> and the size of the storage. The jail - structure <literal>uap->jail</literal> is copied into kernel - space and stored in another jail structure, - <literal>j</literal>.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c: </filename> -error = copyin(uap->jail, <![CDATA[&j]]>, sizeof j);</programlisting> - - <para>There is another important structure defined in - jail.h. It is the prison structure - (<literal>pr</literal>). The prison structure is used - exclusively within kernel space. The &man.jail.2; system call - copies everything from the jail structure onto the prison - structure. Here is the definition of the prison structure.</para> - - <programlisting><filename>/usr/include/sys/jail.h</filename>: -struct prison { - int pr_ref; - char pr_host[MAXHOSTNAMELEN]; - u_int32_t pr_ip; - void *pr_linux; -};</programlisting> - - <para>The jail() system call then allocates memory for a - pointer to a prison structure and copies data between the two - structures.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c</filename>: - MALLOC(pr, struct prison *, sizeof *pr , M_PRISON, M_WAITOK); - bzero((caddr_t)pr, sizeof *pr); - error = copyinstr(j.hostname, <![CDATA[&pr->pr_host]]>, sizeof pr->pr_host, 0); - if (error) - goto bail;</programlisting> - - <para>Finally, the jail system call chroots the path - specified. The chroot function is given two arguments. The - first is p, which represents the calling process, the second - is a pointer to the structure chroot args. The structure - chroot args contains the path which is to be chrooted. As - you can see, the path specified in the jail structure is - copied to the chroot args structure and used.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c</filename>: -ca.path = j.path; -error = chroot(p, <![CDATA[&ca]]>);</programlisting> - - <para>These next three lines in the source are very important, - as they specify how the kernel recognizes a process as - jailed. Each process on a Unix system is described by its - own proc structure. You can see the whole proc structure in - <filename>/usr/include/sys/proc.h</filename>. For example, - the p argument in any system call is actually a pointer to - that process' proc structure, as stated before. The proc - structure contains nodes which can describe the owner's - identity (<literal>p_cred</literal>), the process resource - limits (<literal>p_limit</literal>), and so on. In the - definition of the process structure, there is a pointer to a - prison structure. (<literal>p_prison</literal>).</para> - - <programlisting><filename>/usr/include/sys/proc.h: </filename> -struct proc { -... -struct prison *p_prison; -... -};</programlisting> - - <para>In <filename>kern_jail.c</filename>, the function then - copies the pr structure, which is filled with all the - information from the original jail structure, over to the - <literal>p->p_prison</literal> structure. It then does a - bitwise OR of <literal>p->p_flag</literal> with the constant - <literal>P_JAILED</literal>, meaning that the calling - process is now recognized as jailed. The parent process of - each process, forked within the jail, is the program jail - itself, as it calls the &man.jail.2; system call. When the - program is executed through execve, it inherits the - properties of its parents proc structure, therefore it has - the <literal>p->p_flag</literal> set, and the - <literal>p->p_prison</literal> structure is filled.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c</filename> -p->p.prison = pr; -p->p.flag |= P.JAILED;</programlisting> - - <para>When a process is forked from a parent process, the - &man.fork.2; system call deals differently with imprisoned - processes. In the fork system call, there are two pointers - to a <literal>proc</literal> structure <literal>p1</literal> - and <literal>p2</literal>. <literal>p1</literal> points to - the parent's <literal>proc</literal> structure and p2 points - to the child's unfilled <literal>proc</literal> - structure. After copying all relevant data between the - structures, &man.fork.2; checks if the structure - <literal>p->p_prison</literal> is filled on - <literal>p2</literal>. If it is, it increments the - <literal>pr.ref</literal> by one, and sets the - <literal>p_flag</literal> to one on the child process.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_fork.c</filename>: -if (p2->p_prison) { - p2->p_prison->pr_ref++; - p2->p_flag |= P_JAILED; -}</programlisting> - - </sect3> - </sect2> - </sect1> - - <sect1> - <title>Restrictions</title> - - <para>Throughout the kernel there are access restrictions relating - to jailed processes. Usually, these restrictions only check if - the process is jailed, and if so, returns an error. For - example:</para> - - <programlisting>if (p->p_prison) - return EPERM;</programlisting> - - <sect2> - <title>SysV IPC</title> - - <para>System V IPC is based on messages. Processes can send each - other these messages which tell them how to act. The functions - which deal with messages are: <literal>msgsys</literal>, - <literal>msgctl</literal>, <literal>msgget</literal>, - <literal>msgsend</literal> and <literal>msgrcv</literal>. - Earlier, I mentioned that there were certain sysctls you could - turn on or off in order to affect the behavior of Jail. One of - these sysctls was <literal>jail_sysvipc_allowed</literal>. On - most systems, this sysctl is set to 0. If it were set to 1, it - would defeat the whole purpose of having a jail; privleged - users from within the jail would be able to affect processes - outside of the environment. The difference between a message - and a signal is that the message only consists of the signal - number.</para> - - <para><filename>/usr/src/sys/kern/sysv_msg.c</filename>:</para> - - <itemizedlist> - <listitem> <para>&man.msgget.3;: msgget returns (and possibly - creates) a message descriptor that designates a message queue - for use in other system calls.</para></listitem> - - <listitem> <para>&man.msgctl.3;: Using this function, a process - can query the status of a message - descriptor.</para></listitem> - - <listitem> <para>&man.msgsnd.3;: msgsnd sends a message to a - process.</para></listitem> - - <listitem> <para>&man.msgrcv.3;: a process receives messages using - this function</para></listitem> - - </itemizedlist> - - <para>In each of these system calls, there is this - conditional:</para> - - <programlisting><filename>/usr/src/sys/kern/sysv msg.c</filename>: -if (!jail.sysvipc.allowed && p->p_prison != NULL) - return (ENOSYS);</programlisting> - - <para>Semaphore system calls allow processes to synchronize - execution by doing a set of operations atomically on a set of - semaphores. Basically semaphores provide another way for - processes lock resources. However, process waiting on a - semaphore, that is being used, will sleep until the resources - are relinquished. The following semaphore system calls are - blocked inside a jail: <literal>semsys</literal>, - <literal>semget</literal>, <literal>semctl</literal> and - <literal>semop</literal>.</para> - - <para><filename>/usr/src/sys/kern/sysv_sem.c</filename>:</para> - - <itemizedlist> - <listitem> - <para>&man.semctl.2;<literal>(id, num, cmd, arg)</literal>: - Semctl does the specified cmd on the semaphore queue - indicated by id.</para></listitem> - - <listitem> - <para>&man.semget.2;<literal>(key, nsems, flag)</literal>: - Semget creates an array of semaphores, corresponding to - key.</para> - - <para><literal>Key and flag take on the same meaning as they - do in msgget.</literal></para></listitem> - - <listitem><para>&man.semop.2;<literal>(id, ops, num)</literal>: - Semop does the set of semaphore operations in the array of - structures ops, to the set of semaphores identified by - id.</para></listitem> - </itemizedlist> - - <para>System V IPC allows for processes to share - memory. Processes can communicate directly with each other by - sharing parts of their virtual address space and then reading - and writing data stored in the shared memory. These system - calls are blocked within a jailed environment: <literal>shmdt, - shmat, oshmctl, shmctl, shmget</literal>, and - <literal>shmsys</literal>.</para> - - <para><filename>/usr/src/sys/kern/sysv shm.c</filename>:</para> - - <itemizedlist> - <listitem><para>&man.shmctl.2;<literal>(id, cmd, buf)</literal>: - shmctl does various control operations on the shared memory - region identified by id.</para></listitem> - - <listitem><para>&man.shmget.2;<literal>(key, size, - flag)</literal>: shmget accesses or creates a shared memory - region of size bytes.</para></listitem> - - <listitem><para>&man.shmat.2;<literal>(id, addr, flag)</literal>: - shmat attaches a shared memory region identified by id to the - address space of a process.</para></listitem> - - <listitem><para>&man.shmdt.2;<literal>(addr)</literal>: shmdt - detaches the shared memory region previously attached at - addr.</para></listitem> - - </itemizedlist> - </sect2> - - <sect2> - <title>Sockets</title> - - <para>Jail treats the &man.socket.2; system call and related - lower-level socket functions in a special manner. In order to - determine whether a certain socket is allowed to be created, - it first checks to see if the sysctl - <literal>jail.socket.unixiproute.only</literal> is set. If - set, sockets are only allowed to be created if the family - specified is either <literal>PF_LOCAL</literal>, - <literal>PF_INET</literal> or - <literal>PF_ROUTE</literal>. Otherwise, it returns an - error.</para> - - <programlisting><filename>/usr/src/sys/kern/uipc_socket.c</filename>: -int socreate(dom, aso, type, proto, p) -... -register struct protosw *prp; -... -{ - if (p->p_prison && jail_socket_unixiproute_only && - prp->pr_domain->dom_family != PR_LOCAL && prp->pr_domain->dom_family != PF_INET - && prp->pr_domain->dom_family != PF_ROUTE) - return (EPROTONOSUPPORT); -... -}</programlisting> - - </sect2> - - <sect2> - <title>Berkeley Packet Filter</title> - - <para>The Berkeley Packet Filter provides a raw interface to - data link layers in a protocol independent fashion. The - function <literal>bpfopen()</literal> opens an Ethernet - device. There is a conditional which disallows any jailed - processes from accessing this function.</para> - - <programlisting><filename>/usr/src/sys/net/bpf.c</filename>: -static int bpfopen(dev, flags, fmt, p) -... -{ - if (p->p_prison) - return (EPERM); -... -}</programlisting> - - </sect2> - - <sect2> - <title>Protocols</title> - - <para>There are certain protocols which are very common, such as - TCP, UDP, IP and ICMP. IP and ICMP are on the same level: the - network layer 2. There are certain precautions which are - taken in order to prevent a jailed process from binding a - protocol to a certain port only if the <literal>nam</literal> - parameter is set. nam is a pointer to a sockaddr structure, - which describes the address on which to bind the service. A - more exact definition is that sockaddr "may be used as a - template for reffering to the identifying tag and length of - each address"[2]. In the function in - <literal>pcbbind</literal>, <literal>sin</literal> is a - pointer to a sockaddr.in structure, which contains the port, - address, length and domain family of the socket which is to be - bound. Basically, this disallows any processes from jail to be - able to specify the domain family.</para> - - <programlisting><filename>/usr/src/sys/kern/netinet/in_pcb.c</filename>: -int in.pcbbind(int, nam, p) -... - struct sockaddr *nam; - struct proc *p; -{ - ... - struct sockaddr.in *sin; - ... - if (nam) { - sin = (struct sockaddr.in *)nam; - ... - if (sin->sin_addr.s_addr != INADDR_ANY) - if (prison.ip(p, 0, <![CDATA[&sin]]>->sin.addr.s_addr)) - return (EINVAL); - .... - } -... -}</programlisting> - - <para>You might be wondering what function - <literal>prison_ip()</literal> does. prison.ip is given three - arguments, the current process (represented by - <literal>p</literal>), any flags, and an ip address. It - returns 1 if the ip address belongs to a jail or 0 if it does - not. As you can see from the code, if it is indeed an ip - address belonging to a jail, the protcol is not allowed to - bind to a certain port.</para> - - <programlisting><filename>/usr/src/sys/kern/kern_jail.c:</filename> -int prison_ip(struct proc *p, int flag, u_int32_t *ip) { - u_int32_t tmp; - - if (!p->p_prison) - return (0); - if (flag) - tmp = *ip; - else tmp = ntohl (*ip); - - if (tmp == INADDR_ANY) { - if (flag) - *ip = p->p_prison->pr_ip; - else *ip = htonl(p->p_prison->pr_ip); - return (0); - } - - if (p->p_prison->pr_ip != tmp) - return (1); - return (0); -}</programlisting> - - <para>Jailed users are not allowed to bind services to an ip - which does not belong to the jail. The restriction is also - written within the function <literal>in_pcbbind</literal>:</para> - - <programlisting><filename>/usr/src/sys/net inet/in_pcb.c</filename> - if (nam) { - ... - lport = sin->sin.port; - ... if (lport) { - ... - if (p && p->p_prison) - prison = 1; - if (prison && - prison_ip(p, 0, <![CDATA[&sin]]>->sin_addr.s_addr)) - return (EADDRNOTAVAIL);</programlisting> - - </sect2> - - <sect2> - <title>Filesystem</title> - - <para>Even root users within the jail are not allowed to set any - file flags, such as immutable, append, and no unlink flags, if - the securelevel is greater than 0.</para> - - <programlisting>/usr/src/sys/ufs/ufs/ufs_vnops.c: -int ufs.setattr(ap) - ... -{ - if ((cred->cr.uid == 0) && (p->prison == NULL)) { - if ((ip->i_flags - & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) && - securelevel > 0) - return (EPERM); -}</programlisting> - - </sect2> - - </sect1> - - <sect1> - <title>Jail NG</title> - - <para>Jail NG is a "from-scratch re-implementation of Jail" by - Robert Watson, a FreeBSD committer. Some of the new features - include the ability to add processes to a jail, an improved - management tool, and per-jail sysctls. For example, you could - have <literal>sysvipc_permitted</literal> set on one jail while - another jail may be allowed to use System V IPC. You can - download the kernel patches and utilities for Jail NG from his - website at: - <ulink - url="http://www.watson.org/~robert/jailng/"></ulink>.</para> - - </sect1> - -</chapter> - diff --git a/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml deleted file mode 100644 index f8fd4d9851..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml +++ /dev/null @@ -1,298 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="kernel-objects"> - <title>Kernel Objects</title> - - <para>Kernel Objects, or <firstterm>Kobj</firstterm> provides an - object-oriented C programming system for the kernel. As such the - data being operated on carries the description of how to operate - on it. This allows operations to be added and removed from an - interface at run time and without breaking binary - compatibility.</para> - - <sect1> - <title>Terminology</title> - - <variablelist> - <varlistentry> - <term>Object</term> - <listitem><para>A set of data - data structure - data - allocation.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Method</term> - <listitem> - <para>An operation - function.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Class</term> - <listitem> - <para>One or more methods.</para> - </listitem> - </varlistentry> - <varlistentry> - <term>Interface</term> - <listitem> - <para>A standard set of one or more methods.</para> - </listitem> - </varlistentry> - </variablelist> - </sect1> - - <sect1> - <title>Kobj Operation</title> - - <para>Kobj works by generating descriptions of methods. Each - description holds a unique id as well as a default function. The - description's address is used to uniquely identify the method - within a class' method table.</para> - - <para>A class is built by creating a method table associating one - or more functions with method descriptions. Before use the class - is compiled. The compilation allocates a cache and associates it - with the class. A unique id is assigned to each method - description within the method table of the class if not already - done so by another referencing class compilation. For every - method to be used a function is generated by script to qualify - arguments and automatically reference the method description for - a lookup. The generated function looks up the method by using - the unique id associated with the method description as a hash - into the cache associated with the object's class. If the method - is not cached the generated function proceeds to use the class' - table to find the method. If the method is found then the - associated function within the class is used; otherwise, the - default function associated with the method description is - used.</para> - - <para>These indirections can be visualized as the - following:</para> - - <programlisting>object->cache<->class</programlisting> - - </sect1> - - <sect1> - <title>Using Kobj</title> - - <sect2> - <title>Structures</title> - - <programlisting>struct kobj_method</programlisting> - </sect2> - - <sect2> - <title>Functions</title> - - <programlisting>void kobj_class_compile(kobj_class_t cls); -void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops); -void kobj_class_free(kobj_class_t cls); -kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags); -void kobj_init(kobj_t obj, kobj_class_t cls); -void kobj_delete(kobj_t obj, struct malloc_type *mtype);</programlisting> - </sect2> - - <sect2> - <title>Macros</title> - - <programlisting>KOBJ_CLASS_FIELDS -KOBJ_FIELDS -DEFINE_CLASS(name, methods, size) -KOBJMETHOD(NAME, FUNC)</programlisting> - </sect2> - - <sect2> - <title>Headers</title> - - <programlisting><sys/param.h> -<sys/kobj.h></programlisting> - </sect2> - - <sect2> - <title>Creating an interface template</title> - - <para>The first step in using Kobj is to create an - Interface. Creating the interface involves creating a template - that the script - <filename>src/sys/kern/makeobjops.pl</filename> can use to - generate the header and code for the method declarations and - method lookup functions.</para> - - <para>Within this template the following keywords are used: - <literal>#include</literal>, <literal>INTERFACE</literal>, - <literal>CODE</literal>, <literal>METHOD</literal>, - <literal>STATICMETHOD</literal>, and - <literal>DEFAULT</literal>.</para> - - <para>The <literal>#include</literal> statement and what follows - it is copied verbatim to the head of the generated code - file.</para> - - <para>For example:</para> - - <programlisting>#include <sys/foo.h></programlisting> - - <para>The <literal>INTERFACE</literal> keyword is used to define - the interface name. This name is concatenated with each method - name as [interface name]_[method name]. Its syntax is - INTERFACE [interface name];.</para> - - <para>For example:</para> - - <programlisting>INTERFACE foo;</programlisting> - - <para>The <literal>CODE</literal> keyword copies its arguments - verbatim into the code file. Its syntax is - <literal>CODE { [whatever] };</literal></para> - - <para>For example:</para> - - <programlisting>CODE { - struct foo * foo_alloc_null(struct bar *) - { - return NULL; -} -};</programlisting> - - <para>The <literal>METHOD</literal> keyword describes a method. Its syntax is - <literal>METHOD [return type] [method name] { [object [, - arguments]] };</literal></para> - - <para>For example:</para> - - <programlisting>METHOD int bar { - struct object *; - struct foo *; - struct bar; -};</programlisting> - - <para>The <literal>DEFAULT</literal> keyword may follow the - <literal>METHOD</literal> keyword. It extends the - <literal>METHOD</literal> key word to include the default - function for method. The extended syntax is - <literal>METHOD [return type] [method name] { - [object; [other arguments]] }DEFAULT [default - function];</literal></para> - - <para>For example:</para> - - <programlisting>METHOD int bar { - struct object *; - struct foo *; - int bar; -} DEFAULT foo_hack;</programlisting> - - <para>The <literal>STATICMETHOD</literal> keyword is used like - the <literal>METHOD</literal> keyword except the kobj data is not - at the head of the object structure so casting to kobj_t would - be incorrect. Instead <literal>STATICMETHOD</literal> relies on the Kobj data being - referenced as 'ops'. This is also useful for calling - methods directly out of a class's method table.</para> - - <para>Other complete examples:</para> - - <programlisting>src/sys/kern/bus_if.m -src/sys/kern/device_if.m</programlisting> - - </sect2> - - <sect2> - <title>Creating a Class</title> - - <para>The second step in using Kobj is to create a class. A - class consists of a name, a table of methods, and the size of - objects if Kobj's object handling facilities are used. To - create the class use the macro - <function>DEFINE_CLASS()</function>. To create the method - table create an array of kobj_method_t terminated by a NULL - entry. Each non-NULL entry may be created using the macro - <function>KOBJMETHOD()</function>.</para> - - <para>For example:</para> - - <programlisting>DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata)); - -kobj_method_t foomethods[] = { - KOBJMETHOD(bar_doo, foo_doo), - KOBJMETHOD(bar_foo, foo_foo), - { NULL, NULL} -};</programlisting> - - <para>The class must be <quote>compiled</quote>. Depending on - the state of the system at the time that the class is to be - initialized a statically allocated cache, <quote>ops - table</quote> have to be used. This can be accomplished by - declaring a <structname>struct kobj_ops</structname> and using - <function>kobj_class_compile_static();</function> otherwise, - <function>kobj_class_compile()</function> should be used.</para> - </sect2> - - <sect2> - <title>Creating an Object</title> - - <para>The third step in using Kobj involves how to define the - object. Kobj object creation routines assume that Kobj data is - at the head of an object. If this in not appropriate you will - have to allocate the object yourself and then use - <function>kobj_init()</function> on the Kobj portion of it; - otherwise, you may use <function>kobj_create()</function> to - allocate and initialize the Kobj portion of the object - automatically. <function>kobj_init()</function> may also be - used to change the class that an object uses.</para> - - <para>To integrate Kobj into the object you should use the macro - KOBJ_FIELDS.</para> - - <para>For example</para> - - <programlisting>struct foo_data { - KOBJ_FIELDS; - foo_foo; - foo_bar; -};</programlisting> - </sect2> - - <sect2> - <title>Calling Methods</title> - - <para>The last step in using Kobj is to simply use the generated - functions to use the desired method within the object's - class. This is as simple as using the interface name and the - method name with a few modifications. The interface name - should be concatenated with the method name using a '_' - between them, all in upper case.</para> - - <para>For example, if the interface name was foo and the method - was bar then the call would be:</para> - - <programlisting>[return value = ] FOO_BAR(object [, other parameters]);</programlisting> - - </sect2> - - <sect2> - <title>Cleaning Up</title> - - <para>When an object allocated through - <function>kobj_create()</function> is no longer needed - <function>kobj_delete()</function> may be called on it, and - when a class is no longer being used - <function>kobj_class_free()</function> may be called on it.</para> - </sect2> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml deleted file mode 100644 index 00501a8d2f..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml +++ /dev/null @@ -1,333 +0,0 @@ -<!-- - The FreeBSD Documentation Project - The FreeBSD SMP Next Generation Project - - $FreeBSD$ ---> - -<chapter id="locking"> - <title>Locking Notes</title> - - <para><emphasis>This chapter is maintained by the FreeBSD SMP Next - Generation Project. Please direct any comments or suggestions - to its &a.smp;.</emphasis></para> - - - <para>This document outlines the locking used in the FreeBSD kernel - to permit effective multi-processing within the kernel. Locking - can be achieved via several means. Data structures can be - protected by mutexes or &man.lockmgr.9; locks. A few variables - are protected simply by always using atomic operations to access - them.</para> - - <sect1> - <title>Mutexes</title> - - <para>A mutex is simply a lock used to guarantee mutual exclusion. - Specifically, a mutex may only be owned by one entity at a time. - If another entity wishes to obtain a mutex that is already - owned, it must wait until the mutex is released. In the FreeBSD - kernel, mutexes are owned by processes.</para> - - <para>Mutexes may be recursively acquired, but they are intended - to be held for a short period of time. Specifically, one may - not sleep while holding a mutex. If you need to hold a lock - across a sleep, use a &man.lockmgr.9; lock.</para> - - <para>Each mutex has several properties of interest:</para> - - <variablelist> - <varlistentry> - <term>Variable Name</term> - <listitem> - <para>The name of the <type>struct mtx</type> variable in - the kernel source.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Logical Name</term> - <listitem> - <para>The name of the mutex assigned to it by - <function>mtx_init</function>. This name is displayed in - KTR trace messages and witness errors and warnings and is - used to distinguish mutexes in the witness code.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Type</term> - <listitem> - <para>The type of the mutex in terms of the - <constant>MTX_*</constant> flags. The meaning for each - flag is related to its meaning as documented in - &man.mutex.9;.</para> - - <variablelist> - <varlistentry> - <term><constant>MTX_DEF</constant></term> - <listitem> - <para>A sleep mutex</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>MTX_SPIN</constant></term> - <listitem> - <para>A spin mutex</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>MTX_COLD</constant></term> - <listitem> - <para>This mutex is initialized very early. Thus, it - must be declared via - <function>MUTEX_DECLARE</function>, and the - <constant>MTX_COLD</constant> flag must be passed to - <function>mtx_init</function>.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>MTX_TOPHALF</constant></term> - <listitem> - <para>This spin mutex does not disable - interrupts.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><constant>MTX_NORECURSE</constant></term> - <listitem> - <para>This mutex is not allowed to recurse.</para> - </listitem> - </varlistentry> - </variablelist> - </listitem> - </varlistentry> - - <varlistentry> - <term>Protectees</term> - <listitem> - <para>A list of data structures or data structure members - that this entry protects. For data structure members, the - name will be in the form of - <structname/structure name/.<structfield/member name/.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>Dependent Functions</term> - <listitem> - <para>Functions that can only be called if this mutex is - held.</para> - </listitem> - </varlistentry> - </variablelist> - - <table frame="all" colsep="1" rowsep="1" pgwide="1"> - <title>Mutex List</title> - - <tgroup cols="5"> - <thead> - <row> - <entry>Variable Name</entry> - <entry>Logical Name</entry> - <entry>Type</entry> - <entry>Protectees</entry> - <entry>Dependent Functions</entry> - </row> - </thead> - - <!-- The scheduler lock --> - <tbody> - <row> - <entry>sched_lock</entry> - <entry><quote>sched lock</quote></entry> - <entry> - <constant>MTX_SPIN</constant> | - <constant>MTX_COLD</constant> - </entry> - <entry> - <varname>_gmonparam</varname>, - <varname>cnt.v_swtch</varname>, - <varname>cp_time</varname>, - <varname>curpriority</varname>, - <structname/mtx/.<structfield/mtx_blocked/, - <structname/mtx/.<structfield/mtx_contested/, - <structname/proc/.<structfield/p_contested/, - <structname/proc/.<structfield/p_blocked/, - <structname/proc/.<structfield/p_flag/ - (<constant>P_PROFIL</constant> XXX, - <constant>P_INMEM</constant>, - <constant>P_SINTR</constant>, - <constant>P_TIMEOUT</constant>, - <constant>P_SWAPINREQ</constant> XXX, - <constant>P_INMEN</constant> XXX), - <structname/proc/.<structfield/p_nice/, - <structname/proc/.<structfield/p_procq/, - <structname/proc/.<structfield/p_blocked/, - <structname/proc/.<structfield/p_estcpu/, - <structname/proc/.<structfield/p_nativepri/, - <structname/proc/.<structfield/p_priority/, - <structname/proc/.<structfield/p_usrpri/, - <structname/proc/.<structfield/p_rtprio/, - <structname/proc/.<structfield/p_rqindex/, - <structname/proc/.<structfield/p_stats->p_prof/, - <structname/proc/.<structfield/p_stats->p_ru/, - <structname/proc/.<structfield/p_stat/, - <structname/proc/.<structfield/p_cpticks/ - <structname/proc/.<structfield/p_iticks/, - <structname/proc/.<structfield/p_uticks/, - <structname/proc/.<structfield/p_sticks/, - <structname/proc/.<structfield/p_swtime/, - <structname/proc/.<structfield/p_slptime/, - <structname/proc/.<structfield/p_runtime/, - <structname/proc/.<structfield/p_pctcpu/, - <structname/proc/.<structfield/p_oncpu/, - <structname/proc/.<structfield/p_asleep/, - <structname/proc/.<structfield/p_wchan/, - <structname/proc/.<structfield/p_wmesg/, - <structname/proc/.<structfield/p_slpq/, - <structname/proc/.<structfield/p_vmspace/ - (XXX - in <function>statclock</function>), - <varname>pscnt</varname>, - <varname>slpque</varname>, - <varname>itqueuebits</varname>, - <varname>itqueues</varname>, - <varname>rtqueuebits</varname>, - <varname>rtqueues</varname>, - <varname>queuebits</varname>, - <varname>queues</varname>, - <varname>idqueuebits</varname>, - <varname>idqueues</varname>, - <varname>switchtime</varname>, - </entry> - <entry> - <function>setrunqueue</function>, - <function>remrunqueue</function>, - <function>mi_switch</function>, - <function>chooseproc</function>, - <function>schedclock</function>, - <function>resetpriority</function>, - <function>updatepri</function>, - <function>maybe_resched</function>, - <function>cpu_switch</function>, - <function>cpu_throw</function> - </entry> - </row> - - <!-- The vm86 pcb lock --> - <row> - <entry>vm86pcb_lock</entry> - <entry><quote>vm86pcb lock</quote></entry> - <entry> - <constant>MTX_DEF</constant> | - <constant>MTX_COLD</constant> - </entry> - <entry> - <varname>vm86pcb</varname> - </entry> - <entry> - <function>vm86_bioscall</function> - </entry> - </row> - - <!-- Giant --> - <row> - <entry>Giant</entry> - <entry><quote>Giant</quote></entry> - <entry> - <constant>MTX_DEF</constant> | - <constant>MTX_COLD</constant> - </entry> - <entry>nearly everything</entry> - <entry>lots</entry> - </row> - - <!-- The callout lock --> - <row> - <entry>callout_lock</entry> - <entry><quote>callout lock</quote></entry> - <entry> - <constant>MTX_SPIN</constant> - </entry> - <entry> - <varname>callfree</varname>, - <varname>callwheel</varname>, - <varname>nextsoftcheck</varname>, - <structname/proc/.<structfield/p_itcallout/, - <structname/proc/.<structfield/p_slpcallout/, - <varname>softticks</varname>, - <varname>ticks</varname> - </entry> - <entry> - </entry> - </row> - </tbody> - </tgroup> - </table> - </sect1> - - <sect1> - <title>Lock Manager Locks</title> - - <para>Locks that are provided via the &man.lockmgr.9; interface - are lock manager locks. These locks are reader-writer locks and - may be held by a sleeping process.</para> - - <table> - <title>&man.lockmgr.9; Lock List</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>Variable Name</entry> - <entry>Protectees</entry> - </row> - </thead> - <tbody> - <row> - <entry><varname>allproc_lock</varname></entry> - <entry> - <varname>allproc</varname> - <varname>zombproc</varname> - <varname>pidhashtbl</varname> - <structname/proc/.<structfield/p_list/ - <structname/proc/.<structfield/p_hash/ - <varname>nextpid</varname> - </entry> - <entry><varname>proctree_lock</varname></entry> - <entry> - <structname/proc/.<structfield/p_children/ - <structname/proc/.<structfield/p_sibling/ - </entry> - </row> - </tbody> - </tgroup> - </table> - </sect1> - - <sect1> - <title>Atomically Protected Variables</title> - - <para>An atomically protected variable is a special variable that - is not protected by an explicit lock. Instead, all data - accesses to the variables use special atomic operations as - described in &man.atomic.9;. Very few variables are treated - this way, although other synchronization primitives such as - mutexes are implemented with atomically protected - variables.</para> - - <itemizedlist> - <listitem> - <para><varname>astpending</varname></para> - </listitem> - - <listitem> - <para><structname/mtx/.<structfield/mtx_lock/</para> - </listitem> - </itemizedlist> - </sect1> -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/mac.ent b/en_US.ISO8859-1/books/arch-handbook/mac.ent deleted file mode 100644 index 381b994b23..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/mac.ent +++ /dev/null @@ -1,18 +0,0 @@ -<!-- - $FreeBSD$ - --> - -<!ENTITY mac.mpo "mpo"> -<!ENTITY mac.thead ' - <colspec colname="first" colwidth="0"> - <colspec colwidth="0"> - <colspec colname="last" colwidth="0"> - - <thead> - <row> - <entry>Parameter</entry> - <entry>Description</entry> - <entry>Locking</entry> - </row> - </thead> -'> diff --git a/en_US.ISO8859-1/books/arch-handbook/mac/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/mac/chapter.sgml deleted file mode 100644 index 898c2423c3..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/mac/chapter.sgml +++ /dev/null @@ -1,5716 +0,0 @@ -<!-- - Copyright (c) 2002 Networks Associates Technology, Inc. - All rights reserved. - - This software was developed for the FreeBSD Project by Chris - Costello at Safeport Network Services and NAI Labs, the Security - Research Division of Network Associates, Inc. under DARPA/SPAWAR - contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS - research program. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The names of the authors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - $FreeBSD$ ---> - -<chapter id="mac"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Chris</firstname> - <surname>Costello</surname> - - <affiliation> - <orgname>TrustedBSD Project</orgname> - <address><email>chris@FreeBSD.org</email></address> - </affiliation> - </author> - - <author> - <firstname>Robert</firstname> - <surname>Watson</surname> - - <affiliation> - <orgname>TrustedBSD Project</orgname> - <address><email>rwatson@FreeBSD.org</email></address> - </affiliation> - </author> - </authorgroup> - </chapterinfo> - - <title>Writing MAC Policies</title> - - <sect1 id="mac-synopsis"> - <title>Synopsis</title> - - <para>Mandatory Access Control (MAC) is a security feature frequently - found in commercial trusted operating systems. MAC supplements - existing Discretionary Access Control (DAC) protections (such as - file system permissions and access control lists) by allowing the - security administrator to define mandatory protections for - system objects. Mandatory protections may be distinguished from - discretionary protections in that DAC is applied at the discretion - of the object owner, whereas MAC protections are defined by the - administrator and applied to all users and objects in the system - and may not be bypassed even by object owners. A variety of - MAC policies have been explored in security research literature - as well as the commercial trusted operating system space. These - include policies such as the Multi-Level Security (MLS) - confidentiality policy, used to prevent inappropriate sharing of - information on multi-user systems, and the Biba integrity policy, - typically used to protect the integrity of system and user - services.</para> - - <para>The implementation of MAC found in FreeBSD was developed by - the TrustedBSD Project, and includes support for both a number of - specific MAC policies, and for a flexible and extensible security - framework to support the easy creation of new kernel security - policies. This framework isolates the internals of specific MAC - policies from the implementation of kernel services, and - encapsulates the policies in policy modules. Policy modules may - be added to the system without changes to the base kernel, and can - augment the kernel security policy in a variety of ways. In - addition, policies may provide a shared object implementation - of common MAC interfaces for userland applications, permitting - applications to be easily extended to manage labels for new - policies. Support is provided for setting labels on user - processes at login, as well as in a number of other locations where - user context management occurs.</para> - - <para>This chapter introduces the MAC policy userland and kernel - policy frameworks and provides documentation for a sample MAC - policy module.</para> - </sect1> - - - <sect1 id="mac-introduction"> - <title>Introduction</title> - - <para>The TrustedBSD MAC framework provides a mechanism to allow - the compile-time or run-time extension of the kernel access - control model. New system policies may be implemented as - kernel modules and linked to the kernel; if multiple policy - modules are present, their results will be composed. While the - framework is intended to support a variety of access control - models, its design was derived from the requirements of a set - of specific access control models required for the TrustedBSD - and CBOSS Projects. This includes support for fixed and - floating label Biba integrity policies, the MLS - confidentiality policy, the Type Enforcement rule-based access - control policy, and the ability to support layering of the NSA - FLASK framework above the TrustedBSD MAC framework. This - document describes the rough architecture of the framework, - with the understanding that this is a work-in-progress and may - change subtantially as requirements evolve.</para> - </sect1> - - <sect1 id="mac-kernel-arch"> - <title>Kernel Architecture</title> - - <para>The TrustedBSD MAC framework provides the opportunity for - policy modules to be augment system access control decisions. - Policies are permitted the opportunity to restrict the set of - rights available for processes at a variety of relevant points - in the kernel. In addition, they are provided the opportunity - to tag processes and various kernel objects with labels storing - access control information. Policy modules may register - interest in a subset of the total available events or objects, - and are not required to implement events or objects that are not - relevant to the policy. Multiple modules may be loaded at once, - and the results of the modules are composed as necessary to - build an over-all system policy. Policy modules may be - implemented such that they can be loaded on-demand at run-time, - or such that they may only be loaded early in the boot process. - This permits policies requiring pervasive labeling of all - objects to prevent improper use.</para> - </sect1> - - <sect1 id="mac-userland-arch"> - <title>Userland Architecture</title> - - <para>...</para> - </sect1> - - <sect1 id="mac-entry-point"> - <title>Entry Point Framework</title> - - <para>Four classes of entry points are offered to policies - registered with the framework: entry points associated with - the registration and management of policies, entry points - denoting initialization, creation, destruction, and other life - cycle events for kernel objects, events assocated with access - control decisions that the policy module may influence, and - calls associated with the management of labels on objects. In - addition, a <function>mac_syscall()</function> entry point is - provided so that policies may extend the kernel interface - without registering new system calls.</para> - - <para>Policy module writers should be aware of the kernel - locking strategy, as well as what object locks are available - during which entry points. Writers should attempt to avoid - deadlock scenarios by avoiding grabbing non-leaf locks inside - of entry points, and also follow the locking protocol for - object access and modification. In particular, writers should - be aware that while necessary locks to access objects and - their labels are generally held, sufficient locks to modify an - object or its label may not be present for all entry points. - Locking information for arguments is documented in the MAC - framework entry point document.</para> - - <para>Policy entry points will pass a reference to the object - label along with the object itself. This permits labeled - policies to be unaware of the internals of the object yet - still make decisions based on the label. The exception to this - is the process credential, which is assumed to be understood - by policies as a first class security object in the kernel. - Policies that do not implement labels on kernel objects will - be passed NULL pointers for label arguments to entry - points.</para> - - <sect2 id="policy-module-registration"> - <title>Policy Module Registration</title> - - <para>Modules may be declared using the - <function>MAC_POLICY_SET()</function> macro, which names the - policy, provides a reference to the MAC entry point vector, - provides load-time flags determining how the policy framework - should handle the policy, and optionally requests the - allocation of label state by the framework:</para> - - <programlisting>static struct mac_policy_op_entry mac_none_ops[] = -{ - { MAC_DESTROY, - (macop_t)mac_none_destroy }, - { MAC_INIT, - (macop_t)mac_none_init }, - { MAC_INIT_BPFDESC, - (macop_t)mac_none_init_bpfdesc }, -/* ... */ - { MAC_CHECK_VNODE_STAT, - (macop_t)mac_none_check_vnode_stat }, - { MAC_CHECK_VNODE_WRITE, - (macop_t)mac_none_check_vnode_write }, - { MAC_OP_LAST, NULL } -};</programlisting> - - <para>The MAC policy entry point vector, - <varname>mac_none_ops</varname> in this example, associates - functions defined in the module with specific entry points. A - complete listing of available entry points and their - prototypes may be found in the MAC entry point reference - section. Of specific interest during module registration are - the <symbol>MAC_DESTROY</symbol> and <symbol>MAC_INIT</symbol> - entry points. <symbol>MAC_INIT</symbol> will be invoked once a - policy is successfully registered with the module framework - but prior to any other entry points becoming active. This - permits the policy to perform any policy-specific allocation - and initialization, such as initialization of any data or - locks. <symbol>MAC_DESTROY</symbol> will be invoked when a - policy module is unloaded to permit releasing of any allocated - memory and destruction of locks. Currently, these two entry - points are invoked with the MAC policy list mutex held to - prevent any other entry points from being invoked: this will - be changed, but in the mean time, policies should be careful - about what kernel primitives they invoke so as to avoid lock - ordering or sleeping problems.</para> - - <para>The policy declaration's module name field exists so that - the module may be uniquely identified for the purposes of - module dependencies. An appropriate string should be selected. - The full string name of the policy is displayed to the user - via the kernel log during load and unload events, and also - exported when providing status information to userland - processes.</para> - - <para>The policy flags field permits the module to provide the - framework with information about its loader-related - capabilities. Currently, two flags are defined:</para> - - <variablelist> - <varlistentry> - <term>MPC_LOADTIME_FLAG_UNLOADOK</term> - - <listitem> - <para>This flag indicates that the policy module may be - unloaded. If this flag is not provided, then the policy - framework will reject requests to unload the module. - This flag might be used by modules that allocate label - state and are unable to free that state at - runtime.</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>MPC_LOADTIME_FLAG_NOTLATE</term> - - <listitem><para>This flag indicates that the policy module - must be loaded and initialized early in the boot - process. If the flag is specified, attempts to register - the module following boot will be rejected. The flag - may be used by policies that require pervasive labeling - of all system objects, and cannot handle objects that - have not been properly initialized by the policy.</para> - </listitem> - </varlistentry> - </variablelist> - - <sect3 id="mac-mpo-init"> - <title><function>&mac.mpo;_init</function</title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init</function></funcdef> - - <paramdef>struct mac_policy_conf - *<parameter>conf</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>conf</parameter></entry> - <entry>MAC policy definition</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Policy load event. The policy list mutex is held, so - caution should be applied.</para> - </sect3> - - <sect3 id="mpo-destroy"> - <title><function>&mac.mpo;_destroy</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy</function></funcdef> - - <paramdef>struct mac_policy_conf - *<parameter>conf</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>conf</parameter></entry> - <entry>MAC policy definition</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Policy load event. The policy list mutex is held, so - caution should be applied.</para> - </sect3> - </sect2> - - <sect2 id="mac-label-events"> - <title>Label Events</title> - - <para>This class of entry points is used by the MAC framework to - permit policies to maintain label information on kernel - objects. For each labeled kernel object of interest to a MAC - policy, entry points may be registered for relevant life cycle - events. All objects implement initialization, creation, and - destruction hooks. Some objects will also implement - relabeling, allowing user processes to change the labels on - objects. Some objects will also implement object-specific - events, such as label events associated with IP reassembly. A - typical labeled object will have the following life cycle of - entry points:</para> - - <programlisting>Label initialization o -(object-specific wait) \ -Label creation o - \ -Relabel events, o--<--. -Various object-specific, | | -Access control events ~-->--o - \ -Label destruction o</programlisting> - - <para>Label initialization permits policies to allocate memory - and set initial values for labels without context for the use - of the object. The label slot allocated to a policy will be - zero'd by default, so some policies may not need to perform - initialization.</para> - - <para>Label creation occurs when the kernel structure is - associated with an actual kernel object. For example, mbufs - may be allocated and remain unused in a pool until they are - required. mbuf allocation causes label initialization on the - mbuf to take place, but mbuf creation occurs when the mbuf is - associated with a datagram. Typically, context will be - provided for a creation event, including the circumstances of - the creation, and labels of other relevant objects in the - creation process. For example, when an mbuf is created from a - socket, the socket and its label will be presented to - registered policies in addition to the new mbuf and its label. - Memory allocation in creation events is discouraged, as it may - occur in performance sensitive ports of the kernel; in - addition, creation calls are not permitted to fail so a - failure to allocate memory cannot be reported.</para> - - <para>Object specific events do not generally fall into the - other broad classes of label events, but will generally - provide an opportunity to modify or update the label on an - object based on additional context. For example, the label on - an IP fragment reassembly queue may be updated during the - <symbol>MAC_UPDATE_IPQ</symbol> entry point as a result of the - acceptance of an additional mbuf to that queue.</para> - - <para>Access control events are discussed in detail in the - following section.</para> - - <para>Label destruction permits policies to release storage or - state associated with a label during its association with an - object so that the kernel data structures supporting the - object may be reused or released.</para> - - <para>In addition to labels associated with specific kernel - objects, an additional class of labels exists: temporary - labels. These labels are used to store update information - submitted by user processes. These labels are initialized and - destroyed as with other label types, but the creation event is - <symbol>MAC_INTERNALIZE</symbol>, which accepts a user label - to be converted to an in-kernel representation.</para> - - <sect3 id="mac-fs-label-event-ops"> - <title>File System Object Labeling Event Operations</title> - - <sect4 id="mac-mpo-create-devfs-device"> - <title><function>&mac.mpo;_create_devfs_device</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_devfs_device</function></funcdef> - - <paramdef>dev_t <parameter>dev</parameter></paramdef> - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>dev</parameter></entry> - <entry>Device corresponding with - <parameter>devfs_dirent</parameter></entry> - </row> - - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Devfs directory entry to be labeled.</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label for <parameter>devfs_dirent</parameter> - to be filled in.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the label on a devfs_dirent being created for - the passed device. This call will be made when the device - file system is mounted, regenerated, or a new device is made - available.</para> - </sect4> - - <sect4 id="mac-mpo-create-devfs-directory"> - <title><function>&mac.mpo;_create_devfs_directory</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_devfs_directory</function></funcdef> - - <paramdef>char *<parameter>dirname</parameter></paramdef> - <paramdef>int <parameter>dirnamelen</parameter></paramdef> - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>dirname</parameter></entry> - <entry>Name of directory being created</entry> - </row> - - <row> - <entry><parameter>namelen</parameter></entry> - <entry>Length of string - <parameter>dirname</parameter></entry> - </row> - - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Devfs directory entry for directory being - created.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the label on a devfs_dirent being created for - the passed directory. This call will be made when the device - file system is mounted, regenerated, or a new device - requiring a specific directory hierarchy is made - available.</para> - </sect4> - - <sect4 id="mac-mpo-create-devfs-vnode"> - <title><function>&mac.mpo;_create_devfs_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_devfs_vnode</function></funcdef> - - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>direntlabel</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Object; devfs directory entry</entry> - </row> - - <row> - <entry><parameter>direntlabel</parameter></entry> - <entry>Policy label for - <parameter>devfs_dirent</parameter></entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; file system object being labeled</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the label on the vnode being created for the - passed devfs_dirent. This call will be made when a vnode is - required to represent the specified devfs_dirent in a - mounted devfs instance.</para> - </sect4> - - <sect4 id="mac-mpo-vnode-create-from-vnode"> - <title><function>&mac.mpo;_vnode_create_from_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_vnode_create_from_vnode</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>parent</parameter></paramdef> - <paramdef>struct label - *<parameter>parentlabel</parameter></paramdef> - <paramdef>struct vnode - *<parameter>child</parameter></paramdef> - <paramdef>struct label - *<parameter>childlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>parent</parameter></entry> - <entry>Parent vnode; the directory in which - <parameter>child</parameter> is being - created</entry> - </row> - - <row> - <entry><parameter>parentlabel</parameter></entry> - <entry>Policy label for - <parameter>parent</parameter></entry> - </row> - - <row> - <entry><parameter>child</parameter></entry> - <entry>New vnode</entry> - </row> - - <row> - <entry><parameter>childlabel</parameter></entry> - <entry>Label to be filled in for - <parameter>child</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the label on the vnode being created in the - passed vnode parent by the passed subject credential. This - call will be made when a vnode is allocated during a vnode - creation operation. For example, this call is made by - multi-label file systems during the creation of a new file - or directory.</para> - </sect4> - - <sect4 id="mac-mpo-create-mount"> - <title><function>&mac.mpo;_create_mount</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mount</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>mnt</parameter></paramdef> - <paramdef>struct label - *<parameter>fslabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>mp</parameter></entry> - <entry>Object; file system being mounted</entry> - </row> - - <row> - <entry><parameter>mntlabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>mp</parameter></entry> - </row> - - <row> - <entry><parameter>fslabel</parameter></entry> - <entry>Policy label for the file system - <parameter>mp</parameter> mounts.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the labels on the mount point being created by - the passed subject credential. This call will be made when - a new file system is mounted.</para> - </sect4> - - <sect4 id="mac-mpo-create-root-mount"> - <title><function>&mac.mpo;_create_root_mount</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_root_mount</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>mntlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>fslabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry namest="first" nameend="last">See <xref - linkend="mac-mpo-create-mount">.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Fill out the labels on the mount point being created by - the passed subject credential. This call will be made when - the root file system is mounted, after - &mac.mpo;_create_mount;.</para> - </sect4> - - <sect4 id="mac-mpo-vnode-relabel"> - <title><function>&mac.mpo;_vnode_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_vnode_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>vnode to relabel</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Existing policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>New, possibly partial label to replace - <parameter>vnodelabel</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label on the passed vnode given the passed - update vnode label and the passed subject credential.</para> - </sect4> - - <sect4 id="mac-mpo-stdcreatevnode-ea"> - <title><function>&mac.mpo;_stdcreatevnode_ea</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_stdcreatevnode_ea</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>vnode to commit</entry> - <entry>Locked on entry, locked on exit</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Label associated with - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <!-- XXX extattr.9 probably needs updating... --> - <para>This entry point is called when a vnode is to be - committed to disk via the extended attribute service (see - &man.extattr.9;). If committing to the disk is successful, - a value of <returnvalue>0</returnvalue> should be returned; - otherwise, an appropriate error code should be - returned.</para> - - <note><para>The current implementation as of July 24, 2002 - commits the data to disk from within the architecture. - The implementation will be updated to be closer to the - above documentation as development progresses.</para></note> - </sect4> - - <sect4 id="mac-mpo-update-devfsdirent"> - <title><function>&mac.mpo;_update_devfsdirent</function></title> - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_update_devfsdirent</function></funcdef> - - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>direntlabel</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Object; devfs directory entry</entry> - </row> - - <row> - <entry><parameter>direntlabel</parameter></entry> - <entry>Policy label for - <parameter>devfs_dirent</parameter> to be - updated.</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Parent vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the <parameter>devfs_dirent</parameter> label - from the passed devfs vnode label. This call will be made - when a devfs vnode has been successfully relabeled to commit - the label change such that it lasts even if the vnode is - recycled. It will also be made when when a symlink is - created in devfs, following a call to - <function>mac_vnode_create_from_vnode</function> to - initialize the vnode label.</para> - </sect4> - - <sect4 id="mac-mpo-update-procfsvnode"> - <title><function>&mac.mpo;_update_procfsvnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_update_procfsvnode</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; procfs vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject; credential for the process - entry</entry> - <entry>Immutable</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the procfs vnode label from the passed subject - credential. This call will be made when an operation on a - procfs vnode requires a fresh label on a process-derived - vnode.</para> - </sect4> - - <sect4 id="mac-mpo-update-vnode-from-extattr"> - <title><function>&mac.mpo;_update_vnode_from_extattr</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_update_vnode_from_extattr</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>fslabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode whose label is being updated</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label to refresh</entry> - </row> - - <row> - <entry><parameter>mp</parameter></entry> - <entry>Mount point for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>fslabel</parameter></entry> - <entry>Policy label for <parameter>vp</parameter>'s - file system.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the vnode label by refreshing the label data from - the extended attribute service for the vnode. The mount - point <parameter>fslabel</parameter> is also made available - so that the <parameter>fslabel</parameter> may be used as a - labeling source if fallback is appropriate for the policy. - This call is permitted to fail; if the call fails, the - associated label refresh will also fail, causing the failure - of the operation requiring the MAC check and vnode label - refresh, permitting a <quote>fail closed</quote> policy if - labeling data is not available.</para> - </sect4> - - <sect4 id="mac-mpo-update-from-externalized"> - <title><function>&mac.mpo;_update_from_externalized</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_update_from_externalized</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct mac - *<parameter>extmac</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>extmac</parameter></entry> - <entry>Externalized MAC policy label</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the vnode label from the passed externalized - label loaded from disk by the MAC framework. This call is - permitted to fail; if the call fails, the associated label - refresh will also fail, causing the failure of the operation - requiring the MAC check and vnode label refresh, permitting - a <quote>fail closed</quote> policy if labeling data is not - available. This call will be obsoleted by the new extended - attribute labeling interface.</para> - </sect4> - - <sect4 id="mac-mpo-update-vnode-from-mount"> - <title><function>&mac.mpo;_update_vnode_from_mount</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_update_vnode_from_mount</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>mountlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>mp</parameter></entry> - <entry>Mount point where <parameter>vp</parameter> - resides</entry> - </row> - - <row> - <entry><parameter>fslabel</parameter></entry> - <entry>Policy label for the file system where - <parameter>vp</parameter> resides.</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the vnode label from the passed mount point - label. This call is made when a single label file system - vnode requires a label, or if the obsoleted MAC framework - externalized extended attribute read fails.</para> - </sect4> - </sect3> - - <sect3 id="mac-ipc-label-ops"> - <title>IPC Object Labeling Event Operations</title> - - <sect4 id="mac-mpo-create-mbuf-from-socket"> - <title><function>&mac.mpo;_create_mbuf_from_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_from_socket</function></funcdef> - - <paramdef>struct socket - *<parameter>so</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - <paramdef>struct mbuf *<parameter>m</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>socket</parameter></entry> - <entry>Socket</entry> - <entry>Socket locking WIP</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>socket</parameter></entry> - </row> - - <row> - <entry><parameter>m</parameter></entry> - <entry>Object; mbuf</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label to fill in for - <parameter>m</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created mbuf header from the - passed socket label. This call is made when a new datagram - or messsage is generated by the socket and stored in the - passed mbuf.</para> - </sect4> - - <sect4 id="mac-mpo-create-socket"> - <title><function>&mac.mpo;_create_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_socket</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>so</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>so</parameter></entry> - <entry>Object; socket to label</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Label to fill in for - <parameter>so</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created socket from the passed - subject credential. This call is made when a socket is - created.</para> - </sect4> - - <sect4> - <title><function>&mac.mpo;_create_socket_from_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_socket_from_socket</function></funcdef> - - <paramdef>struct socket - *<parameter>oldsocket</parameter></paramdef> - <paramdef>struct label - *<parameter>oldsocketlabel</parameter></paramdef> - <paramdef>struct socket - *<parameter>newsocket</parameter></paramdef> - <paramdef>struct label - *<parameter>newsocketlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>oldsocket</parameter></entry> - <entry>Object; parent socket; created from - &man.listen.2;</entry> - </row> - - <row> - <entry><parameter>oldsocketlabel</parameter></entry> - <entry>Label for - <parameter>oldsocket</parameter></entry> - </row> - - <row> - <entry><parameter>newsocket</parameter></entry> - <entry>Object; child socket; incoming connection</entry> - </row> - - <row> - <entry><parameter>newsocketlabel</parameter></entry> - <entry>Label to be filled in for - <parameter>newsocket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created stream socket from the - passed listen socket. This call may occur during &man.accept.2;, - or prior to &man.accept.2;, depending on the protocol.</para> - </sect4> - - <sect4 id="mac-mpo-relabel-socekt"> - <title><function>&mac.mpo;_socket_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_socket_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>so</parameter></paramdef> - <paramdef>struct label - *<parameter>oldlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>so</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>oldlabel</parameter></entry> - <entry>Current label for - <parameter>so</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Label update for - <parameter>so</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label on a socket from the passed socket - label update.</para> - </sect4> - - <sect4 id="mpo-set-socket-peer-from-mbuf"> - <title><function>&mac.mpo;_set_socket_peer_from_mbuf</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_set_socket_peer_from_mbuf</function></funcdef> - - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - <paramdef>struct label - *<parameter>oldlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>First datagram received over socket</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Label for <parameter>mbuf</parameter></entry> - </row> - - <row> - <entry><parameter>oldlabel</parameter></entry> - <entry>Current label for the socket</entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Policy label to be filled out for the - socket</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the peer label on a stream socket from the passed - mbuf label. This call will be made when the first datagram - is received by the stream socket, with the exception of Unix - domain sockets.</para> - </sect4> - - <sect4 id="mac-mpo-set-socket-peer-from-socket"> - <title><function>&mac.mpo;_set_socket_peer_from_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_set_socket_peer_from_socket</function></funcdef> - - <paramdef>struct socket - *<parameter>oldsocket</parameter></paramdef> - <paramdef>struct label - *<parameter>oldsocketlabel</parameter></paramdef> - <paramdef>struct socket - *<parameter>newsocket</parameter></paramdef> - <paramdef>struct label - *<parameter>newsocketpeerlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>oldsocket</parameter></entry> - <entry>Local socket</entry> - </row> - - <row> - <entry><parameter>oldsocketlabel</parameter></entry> - <entry>Policy label for - <parameter>oldsocket</parameter></entry> - </row> - - <row> - <entry><parameter>newsocket</parameter></entry> - <entry>Peer socket</entry> - </row> - - <row> - <entry><parameter>newsocketpeerlabel</parameter></entry> - <entry>Policy label to fill in for - <parameter>newsocket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <!-- XXX Passed _remote_ socket endpoint ? --> - <para>Set the peer label on a stream UNIX domain socket from - the passed remote socket endpoint. This call will be made - when the socket pair is connected, and will be made for both - endpoints.</para> - </sect4> - </sect3> - - <sect3 id="mac-net-labeling-event-ops"> - <title>Network Object Labeling Event Operations</title> - - <sect4 id="mac-mpo-create-bpfdesc"> - <title><function>&mac.mpo;_create_bpfdesc</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_bpfdesc</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct bpf_d - *<parameter>bpf_d</parameter></paramdef> - <paramdef>struct label - *<parameter>bpflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>bpf_d</parameter></entry> - <entry>Object; bpf descriptor</entry> - </row> - - <row> - <entry><parameter>bpf</parameter></entry> - <entry>Policy label to be filled in for - <parameter>bpf_d</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created BPF descriptor from the - passed subject credential. This call will be made when a - BPF device node is opened by a process with the passed - subject credential.</para> - </sect4> - - <sect4 id="mac-mpo-create-ifnet"> - <title><function>&mac.mpo;_create_ifnet</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_ifnet</function></funcdef> - - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdeF> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label to fill in for - <parameter>ifnet</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created interface. This call - may be made when a new physical interface becomes available - to the system, or when a pseudo-interface is instantiated - during the boot or as a result of a user action.</para> - </sect4> - - <sect4 id="mac-mpo-create-ipq"> - <title><function>&mac.mpo;_create_ipq</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_ipq</function></funcdef> - - <paramdef>struct mbuf - *<parameter>fragment</parameter></paramdef> - <paramdef>struct label - *<parameter>fragmentlabel</parameter></paramdef> - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>ipqlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>fragment</parameter></entry> - <entry>First received IP fragment</entry> - </row> - - <row> - <entry><parameter>fragmentlabel</parameter></entry> - <entry>Policy label for - <parameter>fragment</parameter></entry> - </row> - - <row> - <entry><parameter>ipq</parameter></entry> - <entry>IP reassembly queue to be labeled</entry> - </row> - - <row> - <entry><parameter>ipqlabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>ipq</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly created IP fragment reassembly - queue from the mbuf header of the first received - fragment.</para> - </sect4> - - <sect4 id="mac-mpo-create-datagram-from-ipq"> - <title><function>&mac.mpo;_create_datagram_from_ipq</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_create_datagram_from_ipq</function></funcdef> - - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>ipqlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>datagram</parameter></paramdef> - <paramdef>struct label - *<parameter>datagramlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ipq</parameter></entry> - <entry>IP reassembly queue</entry> - </row> - - <row> - <entry><parameter>ipqlabel</parameter></entry> - <entry>Policy label for - <parameter>ipq</parameter></entry> - </row> - - <row> - <entry><parameter>datagram</parameter></entry> - <entry>Datagram to be labeled</entry> - </row> - - <row> - <entry><parameter>datagramlabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>datagramlabel</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on a newly reassembled IP datagram from - the IP fragment reassembly queue from which it was - generated.</para> - </sect4> - - <sect4 id="mac-mpo-create-fragment"> - <title><function>&mac.mpo;_create_fragment</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_fragment</function></funcdef> - - <paramdef>struct mbuf - *<parameter>datagram</parameter></paramdef> - <paramdef>struct label - *<parameter>datagramlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>fragment</parameter></paramdef> - <paramdef>struct label - *<parameter>fragmentlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>datagram</parameter></entry> - <entry>Datagram</entry> - </row> - - <row> - <entry><parameter>datagramlabel</parameter></entry> - <entry>Policy label for - <parameter>datagram</parameter></entry> - </row> - - <row> - <entry><parameter>fragment</parameter></entry> - <entry>Fragment to be labeled</entry> - </row> - - <row> - <entry><parameter>fragmentlabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>datagram</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created IP - fragment from the label on the mbuf header of the datagram - it was generate from.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-from-mbuf"> - <title><function>&mac.mpo;_create_mbuf_from_mbuf</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_from_mbuf</function></funcdef> - - <paramdef>struct mbuf - *<parameter>oldmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>oldmbuflabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>newmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>newmbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>oldmbuf</parameter></entry> - <entry>Existing (source) mbuf</entry> - </row> - - <row> - <entry><parameter>oldmbuflabel</parameter></entry> - <entry>Policy label for - <parameter>oldmbuf</parameter></entry> - </row> - - <row> - <entry><parameter>newmbuf</parameter></entry> - <entry>New mbuf to be labeled</entry> - </row> - - <row> - <entry><parameter>newmbuflabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>newmbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram from the mbuf header of an existing datagram. This - call may be made in a number of situations, including when - an mbuf is re-allocated for alignment purposes.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-linklayer"> - <title><function>&mac.mpo;_create_mbuf_linklayer</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_linklayer</function></funcdef> - - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>mbuf header for new datagram</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>mbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram generated for the purposes of a link layer response - for the passed interface. This call may be made in a number - of situations, including for ARP or ND6 responses in the - IPv4 and IPv6 stacks.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-from-bpfdesc"> - <title><function>&mac.mpo;_create_mbuf_from_bpfdesc</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_from_bpfdesc</function></funcdef> - - <paramdef>struct bpf_d - *<parameter>bpf_d</parameter></paramdef> - <paramdef>struct label - *<parameter>bpflabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>bpf_d</parameter></entry> - <entry>BPF descriptor</entry> - </row> - - <row> - <entry><parameter>bpflabel</parameter></entry> - <entry>Policy label for - <parameter>bpflabel</parameter></entry> - </row> - - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>New mbuf to be labeled</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label to fill in for - <parameter>mbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram generated using the passed BPF descriptor. This - call is made when a write is performed to the BPF device - associated with the passed BPF descriptor.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-from-ifnet"> - <title><function>&mac.mpo;_create_mbuf_from_ifnet</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_from_ifnet</function></funcdef> - - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnetlabel</parameter></entry> - </row> - - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>mbuf header for new datagram</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>mbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram generated from the passed network interface.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-multicast-encap"> - <title><function>&mac.mpo;_create_mbuf_multicast_encap</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_multicast_encap</function></funcdef> - - <paramdef>struct mbuf - *<parameter>oldmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>oldmbuflabel</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>newmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>newmbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>oldmbuf</parameter></entry> - <entry>mbuf header for existing datagram</entry> - </row> - - <row> - <entry><parameter>oldmbuflabel</parameter></entry> - <entry>Policy label for - <parameter>oldmbuf</parameter></entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>newmbuf</parameter></entry> - <entry>mbuf header to be labeled for new - datagram</entry> - </row> - - <row> - <entry><parameter>newmbuflabel</parameter></entry> - <entry>Policy label to be filled in for - <parameter>newmbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram generated from the existing passed datagram when it - is processed by the passed multicast encapsulation - interface. This call is made when an mbuf is to be - delivered using the virtual interface.</para> - </sect4> - - <sect4 id="mac-mpo-create-mbuf-netlayer"> - <title><function>&mac.mpo;_create_mbuf_netlayer</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_mbuf_netlayer</function></funcdef> - - <paramdef>struct mbuf - *<parameter>oldmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>oldmbuflabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>newmbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>newmbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>oldmbuf</parameter></entry> - <entry>Received datagram</entry> - </row> - - <row> - <entry><parameter>oldmbuflabel</parameter></entry> - <entry>Policy label for - <parameter>oldmbuf</parameter></entry> - </row> - - <row> - <entry><parameter>newmbuf</parameter></entry> - <entry>Newly created datagram</entry> - </row> - - <row> - <entry><parameter>newmbuflabel</parameter></entry> - <entry>Policy label for - <parameter>newmbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Set the label on the mbuf header of a newly created - datagram generated by the IP stack in response to an - existing received datagram (<parameter>oldmbuf</parameter>). - This call may be made in a number of situations, including - when responding to ICMP request datagrams.</para> - </sect4> - - <sect4 id="mac-mpo-fragment-match"> - <title><function>&mac.mpo;_fragment_match</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_fragment_match</function></funcdef> - - <paramdef>struct mbuf - *<parameter>fragment</parameter></paramdef> - <paramdef>struct label - *<parameter>fragmentlabel</parameter></paramdef> - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>ipqlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>fragment</parameter></entry> - <entry>IP datagram fragment</entry> - </row> - - <row> - <entry><parameter>fragmentlabel</parameter></entry> - <entry>Policy label for - <parameter>fragment</parameter></entry> - </row> - - <row> - <entry><parameter>ipq</parameter></entry> - <entry>IP fragment reassembly queue</entry> - </row> - - <row> - <entry><parameter>ipqlabel</parameter></entry> - <entry>Policy label for - <parameter>ipq</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether an mbuf header containing an IP - datagram (<parameter>fragment</parameter>) fragment matches - the label of the passed IP fragment reassembly queue - (<parameter>ipq</parameter>). Return - (<returnvalue>1</returnvalue>) for a successful match, or - (<returnvalue>0</returnvalue>) for no match. This call is - made when the IP stack attempts to find an existing fragment - reassembly queue for a newly received fragment; if this - fails, a new fragment reassembly queue may be instantiated - for the fragment. Policies may use this entry point to - prevent the reassembly of otherwise matching IP fragments if - policy does not permit them to be reassembled based on the - label or other information.</para> - </sect4> - - <sect4 id="mac-mpo-ifnet-relabel"> - <title><function>&mac.mpo;_ifnet_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_ifnet_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Object; Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Label update to apply to - <parameter>ifnet</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label of network interface, - <parameter>ifnet</parameter>, based on the passed update - label, <parameter>newlabel</parameter>, and the passed - subject credential, <parameter>cred</parameter>.</para> - </sect4> - - <sect4 id="mac-mpo-update-ipq"> - <title><function>&mac.mpo;_update_ipq</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_update_ipq</function></funcdef> - - <paramdef>struct mbuf - *<parameter>fragment</parameter></paramdef> - <paramdef>struct label - *<parameter>fragmentlabel</parameter></paramdef> - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>ipqlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>IP fragment</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label for - <parameter>mbuf</parameter></entry> - </row> - - <row> - <entry><parameter>ipq</parameter></entry> - <entry>IP fragment reassembly queue</entry> - </row> - - <row> - <entry><parameter>ipqlabel</parameter></entry> - <entry>Policy label to be updated for - <parameter>ipq</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label on an IP fragment reassembly queue - (<parameter>ipq</parameter>) based on the acceptance of the - passed IP fragment mbuf header - (<parameter>mbuf</parameter>).</para> - </sect4> - </sect3> - - <sect3 id="mac-proc-labeling-event-ops"> - <title>Process Labeling Event Operations</title> - - <sect4 id="mac-mpo-create-cred"> - <title><function>&mac.mpo;_create_cred</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_cred</function></funcdef> - - <paramdef>struct ucred - *<parameter>parent_cred</parameter></paramdef> - <paramdef>struct ucred - *<parameter>child_cred</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>parent_cred</parameter></entry> - <entry>Parent subject credential</entry> - </row> - - <row> - <entry><parameter>child_cred</parameter></entry> - <entry>Child subject credential</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <!-- XXX manref --> - <para>Set the label of a newly created subject credential from - the passed subject credential. This call will be made when - crcopy(9) is invoked on a newly created <type>struct - ucred</type>. This call should not be confused with a - process forking or creation event.</para> - </sect4> - - <sect4 id="mac-mpo-execve-transition"> - <title><function>&mac.mpo;_execve_transition</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_execve_transition</function></funcdef> - - <paramdef>struct ucred - *<parameter>old</parameter></paramdef> - <paramdef>struct ucred - *<parameter>new</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>old</parameter></entry> - <entry>Existing subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>new</parameter></entry> - <entry>New subject credential to be labeled</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>File to execute</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label of a newly created subject credential - (<parameter>new</parameter>) from the passed existing - subject credential (<parameter>old</parameter>) based on a - label transition caused by executing the passed vnode - (<parameter>vp</parameter>). This call occurs when a - process executes the passed vnode and one of the policies - returns a success from the - <function>mpo_execve_will_transition</function> entry point. - Policies may choose to implement this call simply by - invoking <function>mpo_create_cred</function> and passing - the two subject credentials so as not to implement a - transitioning event. Policies should not leave this entry - point unimplemented if they implement - <function>mpo_create_cred</function>, even if they do not - implement - <function>mpo_execve_will_transition</function>.</para> - </sect4> - - <sect4 id="mac-mpo-execve-will-transition"> - <title><function>&mac.mpo;_execve_will_transition</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_execve_will_transition</function></funcdef> - - <paramdef>struct ucred - *<parameter>old</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>old</parameter></entry> - <entry>Subject credential prior to - &man.execve.2;</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>File to execute</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the policy will want to perform a - transition event as a result of the execution of the passed - vnode by the passed subject credential. Return - <returnvalue>1</returnvalue> if a transition is required, - <returnvalue>0</returnvalue> if not. Even if a policy - returns <returnvalue>0</returnvalue>, it should behave - correctly in the presence of an unexpected invocation of - <function>mpo_execve_transition</function>, as that call may - happen as a result of another policy requesting a - transition.</para> - </sect4> - - <sect4 id="mac-mpo-create-proc0"> - <title><function>&mac.mpo;_create_proc0</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_proc0</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential to be filled in</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Create the subject credential of process 0, the parent - of all kernel processes.</para> - </sect4> - - <sect4 id="mac-mpo-create-proc1"> - <title><function>&mac.mpo;_create_proc1</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_create_proc1</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential to be filled in</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Create the subject credential of process 1, the parent - of all kernel processes.</para> - </sect4> - - <sect4 id="mac-mpo-cred-relabel"> - <title><function>&mac.mpo;_cred_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_cred_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Label update to apply to - <parameter>cred</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Update the label on a subject credential from the passed - update label.</para> - </sect4> - </sect3> - </sect2> - - <sect2 id="mac-access-control-checks"> - <title>Access Control Checks</title> - - <para>Access control entry points permit policy modules to - influence access control decisions made by the kernel. - Generally, although not always, arguments to an access control - entry point will include one or more authorizing credentials, - information (possibly including a label) for any other objects - involved in the operation. An access control entry point may - return 0 to permit the operation, and an &man.errno.2; error - value. The results of invoking the entry point across various - registered policy modules will be composed as follows: if all - modules permit the operation to succeed, success will be - returned. If one or modules returns a failure, a failure will - be returned. If more than one module returns a failure, the - errno value to return to the user will be selected using the - following precedence, implemented by the - <function>error_select()</function> function in - <filename>kern_mac.c</filename>:</para> - - <informaltable> - <tgroup cols="2"> - <tbody> - <row> - <entry>Most precedence</entry> - <entry><errorcode>EDEADLK</errorcode></entry></row> - - <row> - <entry></entry> - <entry><errorcode>EINVAL</errorcode></entry> - </row> - <row> - <entry></entry> - <entry><errorcode>ESRCH</errorcode></entry> - </row> - <row> - <entry></entry> - <entry><errorcode>ENOENT</errorcode></entry> - </row> - <row> - <entry></entry> - <entry>EACCES</entry> - </row> - <row> - <entry>Least precedence</entry> - <entry>EPERM</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>If none of the error values returned by all modules are - listed in the precedence chart then an arbitrarily selected - value from the set will be returned. In general, the rules - provide precedence to errors in the following order: kernel - failures, invalid arguments, object not present, access not - permitted, other.</para> - - <sect3 id="mac-mpo-bpfdesc-check-receive-from-ifnet"> - <title><function>&mac.mpo;_check_bpfdesc_receive</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_bpfdesc_receive</function></funcdef> - - <paramdef>struct bpf_d - *<parameter>bpf_d</parameter></paramdef> - <paramdef>struct label - *<parameter>bpflabel</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>bpf_d</parameter></entry> - <entry>Subject; BPF descriptor</entry> - </row> - - <row> - <entry><parameter>bpflabel</parameter></entry> - <entry>Policy label for - <parameter>bpf_d</parameter></entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Object; network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the MAC framework should permit - datagrams from the passed interface to be delivered to the - buffers of the passed BPF descriptor. Return - (<returnvalue>0</returnvalue>) for success, or an - <varname>errno</varname> value for failure Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches, - <errorcode>EPERM</errorcode> for lack of privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-socket-bind"> - <title><function>&mac.mpo;_check_socket_bind</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_bind</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - <paramdef>struct sockaddr - *<parameter>sockaddr</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>socket</parameter></entry> - <entry>Socket to be bound</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>socket</parameter></entry> - </row> - - <row> - <entry><parameter>sockaddr</parameter></entry> - <entry>Address of - <parameter>socket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - </sect3> - - - <sect3 id="mac-mpo-cred-check-socket-connect"> - <title><function>&mac.mpo;_check_socket_connect</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_connect</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - <paramdef>struct sockaddr - *<parameter>sockaddr</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>socket</parameter></entry> - <entry>Socket to be connected</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>socket</parameter></entry> - </row> - - <row> - <entry><parameter>sockaddr</parameter></entry> - <entry>Address of - <parameter>socket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential - (<parameter>cred</parameter>) can connect the passed socket - (<parameter>socket</parameter>) to the passed socket address - (<parameter>sockaddr</parameter>). Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches, - <errorcode>EPERM</errorcode> for lack of privilege.</para> - </sect3> - - <sect3 id="mac-mpo-check-cred-visible"> - <title><function>&mac.mpo;_check_cred_visible</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_cred_visible</function></funcdef> - - <paramdef>struct ucred - *<parameter>u1</parameter></paramdef> - <paramdef>struct ucred - *<parameter>u2</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>u1</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>u2</parameter></entry> - <entry>Object credential</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential - <parameter>u1</parameter> can <quote>see</quote> other - subjects with the passed subject credential - <parameter>u2</parameter>. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches, - <errorcode>EPERM</errorcode> for lack of privilege, or - <errorcode>ESRCH</errorcode> to hide visibility. This call - may be made in a number of situations, including - inter-process status sysctls used by <command>ps</command>, - and in procfs lookups.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-socket-visible"> - <title><function>&mac.mpo;_check_socket_visible</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_visible</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>socket</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>socket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - </sect3> - - <sect3 id="mac-mpo-cred-check-ifnet-relabel"> - <title><function>&mac.mpo;_check_ifnet_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_ifnet_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Object; network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Existing policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Policy label update to later be applied to - <parameter>ifnet</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can relabel the - passed network interface to the passed label update.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-socket-relabel"> - <title><function>&mac.mpo;_check_socket_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>socket</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Existing policy label for - <parameter>socket</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Label update to later be applied to - <parameter>socketlabel</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can relabel the - passed socket to the passed label update.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-cred-relabel"> - <title><function>&mac.mpo;_check_cred_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_cred_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Label update to later be applied to - <parameter>cred</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can relabel - itself to the passed label update.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-relabel"> - <title><function>&mac.mpo;_check_vnode_relabel</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_relabel</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>vnodelabel</parameter></paramdef> - <paramdef>struct label - *<parameter>newlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>vnodelabel</parameter></entry> - <entry>Existing policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>newlabel</parameter></entry> - <entry>Policy label update to later be applied to - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can relabel the - passed vnode to the passed label update.</para> - </sect3> - - <sect3 id="mpo-cred-check-mount-stat"> - <title><function>&mac.mpo;_check_mount_stat</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int <function>&mac.mpo;_check_mount_stat</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>mountlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>mp</parameter></entry> - <entry>Object; file system mount</entry> - </row> - - <row> - <entry><parameter>mountlabel</parameter></entry> - <entry>Policy label for - <parameter>mp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <!-- XXX Update ? --> - <para>Determine whether the subject credential can see the - results of a statfs performed on the file system. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches - or <errorcode>EPERM</errorcode> for lack of privilege. This - call may be made in a number of situations, including during - invocations of &man.statfs.2; and related calls, as well as to - determine what file systems to exclude from listings of file - systems, such as when &man.getfsstat.2; is invoked. </para> - </sect3> - - <sect3 id="mac-mpo-cred-check-proc-debug"> - <title><function>&mac.mpo;_check_proc_debug</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_proc_debug</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct proc - *<parameter>proc</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>proc</parameter></entry> - <entry>Object; process</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can debug the - passed process. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, <errorcode>EPERM</errorcode> for lack of - privilege, or <errorcode>ESRCH</errorcode> to hide - visibility of the target. This call may be made in a number - of situations, including use of the &man.ptrace.2; and - &man.ktrace.2; APIs, as well as for some types of procfs - operations.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-access"> - <title><function>&mac.mpo;_check_vnode_access</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_access</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>int <parameter>flags</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>flags</parameter></entry> - <entry>&man.access.2; flags</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine how invocations of &man.access.2; and related - calls by the subject credential should return when performed - on the passed vnode using the passed access flags. This - should generally be implemented using the same semantics - used in <function>&mac.mpo;_check_vnode_open</function>. - Return <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-chdir"> - <title><function>&mac.mpo;_check_vnode_chdir</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_chdir</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>dvp</parameter></paramdef> - <paramdef>struct label - *<parameter>dlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Object; vnode to &man.chdir.2; into</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can change the - process working directory to the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-create"> - <title><function>&mac.mpo;_check_vnode_create</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_create</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>dvp</parameter></paramdef> - <paramdef>struct label - *<parameter>dlabel</parameter></paramdef> - <paramdef>struct componentname - *<parameter>cnp</parameter></paramdef> - <paramdef>struct vattr - *<parameter>vap</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>cnp</parameter></entry> - <entry>Component name for - <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>vap</parameter></entry> - <entry>vnode attributes for <parameter>vap</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can create a - vnode with the passed parent directory, passed name - information, and passed attribute information. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode>. for label mismatch, - or <errorcode>EPERM</errorcode> for lack of privilege. - This call may be made in a number of situations, including - as a result of calls to &man.open.2; with - <symbol>O_CREAT</symbol>, &man.mknod.2;, &man.mkfifo.2;, and - others.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-delete"> - <title><function>&mac.mpo;_check_vnode_delete</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_delete</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>dvp</parameter></paramdef> - <paramdef>struct label - *<parameter>dlabel</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>void *<parameter>label</parameter></paramdef> - <paramdef>struct componentname - *<parameter>cnp</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Parent directory vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode to delete</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>cnp</parameter></entry> - <entry>Component name for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can delete a - vnode from the passed parent directory and passed name - information. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, or <errorcode>EPERM</errorcode> for lack of - privilege. This call may be made in a number of situations, - including as a result of calls to &man.unlink.2; and - &man.rmdir.2;. Policies implementing this entry point - should also implement - <function>mpo_check_rename_to</function> to authorize - deletion of objects as a result of being the target of a - rename.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-deleteacl"> - <title><function>&mac.mpo;_check_vnode_deleteacl</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_deleteacl</function></funcdef> - - <paramdef>struct ucred *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode *<parameter>vp</parameter></paramdef> - <paramdef>struct label *<parameter>label</parameter></paramdef> - <paramdef>acl_type_t <parameter>type</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - <entry>Locked</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>type</parameter></entry> - <entry>ACL type</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can delete the - ACL of passed type from the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-exec"> - <title><function>&mac.mpo;_check_vnode_exec</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_exec</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode to execute</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can execute the - passed vnode. Determination of execute privilege is made - seperately from decisions about any transitioning event. - Return <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mpo-cred-check-vnode-getacl"> - <title><function>&mac.mpo;_check_vnode_getacl</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_getacl</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>acl_type_t - <parameter>type</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>type</parameter></entry> - <entry>ACL type</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credentical can retrieve - the ACL of passed type from the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-getextattr"> - <title><function>&mac.mpo;_check_vnode_getextattr</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_getextattr</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>int - <parameter>attrnamespace</parameter></paramdef> - <paramdef>const char - *<parameter>name</parameter></paramdef> - <paramdef>struct uio - *<parameter>uio</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>attrnamespace</parameter></entry> - <entry>Extended attribute namespace</entry> - </row> - - <row> - <entry><parameter>name</parameter></entry> - <entry>Extended attribute name</entry> - </row> - - <row> - <entry><parameter>uio</parameter></entry> - <entry>I/O structure pointer; see &man.uio.9;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can retrieve - the extended attribute with the passed namespace and name - from the passed vnode. Policies implementing labeling using - extended attributes may be interested in special handling of - operations on those extended attributes. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-socket-listen"> - <title><function>&mac.mpo;_check_socket_listen</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_listen</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>socket</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>socket</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can listen on - the passed socket. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-lookup"> - <title><function>&mac.mpo;_check_vnode_lookup</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_lookup</function></funcdef> - - <paramdef>struct ucred - *<parameter></parameter>cred</paramdef> - <paramdef>struct vnode - *<parameter></parameter>dvp</paramdef> - <paramdef>struct label - *<parameter></parameter>dlabel</paramdef> - <paramdef>struct componentname - *<parameter>cnp</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>cnp</parameter></entry> - <entry>Component name being looked up</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can perform a - lookup in the passed directory vnode for the passed name. - Return <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-open"> - <title><function>&mac.mpo;_check_vnode_open</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_open</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>mode_t - <parameter>acc_mode</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>acc_mode</parameter></entry> - <entry>&man.open.2; access mode</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can perform an - open operation on the passed vnode with the passed access - mode. Return <returnvalue>0</returnvalue> for success, or - an errno value for failure. Suggested failure: - <errorcode>EACCES</errorcode> for label mismatch, or - <errorcode>EPERM</errorcode> for lack of privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-readdir"> - <title><function>&mac.mpo;_check_vnode_readdir</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_readdir</function></funcdef> - - <paramdef>struct ucred - *<parameter></parameter>cred</paramdef> - <paramdef>struct vnode - *<parameter></parameter>dvp</paramdef> - <paramdef>struct label - *<parameter></parameter>dlabel</paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Object; directory vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can perform a - <function>readdir</function> operation on the passed - directory vnode. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-readlink"> - <title><function>&mac.mpo;_check_vnode_readlink</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_readlink</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can perform a - <function>readlink</function> operation on the passed - symlink vnode. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, or <errorcode>EPERM</errorcode> for lack of - privilege. This call may be made in a number of situations, - including an explicit <function>readlink</function> call by - the user process, or as a result of an implicit - <function>readlink</function> during a name lookup by the - process.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-rename-from-vnode"> - <title><function>&mac.mpo;_check_rename_from_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_rename_from_vnode</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>dvp</parameter></paramdef> - <paramdef>struct label - *<parameter>dlabel</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>struct componentname - *<parameter>cnp</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Directory vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for - <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <!-- XXX ??? --> - <row> - <entry><parameter>cnp</parameter></entry> - <entry>Pathname</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can rename the - passed vnode (<parameter>vp</parameter>) in the passed - directory (<parameter>dvp</parameter>) using the passed name - (<parameter>cnp</parameter>). This call will be made in - combination with a follow-up call to - <function>mpo_check_rename_to_vnode</function>. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-rename-to-vnode"> - <title><function>&mac.mpo;_check_rename_to_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_rename_to_vnode</function></funcdef> - - <paramdef>struct ucred - *<parameter></parameter>cred</paramdef> - <paramdef>struct vnode - *<parameter></parameter>dvp</paramdef> - <paramdef>struct label - *<parameter></parameter>dlabel</paramdef> - <paramdef>struct vnode - *<parameter></parameter>vp</paramdef> - <paramdef>struct label - *<parameter></parameter>label</paramdef> - <paramdef>int <parameter></parameter>samedir</paramdef> - <paramdef>struct componentname - *<parameter>cnp</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>dvp</parameter></entry> - <entry>Directory vnode</entry> - </row> - - <row> - <entry><parameter>dlabel</parameter></entry> - <entry>Policy label for <parameter>dvp</parameter></entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>cnp</parameter></entry> - <entry>Pathname</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can rename to - the passed vnode (<parameter>vp</parameter>) and the passed - directory (<parameter>dvp</parameter>) with the passed name - (<parameter>cnp</parameter>). This call will be made in - combination with an earlier call to - <function>mpo_check_rename_from_vnode</function>. - Return <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-revoke"> - <title><function>&mac.mpo;_check_vnode_revoke</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_revoke</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can revoke - access to the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setacl"> - <title><function>&mac.mpo;_check_vnode_setacl</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setacl</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>acl_type_t - <parameter>type</parameter></paramdef> - <paramdef>struct acl - *<parameter>acl</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>type</parameter></entry> - <entry>ACL type</entry> - </row> - - <row> - <entry><parameter>acl</parameter></entry> - <entry>ACL</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can set the - passed ACL of passed type on the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setextattr"> - <title><function>&mac.mpo;_check_vnode_setextattr</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setextattr</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>int - <parameter>attrnamespace</parameter></paramdef> - <paramdef>const char - *<parameter>name</parameter></paramdef> - <paramdef>struct uio - *<parameter>uio</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>attrnamespace</parameter></entry> - <entry>Extended attribute namespace</entry> - </row> - - <row> - <entry><parameter>name</parameter></entry> - <entry>Extended attribute name</entry> - </row> - - <row> - <entry><parameter>uio</parameter></entry> - <entry>I/O structure pointer; see &man.uio.9;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credentical can set the - extended attribute of passed name and passed namespace on - the passed vnode. Policies implementing security labels - backed into extended attributes may want to provide - additional protections for those attributes. Additionally, - policies should avoid making decisions based on the data - referenced from <parameter>uio</parameter>, as there is a - potential race condition between this check and the actual - operation. The <parameter>uio</parameter> may also be - <literal>NULL</literal> if a delete operation is being - performed. Return <returnvalue>0</returnvalue> for success, - or an <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setflags"> - <title><function>&mac.mpo;_check_vnode_setflags</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setflags</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>u_long <parameter>flags</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>flags</parameter></entry> - <entry>File flags; see &man.chflags.2;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can set the - passed flags on the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setmode"> - <title><function>&mac.mpo;_check_vnode_setmode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setmode</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>mode_t <parameter>mode</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>mode</parameter></entry> - <entry>File mode; see &man.chmod.2;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can set the - pased mode on the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setowner"> - <title><function>&mac.mpo;_check_vnode_setowner</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setowner</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>uid_t <parameter>uid</parameter></paramdef> - <paramdef>gid_t <parameter>gid</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>uid</parameter></entry> - <entry>User ID</entry> - </row> - - <row> - <entry><parameter>gid</parameter></entry> - <entry>Group ID</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can set the - passed uid and passed gid as file uid and file gid on the - passed vnode. The IDs may be set to (<literal>-1</literal>) - to request no update. Return <returnvalue>0</returnvalue> - for success, or an <varname>errno</varname> value for - failure. Suggested failure: <errorcode>EACCES</errorcode> - for label mismatch, or <errorcode>EPERM</errorcode> for lack - of privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-setutimes"> - <title><function>&mac.mpo;_check_vnode_setutimes</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_setutimes</function></funcdef> - - <paramdef>struct ucred - *<parameter></parameter>cred</paramdef> - <paramdef>struct vnode - *<parameter></parameter>vp</paramdef> - <paramdef>struct label - *<parameter></parameter>label</paramdef> - <paramdef>struct timespec - <parameter></parameter>atime</paramdef> - <paramdef>struct timespec - <parameter></parameter>mtime</paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vp</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - - <row> - <entry><parameter>atime</parameter></entry> - <entry>Access time; see &man.utimes.2;</entry> - </row> - - <row> - <entry><parameter>mtime</parameter></entry> - <entry>Modification time; see &man.utimes.2;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can set the - passed access timestamps on the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-proc-sched"> - <title><function>&mac.mpo;_check_proc_sched</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_proc_sched</function></funcdef> - - <paramdef>struct ucred - *<parameter>ucred</parameter></paramdef> - <paramdef>struct proc - *<parameter>proc</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>proc</parameter></entry> - <entry>Object; process</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can change the - scheduling parameters of the passed process. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - <errorcode>EPERM</errorcode> for lack of privilege, or - <errorcode>ESRCH</errorcode> to limit visibility.</para> - - <para>See &man.setpriority.2; for more information.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-proc-signal"> - <title><function>&mac.mpo;_check_proc_signal</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_proc_signal</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct proc - *<parameter>proc</parameter></paramdef> - <paramdef>int <parameter>signal</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>proc</parameter></entry> - <entry>Object; process</entry> - </row> - - <row> - <entry><parameter>signal</parameter></entry> - <entry>Signal; see &man.kill.2;</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can deliver the - passed signal to the passed process. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - <errorcode>EPERM</errorcode> for lack of privilege, or - <errorcode>ESRCH</errorcode> to limit visibility.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-vnode-stat"> - <title><function>&mac.mpo;_check_vnode_stat</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_vnode_stat</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; vnode</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label for - <parameter>vp</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential can - <function>stat</function> the passed vnode. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - - <para>See &man.stat.2; for more information.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-ifnet-transmit"> - <title><function>&mac.mpo;_check_ifnet_transmit</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_ifnet_transmit</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>Object; mbuf to be sent</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label for - <parameter>mbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the network interface can transmit the - passed mbuf. Return <returnvalue>0</returnvalue> for - success, or an <varname>errno</varname> value for failure. - Suggested failure: <errorcode>EACCES</errorcode> for label - mismatch, or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-cred-check-socket-receive"> - <title><function>&mac.mpo;_check_socket_receive</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_receive</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>ifnetlabel</parameter></paramdef> - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>mbuflabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - </row> - - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Network interface</entry> - </row> - - <row> - <entry><parameter>ifnetlabel</parameter></entry> - <entry>Policy label for - <parameter>ifnet</parameter></entry> - </row> - - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>Object; mbuf to be received</entry> - </row> - - <row> - <entry><parameter>mbuflabel</parameter></entry> - <entry>Policy label for - <parameter>mbuf</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the socket may receive the datagram - stored in the passed mbuf header. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failures: <errorcode>EACCES</errorcode> for label mismatch, - or <errorcode>EPERM</errorcode> for lack of - privilege.</para> - </sect3> - - <sect3 id="mac-mpo-check-socket-visible"> - <title><function>&mac.mpo;_check_socket_visible</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>int - <function>&mac.mpo;_check_socket_visible</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct socket - *<parameter>so</parameter></paramdef> - <paramdef>struct label - *<parameter>socketlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject credential</entry> - <entry>Immutable</entry> - </row> - - <row> - <entry><parameter>so</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>socketlabel</parameter></entry> - <entry>Policy label for - <parameter>so</parameter></entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Determine whether the subject credential cred can "see" - the passed socket (<parameter>socket</parameter>) using - system monitoring functions, such as those employed by - &man.netstat.8; and &man.sockstat.1;. Return - <returnvalue>0</returnvalue> for success, or an - <varname>errno</varname> value for failure. Suggested - failure: <errorcode>EACCES</errorcode> for label mismatches, - <errorcode>EPERM</errorcode> for lack of privilege, or - <errorcode>ESRCH</errorcode> to hide visibility.</para> - </sect3> - </sect2> - - <sect2 id="mac-label-management"> - <title>Label Management Calls</title> - - <para>Relabel events occur when a user process has requested - that the label on an object be modified. A two-phase update - occurs: first, an access control check will be performed to - determine if the update is both valid and permitted, and then - the update itself is performed via a seperate entry point. - Relabel entry points typically accept the object, object label - reference, and an update label submitted by the process. - Memory allocation during relabel is discouraged, as relabel - calls are not permitted to fail (failure should be reported - earlier in the relabel check).</para> - - <sect3 id="mac-mpo-init-bpfdesc"> - <title><function>&mac.mpo;_init_bpfdesc</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_bpfdesc</function></funcdef> - - <paramdef>struct bpf_d - *<parameter>bpf_d</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>bpf_d</parameter></entry> - <entry>Object; bpf descriptor</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to apply</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated bpfdesc (BPF - descriptor)</para> - </sect3> - - <sect3 id="mac-mpo-init-devfsdirent"> - <title><function>&mac.mpo;_init_devfsdirent</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_devfsdirent</function></funcdef> - - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Object; devfs directory entry</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to apply</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated devfs - entry.</para> - </sect3> - - <sect3 id="mac-mpo-init-ifnet"> - <title><function>&mac.mpo;_init_ifnet</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_ifnet</function></funcdef> - - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Object; network interface</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to apply</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated network - interface.</para> - </sect3> - - <sect3 id="mac-mpo-init-ipq"> - <title><function>&mac.mpo;_init_ipq</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_ipq</function></funcdef> - - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ipq</parameter></entry> - <entry>Object; IP reassembly queue</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to apply</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated IP fragment - reassembly queue.</para> - </sect3> - - <sect3 id="mac-mpo-init-mbuf"> - <title><function>&mac.mpo;_init_mbuf</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_mbuf</function></funcdef> - - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>int <parameter>how</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>Object; mbuf</entry> - </row> - - <row> - <entry><parameter>how</parameter></entry> - <entry>Blocking/non-blocking &man.malloc.9; see - below</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Policy label to initialize</entry> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated mbuf packet - header (<parameter>mbuf</parameter>). The - <parameter>how</parameter> field may be one of - <symbol>M_WAITOK</symbol> and <symbol>M_NOWAIT</symbol>, and - should be employed to avoid performing a blocking - &man.malloc.9; during this initialization call. Mbuf - allocation frequently occurs in performance sensitive - environments, and the implementation should be careful to - avoid blocking or long-lived operations. This entry point - is permitted to fail resulting in the failure to allocate - the mbuf header.</para> - </sect3> - - <sect3 id="mac-mpo-init-mount"> - <title><function>&mac.mpo;_init_mount</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_mount</function></funcdef> - - <paramdef>struct mount - *<parameter>mount</parameter></paramdef> - <paramdef>struct label - *<parameter>mntlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>fslabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <!-- XXX: Wording on label descriptions. --> - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mount</parameter></entry> - <entry>Object; file system mount point</entry> - </row> - - <row> - <entry><parameter>mntlabel</parameter></entry> - <entry>Policy label to be initialized for the mount - itself</entry> - </row> - - <row> - <entry><parameter>fslabel</parameter></entry> - <entry>Policy label to be initialized for the file - system</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the labels on a newly instantiated mount - point.</para> - </sect3> - - <sect3 id="mac-mpo-init-socket"> - <title><function>&mac.mpo;_init_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_socket</function></funcdef> - - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>struct label - *<parameter>peerlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>socket</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to apply to the socket</entry> - </row> - - <row> - <entry><parameter>peerlabel</parameter></entry> - <entry>New label to apply to the socket's peer</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the labels on a newly instantiated - socket.</para> - </sect3> - - <sect3 id="mac-mpo-init-cred"> - <title><function>&mac.mpo;_init_cred</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_cred</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject; user credetial</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the labels on a newly instantiated subject.</para> - </sect3> - - <sect3 id="mac-mpo-init-temp"> - <title><function>&mac.mpo;_init_temp</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_temp</function></funcdef> - - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>label</parameter></entry> - <entry>Temporary label</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize a newly instantiated temporary label; - temporary labels are frequently used to hold label update - requests.</para> - </sect3> - - <sect3 id="mac-mpo-init-vnode"> - <title><function>&mac.mpo;_init_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_init_vnode</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; file system object</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>New label to initialize</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Initialize the label on a newly instantiated vnode.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-bpfdesc"> - <title><function>&mac.mpo;_destroy_bpfdesc</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_bpfdesc</function></funcdef> - - <paramdef>struct bpf_d - *<parameter>bpf_d</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>bpf_d</parameter></entry> - <entry>Object; bpf descriptor</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on a BPF descriptor. In this entry - point, a policy module should free any internal storage - associated with <parameter>label</parameter> so that it may - be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-devfsdirent"> - <title><function>&mac.mpo;_destroy_devfsdirent</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_devfsdirent</function></funcdef> - - <paramdef>struct devfs_dirent - *<parameter>devfs_dirent</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>devfs_dirent</parameter></entry> - <entry>Object; devfs directory entry</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on a devfs entry. In this entry - point, a policy module should free any internal storage - asociated with <parameter>label</parameter> so that it may - be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-ifnet"> - <title><function>&mac.mpo;_destroy_ifnet</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_ifnet</function></funcdef> - - <paramdef>struct ifnet - *<parameter>ifnet</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ifnet</parameter></entry> - <entry>Object; network interface</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on a removed interface. In this entry - point, a policy module should free any internal storage - associated with <parameter>label</parameter> so that it may - be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-ipq"> - <title><function>&mac.mpo;_destroy_ipq</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_ipq</function></funcdef> - - <paramdef>struct ipq - *<parameter>ipq</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>ipq</parameter></entry> - <entry>Object; IP reassembly queue</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on an IP fragment queue. In this - entry point, a policy module should free any internal - storage associated with <parameter>label</parameter> so that - it may be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-mbuf"> - <title><function>&mac.mpo;_destroy_mbuf</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_mbuf</function></funcdef> - - <paramdef>struct mbuf - *<parameter>mbuf</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mbuf</parameter></entry> - <entry>Object; mbuf</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on an mbuf header. In this entry - point, a policy module should free any internal storage - associated with <parameter>label</parameter> so that it may - be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-mount"> - <title><function>&mac.mpo;_destroy_mount</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_mount</function></funcdef> - - <paramdef>struct mount - *<parameter>mp</parameter></paramdef> - <paramdef>struct label - *<parameter>mntlabel</parameter></paramdef> - <paramdef>struct label - *<parameter>fslabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>mp</parameter></entry> - <entry>Object; file system mount point</entry> - </row> - - <row> - <entry><parameter>mntlabel</parameter></entry> - <entry>Mount point label being destroyed</entry> - </row> - - <row> - <entry><parameter>fslabel</parameter></entry> - <entry>File system label being destroyed> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the labels on a mount point. In this entry - point, a policy module should free the internal storage - associated with <parameter>mntlabel</parameter> and - <parameter>fslabel</parameter> so that they may be - destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-socket"> - <title><function>&mac.mpo;_destroy_socket</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_socket</function></funcdef> - - <paramdef>struct socket - *<parameter>socket</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>struct label - *<parameter>peerlabel</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>socket</parameter></entry> - <entry>Object; socket</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Socket label being destroyed</entry> - </row> - - <row> - <entry><parameter>peerlabel</parameter></entry> - <entry>Socket peer label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the labels on a socket. In this entry point, a - policy module should free any internal storage associated - with <parameter>label</parameter> and - <parameter>peerlabel</parameter> so that they may be - destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-cred"> - <title><function>&mac.mpo;_destroy_cred</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_cred</function></funcdef> - - <paramdef>struct ucred - *<parameter>cred</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>cred</parameter></entry> - <entry>Subject; user credential</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on a credential. In this entry point, - a policy module should free any internal storage associated - with <parameter>label</parameter> so that it may be - destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-temp"> - <title><function>&mac.mpo;_destroy_temp</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_temp</function></funcdef> - - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>label</parameter></entry> - <entry>Temporary label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy a temporary label. In this entry point, a - policy module should free any internal storage associated - with the temporary label <parameter>label</parameter> so - that it may be destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-destroy-vnode"> - <title><function>&mac.mpo;_destroy_vnode</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_destroy_vnode</function></funcdef> - - <paramdef>struct vnode - *<parameter>vp</parameter></paramdef> - <paramdef>struct label - *<parameter>label</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>vp</parameter></entry> - <entry>Object; file system object</entry> - </row> - - <row> - <entry><parameter>label</parameter></entry> - <entry>Label being destroyed</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Destroy the label on a vnode. In this entry point, a - policy module should free any internal storage associated - with <parameter>label</parameter> so that it may be - destroyed.</para> - </sect3> - - <sect3 id="mac-mpo-externalize"> - <title><function>&mac.mpo;_externalize</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_externalize</function></funcdef> - - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>struct mac - *<parameter>extmac</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>label</parameter></entry> - <entry>Label to be externalized</entry> - </row> - - <row> - <entry><parameter>extmac</parameter></entry> - <entry>MAC structure to be filled in</entry> - </row> - </tbody> - </informaltable> - - <para>Given an internalized subject or object label, fill out - an externalized label. This call is permitted to fail. - This call will be obsoleted by the new userland and extended - attribute interfaces for the MAC framework.</para> - </sect3> - - <sect3 id="mac-mpo-internalize"> - <title><function>&mac.mpo;_internalize</function></title> - - <funcsynopsis> - <funcprototype> - <funcdef>void - <function>&mac.mpo;_internalize</function></funcdef> - - <paramdef>struct label - *<parameter>label</parameter></paramdef> - <paramdef>struct mac - *<parameter>extmac</parameter></paramdef> - </funcprototype> - </funcsynopsis> - - <informaltable> - <tgroup cols="3"> - &mac.thead; - - <tbody> - <row> - <entry><parameter>label</parameter></entry> - <entry>Label to be filled in</entry> - </row> - - <row> - <entry><parameter>extmac</parameter></entry> - <entry>MAC structure to internalize</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>Given an externalized subject or object label, likely - from userland, internalize the label. The entry point - implementation should handle incorrect or corrupted labels. - This call is permitted to fail. This call will be obsoleted - by the new userland and extended attribute interfaces for - the MAC framework.</para> - </sect3> - </sect2> - - <sect2 id="mac-framework-api"> - <title>Additional Framework API Calls</title> - - <para>The <symbol>MAC_SYSCALL</symbol> entry point provides a - policy-multiplexed system call so that policies may provide - additional services to user processes without registering - specific system calls. The policy name provided during - registration is used to demux calls from userland, and the - arguments will be forwarded to this entry point. When - implementing new services, security modules should be sure to - invoke appropriate access control checks from the MAC - framework as needed. For example, if a policy implements an - augmented signal functionality, it should call the necessary - signal access control checks to invoke the MAC framework and - other registered policies.</para> - </sect2> - </sect1> - - <sect1 id="mac-userland-api"> - <title>Userland APIs</title> - - <para>The userland API is still under development.</para> - </sect1> - - <sect1 id="mac-sample-modules"> - <title>Sample Policy Modules</title> - - <para>The <filename>mac_none</filename> policy provides sample - prototypes and registration of all available policy entry - points.</para> - - <para>The <filename>mac_seeotheruids</filename> policy provides - a simple access control policy without the use of labeling, - relying only on information already present in the kernel - objects.</para> - - <para>The <filename>mac_biba</filename> policy provides a sample - information flow based labeled access control policy, - assigning labels to all kernel objects.</para> - </sect1> - - <sect1 id="mac-system-integration"> - <title>System Integration</title> - <para>...</para> - </sect1> - - <sect1 id="mac-conclusion"> - <title>Conclusion</title> - - <para>The TrustedBSD MAC framework permits kernel modules to - augment the system security policy in a highly integrated - manner. They may do this based on existing object properties, - or based on label data that is maintained with the assistance of - the MAC framework. The framework is sufficiently flexible to - implement a variety of policy types, including information flow - security policies such as MLS and Biba, as well as policies - based on existing BSD credentials or file protections. Policy - authors may wish to consult this documentation as well as - existing security modules when implementing a new security - service.</para> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/newbus/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/newbus/chapter.sgml deleted file mode 100644 index 3a4528b32b..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/newbus/chapter.sgml +++ /dev/null @@ -1,362 +0,0 @@ -<!-- - The FreeBSD Documentation Project - $FreeBSD$ - - Originally by: Jeroen Ruigrok van der Warven - Date: newbus-draft.txt,v 1.8 2001/01/25 08:01:08 - Copyright (c) 2000 Jeroen Ruigrok van der Warven (asmodai@wxs.nl) - Copyright (c) 2002 Hiten Mahesh Pandya (hiten@uk.FreeBSD.org) - - Future Additions: - - o Expand the information about device_t - o Add information about the bus_* functions. - o Add information about bus specific (e.g. PCI) functions. - o Add a reference section for additional information. - o Add more newbus related structures and typedefs. - o Add a 'Terminology' section. - o Add information on resource manager functions, busspace - manager functions, newbus events related functions. - o More cleanup ... ! - - Provided under the FreeBSD Documentation License. ---> -<chapter id="newbus"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Jeroen</firstname> - <surname>Ruigrok van der Werven</surname> - <affiliation><address><email>asmodai@FreeBSD.org</email></address> - </affiliation> - <contrib>Written by </contrib> - </author> - </authorgroup> - <authorgroup> - <author> - <firstname>Hiten</firstname> - <surname>Pandya</surname> - <affiliation><address><email>hiten@uk.FreeBSD.org</email></address> - </affiliation> - </author> - </authorgroup> - </chapterinfo> - <title>Newbus</title> - - <para><emphasis>Special thanks to Mathew N. Dodd, Warner Losh, Bill Paul. - Daug Rabson, Mike Smith, Peter Wemm and Scott Long.</emphasis></para> - - <para>This chapter explains the Newbus device framework in detail.</para> - <sect1 id="devdrivers"> - <title>Device Drivers</title> - <sect2> - <title>Purpose of a Device Driver</title> - <para>A device driver is a software component which provides the - interface between the kernel's generic view of a peripheral - (e.g. disk, network adapter) and the actual implementation of the - peripheral. The <emphasis>device driver interface (DDI)</emphasis> is - the defined interface between the kernel and the device driver component. - </para> - </sect2> - - <sect2> - <title>Types of Device Drivers</title> - <para>There used to be days in &unix;, and thus FreeBSD, in which there - were four types of devices defined:</para> - - <itemizedlist> - <listitem><para>block device drivers</para></listitem> - <listitem><para>character device drivers</para></listitem> - <listitem><para>network device drivers</para></listitem> - <listitem><para>pseudo-device drivers</para></listitem> - </itemizedlist> - - <para><emphasis>Block devices</emphasis> performed in way that used - fixed size blocks [of data]. This type of driver depended on the - so called <emphasis>buffer cache</emphasis>, which had the purpose - to cache accessed blocks of data in a dedicated part of the memory. - Often this buffer cache was based on write-behind, which meant that when - data was modified in memory it got synced to disk whenever the system - did its periodical disk flushing, thus optimizing writes.</para> - </sect2> - - <sect2> - <title>Character devices</title> - <para>However, in the versions of FreeBSD 4.0 and onward the - distinction between block and character devices became non-existent. - </para> - </sect2> - </sect1> - - <sect1 id="newbus-overview"> - <!-- - Real title: - Newbus, Busspace and the Resource Manager, an Explanation of the Possibilities - --> - <title>Overview of Newbus</title> - <para><emphasis>Newbus</emphasis> is the implementation of a new bus - architecture based on abstraction layers which saw its introduction in - FreeBSD 3.0 when the Alpha port was imported into the source tree. It was - not until 4.0 before it became the default system to use for device - drivers. Its goals are to provide a more object oriented means of - interconnecting the various busses and devices which a host system - provides to the <emphasis>Operating System</emphasis>.</para> - - <para>Its main features include amongst others:</para> - - <itemizedlist> - <listitem><para>dynamic attaching</para></listitem> - <listitem><para>easy modularization of drivers</para></listitem> - <listitem><para>pseudo-busses</para></listitem> - </itemizedlist> - - <para>One of the most prominent changes is the migration from the flat and - ad-hoc system to a device tree lay-out.</para> - - <para>At the top level resides the <emphasis><quote>root</quote></emphasis> - device which is the parent to hang all other devices on. For each - architecture, there is typically a single child of <quote>root</quote> - which has such things as <emphasis>host-to-PCI bridges</emphasis>, etc. - attached to it. For x86, this <quote>root</quote> device is the - <emphasis><quote>nexus</quote></emphasis> device and for Alpha, various - different different models of Alpha have different top-level devices - corresponding to the different hardware chipsets, including - <emphasis>lca</emphasis>, <emphasis>apecs</emphasis>, - <emphasis>cia</emphasis> and <emphasis>tsunami</emphasis>.</para> - - <para>A device in the Newbus context represents a single hardware entity - in the system. For instance each PCI device is represented by a Newbus - device. Any device in the system can have children; a device which has - children is often called a <emphasis><quote>bus</quote></emphasis>. - Examples of common busses in the system are ISA and PCI which manage lists - of devices attached to ISA and PCI busses respectively.</para> - - <para>Often, a connection between different kinds of bus is represented by - a <emphasis><quote>bridge</quote></emphasis> device which normally has one - child for the attached bus. An example of this is a - <emphasis>PCI-to-PCI bridge</emphasis> which is represented by a device - <emphasis><devicename>pcibN</devicename></emphasis> on the parent PCI bus - and has a child <emphasis><devicename>pciN</devicename></emphasis> for the - attached bus. This layout simplifies the implementation of the PCI bus - tree, allowing common code to be used for both top-level and bridged - busses.</para> - - <para>Each device in the Newbus architecture asks its parent to map its - resources. The parent then asks its own parent until the nexus is - reached. So, basically the nexus is the only part of the Newbus system - which knows about all resources.</para> - - <tip><para>An ISA device might want to map its IO port at - <literal>0x230</literal>, so it asks its parent, in this case the ISA - bus. The ISA bus hands it over to the PCI-to-ISA bridge which in its turn - asks the PCI bus, which reaches the host-to-PCI bridge and finally the - nexus. The beauty of this transition upwards is that there is room to - translate the requests. For example, the <literal>0x230</literal> IO port - request might become memory-mapped at <literal>0xb0000230</literal> on a - <acronym>MIPS</acronym> box by the PCI bridge.</para></tip> - - <para>Resource allocation can be controlled at any place in the device - tree. For instance on many Alpha platforms, ISA interrupts are managed - separately from PCI interrupts and resource allocations for ISA interrupts - are managed by the Alpha's ISA bus device. On IA-32, ISA and PCI - interrupts are both managed by the top-level nexus device. For both - ports, memory and port address space is managed by a single entity - nexus - for IA-32 and the relevant chipset driver on Alpha (e.g. CIA or tsunami). - </para> - - <para>In order to normalize access to memory and port mapped resources, - Newbus integrates the <literal>bus_space</literal> APIs from NetBSD. - These provide a single API to replace inb/outb and direct memory - reads/writes. The advantage of this is that a single driver can easily - use either memory-mapped registers or port-mapped registers - (some hardware supports both).</para> - - <para>This support is integrated into the resource allocation mechanism. - When a resource is allocated, a driver can retrieve the associated - <structfield>bus_space_tag_t</structfield> and - <structfield>bus_space_handle_t</structfield> from the resource.</para> - - <para>Newbus also allows for definitions of interface methods in files - dedicated to this purpose. These are the <filename>.m</filename> files - that are found under the <filename>src/sys</filename> hierarchy.</para> - - <para>The core of the Newbus system is an extensible - <quote>object-based programming</quote> model. Each device in the system - has a table of methods which it supports. The system and other devices - uses those methods to control the device and request services. The - different methods supported by a device are defined by a number of - <quote>interfaces</quote>. An <quote>interface</quote> is simply a group - of related methods which can be implemented by a device.</para> - - <para>In the Newbus system, the methods for a device are provided by the - various device drivers in the system. When a device is attached to a - driver during <emphasis>auto-configuration</emphasis>, it uses the method - table declared by the driver. A device can later - <emphasis>detach</emphasis> from its driver and - <emphasis>re-attach</emphasis> to a new driver with a new method table. - This allows dynamic replacement of drivers which can be useful for driver - development.</para> - - <para>The interfaces are described by an interface definition language - similar to the language used to define vnode operations for file systems. - The interface would be stored in a methods file (which would normally named - <filename>foo_if.m</filename>).</para> - - <example> - <title>Newbus Methods</title> - <programlisting> - # Foo subsystem/driver (a comment...) - - INTERFACE foo - - METHOD int doit { - device_t dev; - }; - - # DEFAULT is the method that will be used, if a method was not - # provided via: DEVMETHOD() - - METHOD void doit_to_child { - device_t dev; - driver_t child; - } DEFAULT doit_generic_to_child; - </programlisting> - </example> - - <para>When this interface is compiled, it generates a header file - <quote><filename>foo_if.h</filename></quote> which contains function - declarations:</para> - - <programlisting> - int FOO_DOIT(device_t dev); - int FOO_DOIT_TO_CHILD(device_t dev, device_t child); - </programlisting> - - <para>A source file, <quote><filename>foo_if.c</filename></quote> is - also created to accompany the automatically generated header file; it - contains implementations of those functions which look up the location - of the relevant functions in the object's method table and call that - function.</para> - - <para>The system defines two main interfaces. The first fundamental - interface is called <emphasis><quote>device</quote></emphasis> and - includes methods which are relevant to all devices. Methods in the - <emphasis><quote>device</quote></emphasis> interface include - <emphasis><quote>probe</quote></emphasis>, - <emphasis><quote>attach</quote></emphasis> and - <emphasis><quote>detach</quote></emphasis> to control detection of - hardware and <emphasis><quote>shutdown</quote></emphasis>, - <emphasis><quote>suspend</quote></emphasis> and - <emphasis><quote>resume</quote></emphasis> for critical event - notification.</para> - - <para>The second, more complex interface is - <emphasis><quote>bus</quote></emphasis>. This interface contains - methods suitable for devices which have children, including methods to - access bus specific per-device information - <footnote><para>&man.bus.generic.read.ivar.9; and - &man.bus.generic.write.ivar.9;</para></footnote>, event notification - (<emphasis><literal>child_detached</literal></emphasis>, - <emphasis><literal>driver_added</literal></emphasis>) and resource - management (<emphasis><literal>alloc_resource</literal></emphasis>, - <emphasis><literal>activate_resource</literal></emphasis>, - <emphasis><literal>deactivate_resource</literal></emphasis>, - <emphasis><literal>release_resource</literal></emphasis>). - - <para>Many methods in the <quote>bus</quote> interface are performing - services for some child of the bus device. These methods would normally - use the first two arguments to specify the bus providing the service - and the child device which is requesting the service. To simplify - driver code, many of these methods have accessor functions which - lookup the parent and call a method on the parent. For instance the - method - <literal>BUS_TEARDOWN_INTR(device_t dev, device_t child, ...)</literal> - can be called using the function - <literal>bus_teardown_intr(device_t child, ...)</literal>.</para> - - <para>Some bus types in the system define additional interfaces to - provide access to bus-specific functionality. For instance, the PCI - bus driver defines the <quote>pci</quote> interface which has two - methods <emphasis><literal>read_config</literal></emphasis> and - <emphasis><literal>write_config</literal></emphasis> for accessing the - configuration registers of a PCI device.</para> - </sect1> - - <sect1 id="newbus-api"> - <title>Newbus API</title> - <para>As the Newbus API is huge, this section makes some effort at - documenting it. More information to come in the next revision of this - document.</para> - - <sect2> - <title>Important locations in the source hierarchy</title> - - <para><filename>src/sys/[arch]/[arch]</filename> - Kernel code for a - specific machine architecture resides in this directory. for example, - the <literal>i386</literal> architecture, or the - <literal>SPARC64</literal> architecture.</para> - - <para><filename>src/sys/dev/[bus]</filename> - device support for a - specific <literal>[bus]</literal> resides in this directory.</para> - - <para><filename>src/sys/dev/pci</filename> - PCI bus support code - resides in this directory.</para> - - <para><filename>src/sys/[isa|pci]</filename> - PCI/ISA device drivers - reside in this directory. The PCI/ISA bus support code used to exist - in this directory in FreeBSD version <literal>4.0</literal>.</para> - </sect2> - - <sect2> - <title>Important structures and type definitions</title> - <para><literal>devclass_t</literal> - This is a type definition of a - pointer to a <literal>struct devclass</literal>.</para> - - <para><literal>device_method_t</literal> - This is same as - <literal>kobj_method_t</literal> (see - <filename>src/sys/kobj.h</filename>).</para> - - <para><literal>device_t</literal> - This is a type definition of a - pointer to a <literal>struct device</literal>. - <literal>device_t</literal> represents a device in the system. It is - a kernel object. See <filename>src/sys/sys/bus_private.h</filename> - for implementation details.</para> - - <para><literal>driver_t</literal> - This is a type definition which, - references <literal>struct driver</literal>. The - <literal>driver</literal> struct is a class of the - <literal>device</literal> kernel object; it also holds data private - to for the driver.</para> - - <figure> - <title><emphasis>driver_t</emphasis> implementation</title> - <programlisting> - struct driver { - KOBJ_CLASS_FIELDS; - void *priv; /* driver private data */ - }; - </programlisting> - </figure> - - <para>A <literal>device_state_t</literal> type, which is - an enumeration, <literal>device_state</literal>. It contains - the possible states of a Newbus device before and after the - autoconfiguration process.</para> - - <figure> - <title>Device states<emphasis>device_state_t</emphasis></title> - <programlisting> - /* - * src/sys/sys/bus.h - */ - typedef enum device_state { - DS_NOTPRESENT, /* not probed or probe failed */ - DS_ALIVE, /* probe succeeded */ - DS_ATTACHED, /* attach method called */ - DS_BUSY /* device is open */ - } device_state_t; - </programlisting> - </figure> - </sect2> - </sect1> -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml deleted file mode 100644 index 15146dc9e9..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml +++ /dev/null @@ -1,369 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="pci"> - <title>PCI Devices</title> - - <para>This chapter will talk about the FreeBSD mechanisms for - writing a device driver for a device on a PCI bus.</para> - - <sect1> - <title>Probe and Attach</title> - - <para>Information here about how the PCI bus code iterates through - the unattached devices and see if a newly loaded kld will attach - to any of them.</para> - -<programlisting>/* - * Simple KLD to play with the PCI functions. - * - * Murray Stokely - */ - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -#include <sys/types.h> -#include <sys/module.h> -#include <sys/systm.h> /* uprintf */ -#include <sys/errno.h> -#include <sys/param.h> /* defines used in kernel.h */ -#include <sys/kernel.h> /* types used in module initialization */ -#include <sys/conf.h> /* cdevsw struct */ -#include <sys/uio.h> /* uio struct */ -#include <sys/malloc.h> -#include <sys/bus.h> /* structs, prototypes for pci bus stuff */ - -#include <pci/pcivar.h> /* For get_pci macros! */ - -/* Function prototypes */ -d_open_t mypci_open; -d_close_t mypci_close; -d_read_t mypci_read; -d_write_t mypci_write; - -/* Character device entry points */ - -static struct cdevsw mypci_cdevsw = { - mypci_open, - mypci_close, - mypci_read, - mypci_write, - noioctl, - nopoll, - nommap, - nostrategy, - "mypci", - 36, /* reserved for lkms - /usr/src/sys/conf/majors */ - nodump, - nopsize, - D_TTY, - -1 -}; - -/* vars */ -static dev_t sdev; - -/* We're more interested in probe/attach than with - open/close/read/write at this point */ - -int -mypci_open(dev_t dev, int oflags, int devtype, struct proc *p) -{ - int err = 0; - - uprintf("Opened device \"mypci\" successfully.\n"); - return(err); -} - -int -mypci_close(dev_t dev, int fflag, int devtype, struct proc *p) -{ - int err=0; - - uprintf("Closing device \"mypci.\"\n"); - return(err); -} - -int -mypci_read(dev_t dev, struct uio *uio, int ioflag) -{ - int err = 0; - - uprintf("mypci read!\n"); - return err; -} - -int -mypci_write(dev_t dev, struct uio *uio, int ioflag) -{ - int err = 0; - - uprintf("mypci write!\n"); - return(err); -} - -/* PCI Support Functions */ - -/* - * Return identification string if this is device is ours. - */ -static int -mypci_probe(device_t dev) -{ - uprintf("MyPCI Probe\n" - "Vendor ID : 0x%x\n" - "Device ID : 0x%x\n",pci_get_vendor(dev),pci_get_device(dev)); - - if (pci_get_vendor(dev) == 0x11c1) { - uprintf("We've got the Winmodem, probe successful!\n"); - return 0; - } - - return ENXIO; -} - -/* Attach function is only called if the probe is successful */ - -static int -mypci_attach(device_t dev) -{ - uprintf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev)); - sdev = make_dev(<literal>&</literal>mypci_cdevsw, - 0, - UID_ROOT, - GID_WHEEL, - 0600, - "mypci"); - uprintf("Mypci device loaded.\n"); - return ENXIO; -} - -/* Detach device. */ - -static int -mypci_detach(device_t dev) -{ - uprintf("Mypci detach!\n"); - return 0; -} - -/* Called during system shutdown after sync. */ - -static int -mypci_shutdown(device_t dev) -{ - uprintf("Mypci shutdown!\n"); - return 0; -} - -/* - * Device suspend routine. - */ -static int -mypci_suspend(device_t dev) -{ - uprintf("Mypci suspend!\n"); - return 0; -} - -/* - * Device resume routine. - */ - -static int -mypci_resume(device_t dev) -{ - uprintf("Mypci resume!\n"); - return 0; -} - -static device_method_t mypci_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, mypci_probe), - DEVMETHOD(device_attach, mypci_attach), - DEVMETHOD(device_detach, mypci_detach), - DEVMETHOD(device_shutdown, mypci_shutdown), - DEVMETHOD(device_suspend, mypci_suspend), - DEVMETHOD(device_resume, mypci_resume), - - { 0, 0 } -}; - -static driver_t mypci_driver = { - "mypci", - mypci_methods, - 0, - /* sizeof(struct mypci_softc), */ -}; - -static devclass_t mypci_devclass; - -DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);</programlisting> - - <para>Additional Resources - <itemizedlist> - <listitem><simpara><ulink url="http://www.pcisig.org/">PCI - Special Interest Group</ulink></simpara></listitem> - - <listitem><simpara>PCI System Architecture, Fourth Edition by - Tom Shanley, et al.</simpara></listitem> - - </itemizedlist> - </para> - </sect1> - - <sect1> - <title>Bus Resources</title> - - <para>FreeBSD provides an object-oriented mechanism for requesting - resources from a parent bus. Almost all devices will be a child - member of some sort of bus (PCI, ISA, USB, SCSI, etc) and these - devices need to acquire resources from their parent bus (such as - memory segments, interrupt lines, or DMA channels).</para> - - <sect2> - <title>Base Address Registers</title> - - <para>To do anything particularly useful with a PCI device you - will need to obtain the <emphasis>Base Address - Registers</emphasis> (BARs) from the PCI Configuration space. - The PCI-specific details of obtaining the BAR is abstracted in - the <function>bus_alloc_resource()</function> function.</para> - - <para>For example, a typical driver might have something similar - to this in the <function>attach()</function> function:</para> - -<programlisting> sc->bar0id = 0x10; - sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &(sc->bar0id), - 0, ~0, 1, RF_ACTIVE); - if (sc->bar0res == NULL) { - uprintf("Memory allocation of PCI base register 0 failed!\n"); - error = ENXIO; - goto fail1; - } - - sc->bar1id = 0x14; - sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &(sc->bar1id), - 0, ~0, 1, RF_ACTIVE); - if (sc->bar1res == NULL) { - uprintf("Memory allocation of PCI base register 1 failed!\n"); - error = ENXIO; - goto fail2; - } - sc->bar0_bt = rman_get_bustag(sc->bar0res); - sc->bar0_bh = rman_get_bushandle(sc->bar0res); - sc->bar1_bt = rman_get_bustag(sc->bar1res); - sc->bar1_bh = rman_get_bushandle(sc->bar1res); - -</programlisting> - - <para>Handles for each base address register are kept in the - <structname>softc</structname> structure so that they can be - used to write to the device later.</para> - - <para>These handles can then be used to read or write from the - device registers with the <function>bus_space_*</function> - functions. For example, a driver might contain a shorthand - function to read from a board specific register like this:</para> - -<programlisting>uint16_t -board_read(struct ni_softc *sc, uint16_t address) { - return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address); -} -</programlisting> - - <para>Similarly, one could write to the registers with:</para> - -<programlisting>void -board_write(struct ni_softc *sc, uint16_t address, uint16_t value) { - bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value); -} -</programlisting> - - <para>These functions exist in 8bit, 16bit, and 32bit versions - and you should use - <function>bus_space_{read|write}_{1|2|4}</function> - accordingly.</para> - - </sect2> - <sect2> - <title>Interrupts</title> - - <para>Interrupts are allocated from the object-oriented bus code - in a way similar to the memory resources. First an IRQ - resource must be allocated from the parent bus, and then the - interrupt handler must be setup to deal with this IRQ.</para> - - <para>Again, a sample from a device - <function>attach()</function> function says more than - words.</para> - -<programlisting>/* Get the IRQ resource */ - - sc->irqid = 0x0; - sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &(sc->irqid), - 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); - if (sc->irqres == NULL) { - uprintf("IRQ allocation failed!\n"); - error = ENXIO; - goto fail3; - } - - /* Now we should setup the interrupt handler */ - - error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC, - my_handler, sc, &(sc->handler)); - if (error) { - printf("Couldn't set up irq\n"); - goto fail4; - } - - sc->irq_bt = rman_get_bustag(sc->irqres); - sc->irq_bh = rman_get_bushandle(sc->irqres); -</programlisting> - - </sect2> - - <sect2> - <title>DMA</title> - <para>On the PC, peripherals that want to do bus-mastering DMA - must deal with physical addresses. This is a problem since - FreeBSD uses virtual memory and deals almost exclusively with - virtual addresses. Fortunately, there is a function, - <function>vtophys()</function> to help.</para> - -<programlisting>#include <vm/vm.h> -#include <vm/pmap.h> - -#define vtophys(virtual_address) (...) -</programlisting> - - <para>The solution is a bit different on the alpha however, and - what we really want is a function called - <function>vtobus()</function>.</para> - -<programlisting>#if defined(__alpha__) -#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va) -#else -#define vtobus(va) vtophys(va) -#endif -</programlisting> - - </sect2> - - <sect2> - <title>Deallocating Resources</title> - - <para>It is very important to deallocate all of the resources - that were allocated during <function>attach()</function>. - Care must be taken to deallocate the correct stuff even on a - failure condition so that the system will remain usable while - your driver dies.</para> - - </sect2> - </sect1> - -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml deleted file mode 100644 index fa00f66106..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml +++ /dev/null @@ -1,1983 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="scsi"> - <title>Common Access Method SCSI Controllers</title> - - <para><emphasis>This chapter was written by &a.babkin; - Modifications for the handbook made by - &a.murray;.</emphasis></para> - - <sect1> - <title>Synopsis</title> - - <para>This document assumes that the reader has a general - understanding of device drivers in FreeBSD and of the SCSI - protocol. Much of the information in this document was - extracted from the drivers:</para> - - <itemizedlist> - - <listitem><para>ncr (<filename>/sys/pci/ncr.c</filename>) by - Wolfgang Stanglmeier and Stefan Esser</para></listitem> - - <listitem><para>sym (<filename>/sys/pci/sym.c</filename>) by - Gerard Roudier</para></listitem> - - <listitem><para>aic7xxx - (<filename>/sys/dev/aic7xxx/aic7xxx.c</filename>) by Justin - T. Gibbs</para></listitem> - - </itemizedlist> - - <para>and from the CAM code itself (by Justing T. Gibbs, see - <filename>/sys/cam/*</filename>). When some solution looked the - most logical and was essentially verbatim extracted from the code - by Justin Gibbs, I marked it as <quote>recommended</quote>.</para> - - <para>The document is illustrated with examples in - pseudo-code. Although sometimes the examples have many details - and look like real code, it is still pseudo-code. It was written - to demonstrate the concepts in an understandable way. For a real - driver other approaches may be more modular and efficient. It - also abstracts from the hardware details, as well as issues that - would cloud the demonstrated concepts or that are supposed to be - described in the other chapters of the developers handbook. Such - details are commonly shown as calls to functions with descriptive - names, comments or pseudo-statements. Fortunately real life - full-size examples with all the details can be found in the real - drivers.</para> - - </sect1> - - <sect1> - <title>General architecture</title> - - <para>CAM stands for Common Access Method. It is a generic way to - address the I/O buses in a SCSI-like way. This allows a - separation of the generic device drivers from the drivers - controlling the I/O bus: for example the disk driver becomes able - to control disks on both SCSI, IDE, and/or any other bus so the - disk driver portion does not have to be rewritten (or copied and - modified) for every new I/O bus. Thus the two most important - active entities are:</para> - - <itemizedlist> - <listitem><para><emphasis>Peripheral Modules</emphasis> - a - driver for peripheral devices (disk, tape, CDROM, - etc.)</para></listitem> - <listitem><para><emphasis>SCSI Interface Modules </emphasis>(SIM) - - a Host Bus Adapter drivers for connecting to an I/O bus such - as SCSI or IDE.</para></listitem> - </itemizedlist> - - <para>A peripheral driver receives requests from the OS, converts - them to a sequence of SCSI commands and passes these SCSI - commands to a SCSI Interface Module. The SCSI Interface Module - is responsible for passing these commands to the actual hardware - (or if the actual hardware is not SCSI but, for example, IDE - then also converting the SCSI commands to the native commands of - the hardware).</para> - - <para>Because we are interested in writing a SCSI adapter driver - here, from this point on we will consider everything from the - SIM standpoint.</para> - - <para>A typical SIM driver needs to include the following - CAM-related header files:</para> - -<programlisting>#include <cam/cam.h> -#include <cam/cam_ccb.h> -#include <cam/cam_sim.h> -#include <cam/cam_xpt_sim.h> -#include <cam/cam_debug.h> -#include <cam/scsi/scsi_all.h></programlisting> - - <para>The first thing each SIM driver must do is register itself - with the CAM subsystem. This is done during the driver's - <function>xxx_attach()</function> function (here and further - xxx_ is used to denote the unique driver name prefix). The - <function>xxx_attach()</function> function itself is called by - the system bus auto-configuration code which we do not describe - here.</para> - - <para>This is achieved in multiple steps: first it is necessary to - allocate the queue of requests associated with this SIM:</para> - -<programlisting> struct cam_devq *devq; - - if(( devq = cam_simq_alloc(SIZE) )==NULL) { - error; /* some code to handle the error */ - }</programlisting> - - <para>Here SIZE is the size of the queue to be allocated, maximal - number of requests it could contain. It is the number of requests - that the SIM driver can handle in parallel on one SCSI - card. Commonly it can be calculated as:</para> - -<programlisting>SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET</programlisting> - - <para>Next we create a descriptor of our SIM:</para> - -<programlisting> struct cam_sim *sim; - - if(( sim = cam_sim_alloc(action_func, poll_func, driver_name, - softc, unit, max_dev_transactions, - max_tagged_dev_transactions, devq) )==NULL) { - cam_simq_free(devq); - error; /* some code to handle the error */ - }</programlisting> - - <para>Note that if we are not able to create a SIM descriptor we - free the <structname>devq</structname> also because we can do - nothing else with it and we want to conserve memory.</para> - - <para>If a SCSI card has multiple SCSI buses on it then each bus - requires its own <structname>cam_sim</structname> - structure.</para> - - <para>An interesting question is what to do if a SCSI card has - more than one SCSI bus, do we need one - <structname>devq</structname> structure per card or per SCSI - bus? The answer given in the comments to the CAM code is: - either way, as the driver's author prefers.</para> - - <para>The arguments are: - <itemizedlist> - - <listitem><para><function>action_func</function> - pointer to - the driver's <function>xxx_action</function> function. - <funcSynopsis><funcPrototype> - <funcDef>static void - <function>xxx_action</function> - </funcDef> - <paramdef> - <parameter>struct cam_sim *sim</parameter>, - <parameter>union ccb *ccb</parameter> - </paramdef> - </funcPrototype></funcSynopsis> - </para></listitem> - - <listitem><para><function>poll_func</function> - pointer to - the driver's <function>xxx_poll()</function> - <funcSynopsis><funcPrototype> - <funcDef>static void - <function>xxx_poll</function> - </funcDef> - <paramdef> - <parameter>struct cam_sim *sim</parameter> - </paramdef> - </funcPrototype></funcSynopsis> - </para></listitem> - - <listitem><para>driver_name - the name of the actual driver, - such as <quote>ncr</quote> or <quote>wds</quote>.</para></listitem> - - <listitem><para><structName>softc</structName> - pointer to the - driver's internal descriptor for this SCSI card. This - pointer will be used by the driver in future to get private - data.</para></listitem> - - <listitem><para>unit - the controller unit number, for example - for controller <quote>wds0</quote> this number will be - 0</para></listitem> - - <listitem><para>max_dev_transactions - maximal number of - simultaneous transactions per SCSI target in the non-tagged - mode. This value will be almost universally equal to 1, with - possible exceptions only for the non-SCSI cards. Also the - drivers that hope to take advantage by preparing one - transaction while another one is executed may set it to 2 - but this does not seem to be worth the - complexity.</para></listitem> - - <listitem><para>max_tagged_dev_transactions - the same thing, - but in the tagged mode. Tags are the SCSI way to initiate - multiple transactions on a device: each transaction is - assigned a unique tag and the transaction is sent to the - device. When the device completes some transaction it sends - back the result together with the tag so that the SCSI - adapter (and the driver) can tell which transaction was - completed. This argument is also known as the maximal tag - depth. It depends on the abilities of the SCSI - adapter.</para></listitem> - </itemizedlist> - </para> - - <para>Finally we register the SCSI buses associated with our SCSI - adapter:</para> - -<programlisting> if(xpt_bus_register(sim, bus_number) != CAM_SUCCESS) { - cam_sim_free(sim, /*free_devq*/ TRUE); - error; /* some code to handle the error */ - }</programlisting> - - <para>If there is one <structName>devq</structName> structure per - SCSI bus (i.e. we consider a card with multiple buses as - multiple cards with one bus each) then the bus number will - always be 0, otherwise each bus on the SCSI card should be get a - distinct number. Each bus needs its own separate structure - cam_sim.</para> - - <para>After that our controller is completely hooked to the CAM - system. The value of <structName>devq</structName> can be - discarded now: sim will be passed as an argument in all further - calls from CAM and devq can be derived from it.</para> - - <para>CAM provides the framework for such asynchronous - events. Some events originate from the lower levels (the SIM - drivers), some events originate from the peripheral drivers, - some events originate from the CAM subsystem itself. Any driver - can register callbacks for some types of the asynchronous - events, so that it would be notified if these events - occur.</para> - - <para>A typical example of such an event is a device reset. Each - transaction and event identifies the devices to which it applies - by the means of <quote>path</quote>. The target-specific events normally - occur during a transaction with this device. So the path from - that transaction may be re-used to report this event (this is - safe because the event path is copied in the event reporting - routine but not deallocated nor passed anywhere further). Also - it is safe to allocate paths dynamically at any time including - the interrupt routines, although that incurs certain overhead, - and a possible problem with this approach is that there may be - no free memory at that time. For a bus reset event we need to - define a wildcard path including all devices on the bus. So we - can create the path for the future bus reset events in advance - and avoid problems with the future memory shortage:</para> - -<programlisting> struct cam_path *path; - - if(xpt_create_path(&path, /*periph*/NULL, - cam_sim_path(sim), CAM_TARGET_WILDCARD, - CAM_LUN_WILDCARD) != CAM_REQ_CMP) { - xpt_bus_deregister(cam_sim_path(sim)); - cam_sim_free(sim, /*free_devq*/TRUE); - error; /* some code to handle the error */ - } - - softc->wpath = path; - softc->sim = sim;</programlisting> - - <para>As you can see the path includes:</para> - - <itemizedlist> - <listitem><para>ID of the peripheral driver (NULL here because we have - none)</para></listitem> - - <listitem><para>ID of the SIM driver - (<function>cam_sim_path(sim)</function>)</para></listitem> - - <listitem><para>SCSI target number of the device (CAM_TARGET_WILDCARD - means <quote>all devices</quote>)</para></listitem> - - <listitem><para>SCSI LUN number of the subdevice (CAM_LUN_WILDCARD means - <quote>all LUNs</quote>)</para></listitem> - </itemizedlist> - - <para>If the driver can not allocate this path it will not be able to - work normally, so in that case we dismantle that SCSI - bus.</para> - - <para>And we save the path pointer in the - <structName>softc</structName> structure for future use. After - that we save the value of sim (or we can also discard it on the - exit from <function>xxx_probe()</function> if we wish).</para> - - <para>That is all for a minimalistic initialization. To do things - right there is one more issue left. </para> - - <para>For a SIM driver there is one particularly interesting - event: when a target device is considered lost. In this case - resetting the SCSI negotiations with this device may be a good - idea. So we register a callback for this event with CAM. The - request is passed to CAM by requesting CAM action on a CAM - control block for this type of request:</para> - -<programlisting> struct ccb_setasync csa; - - xpt_setup_ccb(&csa.ccb_h, path, /*priority*/5); - csa.ccb_h.func_code = XPT_SASYNC_CB; - csa.event_enable = AC_LOST_DEVICE; - csa.callback = xxx_async; - csa.callback_arg = sim; - xpt_action((union ccb *)&csa);</programlisting> - - <para>Now we take a look at the <function>xxx_action()</function> - and <function>xxx_poll()</function> driver entry points.</para> - - <para> - <funcSynopsis><funcPrototype> - <funcDef>static void - <function>xxx_action</function> - </funcDef> - <paramdef> - <parameter>struct cam_sim *sim</parameter>, - <parameter>union ccb *ccb</parameter> - </paramdef> - </funcPrototype></funcSynopsis> - </para> - - <para>Do some action on request of the CAM subsystem. Sim - describes the SIM for the request, CCB is the request - itself. CCB stands for <quote>CAM Control Block</quote>. It is a union of - many specific instances, each describing arguments for some type - of transactions. All of these instances share the CCB header - where the common part of arguments is stored.</para> - - <para>CAM supports the SCSI controllers working in both initiator - (<quote>normal</quote>) mode and target (simulating a SCSI device) mode. Here - we only consider the part relevant to the initiator mode.</para> - - <para>There are a few function and macros (in other words, - methods) defined to access the public data in the struct sim:</para> - - <itemizedlist> - <listitem><para><function>cam_sim_path(sim)</function> - the - path ID (see above)</para></listitem> - - <listitem><para><function>cam_sim_name(sim)</function> - the - name of the sim</para></listitem> - - <listitem><para><function>cam_sim_softc(sim)</function> - the - pointer to the softc (driver private data) - structure</para></listitem> - - <listitem><para><function> cam_sim_unit(sim)</function> - the - unit number</para></listitem> - - <listitem><para><function> cam_sim_bus(sim)</function> - the bus - ID</para></listitem> - </itemizedlist> - - <para>To identify the device, <function>xxx_action()</function> can - get the unit number and pointer to its structure softc using - these functions.</para> - - <para>The type of request is stored in - <structField>ccb->ccb_h.func_code</structField>. So generally - <function>xxx_action()</function> consists of a big - switch:</para> - -<programlisting> struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim); - struct ccb_hdr *ccb_h = &ccb->ccb_h; - int unit = cam_sim_unit(sim); - int bus = cam_sim_bus(sim); - - switch(ccb_h->func_code) { - case ...: - ... - default: - ccb_h->status = CAM_REQ_INVALID; - xpt_done(ccb); - break; - }</programlisting> - - <para>As can be seen from the default case (if an unknown command - was received) the return code of the command is set into - <structField>ccb->ccb_h.status</structField> and the completed - CCB is returned back to CAM by calling - <function>xpt_done(ccb)</function>. </para> - - <para><function>xpt_done()</function> does not have to be called - from <function>xxx_action()</function>: For example an I/O - request may be enqueued inside the SIM driver and/or its SCSI - controller. Then when the device would post an interrupt - signaling that the processing of this request is complete - <function>xpt_done()</function> may be called from the interrupt - handling routine.</para> - - <para>Actually, the CCB status is not only assigned as a return - code but a CCB has some status all the time. Before CCB is - passed to the <function>xxx_action()</function> routine it gets - the status CCB_REQ_INPROG meaning that it is in progress. There - are a surprising number of status values defined in - <filename>/sys/cam/cam.h</filename> which should be able to - represent the status of a request in great detail. More - interesting yet, the status is in fact a <quote>bitwise or</quote> of an - enumerated status value (the lower 6 bits) and possible - additional flag-like bits (the upper bits). The enumerated - values will be discussed later in more detail. The summary of - them can be found in the Errors Summary section. The possible - status flags are:</para> - - <itemizedlist> - - <listitem><para><emphasis>CAM_DEV_QFRZN</emphasis> - if the - SIM driver gets a serious error (for example, the device does - not respond to the selection or breaks the SCSI protocol) when - processing a CCB it should freeze the request queue by calling - <function>xpt_freeze_simq()</function>, return the other - enqueued but not processed yet CCBs for this device back to - the CAM queue, then set this flag for the troublesome CCB and - call <function>xpt_done()</function>. This flag causes the CAM - subsystem to unfreeze the queue after it handles the - error.</para></listitem> - - <listitem><para><emphasis>CAM_AUTOSNS_VALID</emphasis> - if - the device returned an error condition and the flag - CAM_DIS_AUTOSENSE is not set in CCB the SIM driver must - execute the REQUEST SENSE command automatically to extract the - sense (extended error information) data from the device. If - this attempt was successful the sense data should be saved in - the CCB and this flag set.</para></listitem> - - <listitem><para><emphasis>CAM_RELEASE_SIMQ</emphasis> - like - CAM_DEV_QFRZN but used in case there is some problem (or - resource shortage) with the SCSI controller itself. Then all - the future requests to the controller should be stopped by - <function>xpt_freeze_simq()</function>. The controller queue - will be restarted after the SIM driver overcomes the shortage - and informs CAM by returning some CCB with this flag - set.</para></listitem> - - <listitem><para><emphasis>CAM_SIM_QUEUED</emphasis> - when SIM - puts a CCB into its request queue this flag should be set (and - removed when this CCB gets dequeued before being returned back - to CAM). This flag is not used anywhere in the CAM code now, - so its purpose is purely diagnostic.</para></listitem> - - </itemizedlist> - - <para>The function <function>xxx_action()</function> is not - allowed to sleep, so all the synchronization for resource access - must be done using SIM or device queue freezing. Besides the - aforementioned flags the CAM subsystem provides functions - <function>xpt_release_simq()</function> and - <function>xpt_release_devq()</function> to unfreeze the queues - directly, without passing a CCB to CAM.</para> - - <para>The CCB header contains the following fields:</para> - - <itemizedlist> - - <listitem><para><emphasis>path</emphasis> - path ID for the - request</para></listitem> - - <listitem><para><emphasis>target_id</emphasis> - target device - ID for the request</para></listitem> - - <listitem><para><emphasis>target_lun</emphasis> - LUN ID of - the target device</para></listitem> - - <listitem><para><emphasis>timeout</emphasis> - timeout - interval for this command, in milliseconds</para></listitem> - - <listitem><para><emphasis>timeout_ch</emphasis> - a - convenience place for the SIM driver to store the timeout handle - (the CAM subsystem itself does not make any assumptions about - it)</para></listitem> - - <listitem><para><emphasis>flags</emphasis> - various bits of - information about the request spriv_ptr0, spriv_ptr1 - fields - reserved for private use by the SIM driver (such as linking to - the SIM queues or SIM private control blocks); actually, they - exist as unions: spriv_ptr0 and spriv_ptr1 have the type (void - *), spriv_field0 and spriv_field1 have the type unsigned long, - sim_priv.entries[0].bytes and sim_priv.entries[1].bytes are byte - arrays of the size consistent with the other incarnations of the - union and sim_priv.bytes is one array, twice - bigger.</para></listitem> - - </itemizedlist> - - <para>The recommended way of using the SIM private fields of CCB - is to define some meaningful names for them and use these - meaningful names in the driver, like:</para> - -<programlisting>#define ccb_some_meaningful_name sim_priv.entries[0].bytes -#define ccb_hcb spriv_ptr1 /* for hardware control block */</programlisting> - - <para>The most common initiator mode requests are:</para> - <itemizedlist> - <listitem><para><emphasis>XPT_SCSI_IO</emphasis> - execute an - I/O transaction</para> - - <para>The instance <quote>struct ccb_scsiio csio</quote> of the union ccb is - used to transfer the arguments. They are:</para> - - <itemizedlist> - <listitem><para><emphasis>cdb_io</emphasis> - pointer to - the SCSI command buffer or the buffer - itself</para></listitem> - - <listitem><para><emphasis>cdb_len</emphasis> - SCSI - command length</para></listitem> - - <listitem><para><emphasis>data_ptr</emphasis> - pointer to - the data buffer (gets a bit complicated if scatter/gather is - used)</para></listitem> - - <listitem><para><emphasis>dxfer_len</emphasis> - length of - the data to transfer</para></listitem> - - <listitem><para><emphasis>sglist_cnt</emphasis> - counter - of the scatter/gather segments</para></listitem> - - <listitem><para><emphasis>scsi_status</emphasis> - place - to return the SCSI status</para></listitem> - - <listitem><para><emphasis>sense_data</emphasis> - buffer - for the SCSI sense information if the command returns an - error (the SIM driver is supposed to run the REQUEST SENSE - command automatically in this case if the CCB flag - CAM_DIS_AUTOSENSE is not set)</para></listitem> - - <listitem><para><emphasis>sense_len</emphasis> - the - length of that buffer (if it happens to be higher than size - of sense_data the SIM driver must silently assume the - smaller value) resid, sense_resid - if the transfer of data - or SCSI sense returned an error these are the returned - counters of the residual (not transferred) data. They do not - seem to be especially meaningful, so in a case when they are - difficult to compute (say, counting bytes in the SCSI - controller's FIFO buffer) an approximate value will do as - well. For a successfully completed transfer they must be set - to zero.</para></listitem> - - <listitem><para><emphasis>tag_action</emphasis> - the kind - of tag to use: - - <itemizedlist> - <listitem><para>CAM_TAG_ACTION_NONE - do not use tags for this - transaction</para></listitem> - <listitem><para>MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG, - MSG_ORDERED_Q_TAG - value equal to the appropriate tag - message (see /sys/cam/scsi/scsi_message.h); this gives only - the tag type, the SIM driver must assign the tag value - itself</para></listitem> - </itemizedlist> - - </para></listitem> - - </itemizedlist> - - <para>The general logic of handling this request is the - following:</para> - - <para>The first thing to do is to check for possible races, to - make sure that the command did not get aborted when it was - sitting in the queue:</para> - -<programlisting> struct ccb_scsiio *csio = &ccb->csio; - - if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) { - xpt_done(ccb); - return; - }</programlisting> - - <para>Also we check that the device is supported at all by our - controller:</para> - -<programlisting> if(ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID - || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) { - ccb_h->status = CAM_TID_INVALID; - xpt_done(ccb); - return; - } - if(ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) { - ccb_h->status = CAM_LUN_INVALID; - xpt_done(ccb); - return; - }</programlisting> - - <para>Then allocate whatever data structures (such as - card-dependent hardware control block) we need to process this - request. If we ca not then freeze the SIM queue and remember - that we have a pending operation, return the CCB back and ask - CAM to re-queue it. Later when the resources become available - the SIM queue must be unfrozen by returning a ccb with the - CAM_SIMQ_RELEASE bit set in its status. Otherwise, if all went - well, link the CCB with the hardware control block (HCB) and - mark it as queued.</para> - -<programlisting> struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus); - - if(hcb == NULL) { - softc->flags |= RESOURCE_SHORTAGE; - xpt_freeze_simq(sim, /*count*/1); - ccb_h->status = CAM_REQUEUE_REQ; - xpt_done(ccb); - return; - } - - hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb; - ccb_h->status |= CAM_SIM_QUEUED;</programlisting> - - <para>Extract the target data from CCB into the hardware control - block. Check if we are asked to assign a tag and if yes then - generate an unique tag and build the SCSI tag messages. The - SIM driver is also responsible for negotiations with the - devices to set the maximal mutually supported bus width, - synchronous rate and offset.</para> - -<programlisting> hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun; - generate_identify_message(hcb); - if( ccb_h->tag_action != CAM_TAG_ACTION_NONE ) - generate_unique_tag_message(hcb, ccb_h->tag_action); - if( !target_negotiated(hcb) ) - generate_negotiation_messages(hcb);</programlisting> - - <para>Then set up the SCSI command. The command storage may be - specified in the CCB in many interesting ways, specified by - the CCB flags. The command buffer can be contained in CCB or - pointed to, in the latter case the pointer may be physical or - virtual. Since the hardware commonly needs physical address we - always convert the address to the physical one.</para> - - <para>A NOT-QUITE RELATED NOTE: Normally this is done by a call - to vtophys(), but for the PCI device (which account for most - of the SCSI controllers now) drivers' portability to the Alpha - architecture the conversion must be done by vtobus() instead - due to special Alpha quirks. [IMHO it would be much better to - have two separate functions, vtop() and ptobus() then vtobus() - would be a simple superposition of them.] In case if a - physical address is requested it is OK to return the CCB with - the status CAM_REQ_INVALID, the current drivers do that. But - it is also possible to compile the Alpha-specific piece of - code, as in this example (there should be a more direct way to - do that, without conditional compilation in the drivers). If - necessary a physical address can be also converted or mapped - back to a virtual address but with big pain, so we do not do - that.</para> - -<programlisting> if(ccb_h->flags & CAM_CDB_POINTER) { - /* CDB is a pointer */ - if(!(ccb_h->flags & CAM_CDB_PHYS)) { - /* CDB pointer is virtual */ - hcb->cmd = vtobus(csio->cdb_io.cdb_ptr); - } else { - /* CDB pointer is physical */ -#if defined(__alpha__) - hcb->cmd = csio->cdb_io.cdb_ptr | alpha_XXX_dmamap_or ; -#else - hcb->cmd = csio->cdb_io.cdb_ptr ; -#endif - } - } else { - /* CDB is in the ccb (buffer) */ - hcb->cmd = vtobus(csio->cdb_io.cdb_bytes); - } - hcb->cmdlen = csio->cdb_len;</programlisting> - - <para>Now it is time to set up the data. Again, the data storage - may be specified in the CCB in many interesting ways, - specified by the CCB flags. First we get the direction of the - data transfer. The simplest case is if there is no data to - transfer:</para> - -<programlisting> int dir = (ccb_h->flags & CAM_DIR_MASK); - - if (dir == CAM_DIR_NONE) - goto end_data;</programlisting> - - <para>Then we check if the data is in one chunk or in a - scatter-gather list, and the addresses are physical or - virtual. The SCSI controller may be able to handle only a - limited number of chunks of limited length. If the request - hits this limitation we return an error. We use a special - function to return the CCB to handle in one place the HCB - resource shortages. The functions to add chunks are - driver-dependent, and here we leave them without detailed - implementation. See description of the SCSI command (CDB) - handling for the details on the address-translation issues. - If some variation is too difficult or impossible to implement - with a particular card it is OK to return the status - CAM_REQ_INVALID. Actually, it seems like the scatter-gather - ability is not used anywhere in the CAM code now. But at least - the case for a single non-scattered virtual buffer must be - implemented, it is actively used by CAM.</para> - -<programlisting> int rv; - - initialize_hcb_for_data(hcb); - - if((!(ccb_h->flags & CAM_SCATTER_VALID)) { - /* single buffer */ - if(!(ccb_h->flags & CAM_DATA_PHYS)) { - rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir); - } - } else { - rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir); - } - } else { - int i; - struct bus_dma_segment *segs; - segs = (struct bus_dma_segment *)csio->data_ptr; - - if ((ccb_h->flags & CAM_SG_LIST_PHYS) != 0) { - /* The SG list pointer is physical */ - rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt); - } else if (!(ccb_h->flags & CAM_DATA_PHYS)) { - /* SG buffer pointers are virtual */ - for (i = 0; i < csio->sglist_cnt; i++) { - rv = add_virtual_chunk(hcb, segs[i].ds_addr, - segs[i].ds_len, dir); - if (rv != CAM_REQ_CMP) - break; - } - } else { - /* SG buffer pointers are physical */ - for (i = 0; i < csio->sglist_cnt; i++) { - rv = add_physical_chunk(hcb, segs[i].ds_addr, - segs[i].ds_len, dir); - if (rv != CAM_REQ_CMP) - break; - } - } - } - if(rv != CAM_REQ_CMP) { - /* we expect that add_*_chunk() functions return CAM_REQ_CMP - * if they added a chunk successfully, CAM_REQ_TOO_BIG if - * the request is too big (too many bytes or too many chunks), - * CAM_REQ_INVALID in case of other troubles - */ - free_hcb_and_ccb_done(hcb, ccb, rv); - return; - } - end_data:</programlisting> - - <para>If disconnection is disabled for this CCB we pass this - information to the hcb:</para> - -<programlisting> if(ccb_h->flags & CAM_DIS_DISCONNECT) - hcb_disable_disconnect(hcb);</programlisting> - - <para>If the controller is able to run REQUEST SENSE command all - by itself then the value of the flag CAM_DIS_AUTOSENSE should - also be passed to it, to prevent automatic REQUEST SENSE if the - CAM subsystem does not want it.</para> - - <para>The only thing left is to set up the timeout, pass our hcb - to the hardware and return, the rest will be done by the - interrupt handler (or timeout handler).</para> - -<programlisting> ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb, - (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */ - put_hcb_into_hardware_queue(hcb); - return;</programlisting> - - <para>And here is a possible implementation of the function - returning CCB:</para> - -<programlisting> static void - free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status) - { - struct xxx_softc *softc = hcb->softc; - - ccb->ccb_h.ccb_hcb = 0; - if(hcb != NULL) { - untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch); - /* we're about to free a hcb, so the shortage has ended */ - if(softc->flags & RESOURCE_SHORTAGE) { - softc->flags &= ~RESOURCE_SHORTAGE; - status |= CAM_RELEASE_SIMQ; - } - free_hcb(hcb); /* also removes hcb from any internal lists */ - } - ccb->ccb_h.status = status | - (ccb->ccb_h.status & ~(CAM_STATUS_MASK|CAM_SIM_QUEUED)); - xpt_done(ccb); - }</programlisting> - </listitem> - - <listitem><para><emphasis>XPT_RESET_DEV</emphasis> - send the SCSI <quote>BUS - DEVICE RESET</quote> message to a device</para> - - <para>There is no data transferred in CCB except the header and - the most interesting argument of it is target_id. Depending on - the controller hardware a hardware control block just like for - the XPT_SCSI_IO request may be constructed (see XPT_SCSI_IO - request description) and sent to the controller or the SCSI - controller may be immediately programmed to send this RESET - message to the device or this request may be just not supported - (and return the status CAM_REQ_INVALID). Also on completion of - the request all the disconnected transactions for this target - must be aborted (probably in the interrupt routine).</para> - - <para>Also all the current negotiations for the target are lost on - reset, so they might be cleaned too. Or they clearing may be - deferred, because anyway the target would request re-negotiation - on the next transaction.</para></listitem> - - <listitem><para><emphasis>XPT_RESET_BUS</emphasis> - send the RESET signal - to the SCSI bus</para> - - <para>No arguments are passed in the CCB, the only interesting - argument is the SCSI bus indicated by the struct sim - pointer.</para> - - <para>A minimalistic implementation would forget the SCSI - negotiations for all the devices on the bus and return the - status CAM_REQ_CMP.</para> - - <para>The proper implementation would in addition actually reset - the SCSI bus (possible also reset the SCSI controller) and mark - all the CCBs being processed, both those in the hardware queue - and those being disconnected, as done with the status - CAM_SCSI_BUS_RESET. Like:</para> - -<programlisting> int targ, lun; - struct xxx_hcb *h, *hh; - struct ccb_trans_settings neg; - struct cam_path *path; - - /* The SCSI bus reset may take a long time, in this case its completion - * should be checked by interrupt or timeout. But for simplicity - * we assume here that it's really fast. - */ - reset_scsi_bus(softc); - - /* drop all enqueued CCBs */ - for(h = softc->first_queued_hcb; h != NULL; h = hh) { - hh = h->next; - free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET); - } - - /* the clean values of negotiations to report */ - neg.bus_width = 8; - neg.sync_period = neg.sync_offset = 0; - neg.valid = (CCB_TRANS_BUS_WIDTH_VALID - | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID); - - /* drop all disconnected CCBs and clean negotiations */ - for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) { - clean_negotiations(softc, targ); - - /* report the event if possible */ - if(xpt_create_path(&path, /*periph*/NULL, - cam_sim_path(sim), targ, - CAM_LUN_WILDCARD) == CAM_REQ_CMP) { - xpt_async(AC_TRANSFER_NEG, path, &neg); - xpt_free_path(path); - } - - for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++) - for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) { - hh=h->next; - free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET); - } - } - - ccb->ccb_h.status = CAM_REQ_CMP; - xpt_done(ccb); - - /* report the event */ - xpt_async(AC_BUS_RESET, softc->wpath, NULL); - return;</programlisting> - - <para>Implementing the SCSI bus reset as a function may be a good - idea because it would be re-used by the timeout function as a - last resort if the things go wrong.</para></listitem> - - <listitem><para><emphasis>XPT_ABORT</emphasis> - abort the specified - CCB</para> - - <para>The arguments are transferred in the instance <quote>struct - ccb_abort cab</quote> of the union ccb. The only argument field in it - is:</para> - - <para><emphasis>abort_ccb</emphasis> - pointer to the CCB to be - aborted</para> - - <para>If the abort is not supported just return the status - CAM_UA_ABORT. This is also the easy way to minimally implement - this call, return CAM_UA_ABORT in any case.</para> - - <para>The hard way is to implement this request honestly. First - check that abort applies to a SCSI transaction:</para> - -<programlisting> struct ccb *abort_ccb; - abort_ccb = ccb->cab.abort_ccb; - - if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) { - ccb->ccb_h.status = CAM_UA_ABORT; - xpt_done(ccb); - return; - }</programlisting> - - <para>Then it is necessary to find this CCB in our queue. This can - be done by walking the list of all our hardware control blocks - in search for one associated with this CCB:</para> - -<programlisting> struct xxx_hcb *hcb, *h; - - hcb = NULL; - - /* We assume that softc->first_hcb is the head of the list of all - * HCBs associated with this bus, including those enqueued for - * processing, being processed by hardware and disconnected ones. - */ - for(h = softc->first_hcb; h != NULL; h = h->next) { - if(h->ccb == abort_ccb) { - hcb = h; - break; - } - } - - if(hcb == NULL) { - /* no such CCB in our queue */ - ccb->ccb_h.status = CAM_PATH_INVALID; - xpt_done(ccb); - return; - } - - hcb=found_hcb;</programlisting> - - <para>Now we look at the current processing status of the HCB. It - may be either sitting in the queue waiting to be sent to the - SCSI bus, being transferred right now, or disconnected and - waiting for the result of the command, or actually completed by - hardware but not yet marked as done by software. To make sure - that we do not get in any races with hardware we mark the HCB as - being aborted, so that if this HCB is about to be sent to the - SCSI bus the SCSI controller will see this flag and skip - it.</para> - -<programlisting> int hstatus; - - /* shown as a function, in case special action is needed to make - * this flag visible to hardware - */ - set_hcb_flags(hcb, HCB_BEING_ABORTED); - - abort_again: - - hstatus = get_hcb_status(hcb); - switch(hstatus) { - case HCB_SITTING_IN_QUEUE: - remove_hcb_from_hardware_queue(hcb); - /* FALLTHROUGH */ - case HCB_COMPLETED: - /* this is an easy case */ - free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED); - break;</programlisting> - - <para>If the CCB is being transferred right now we would like to - signal to the SCSI controller in some hardware-dependent way - that we want to abort the current transfer. The SCSI controller - would set the SCSI ATTENTION signal and when the target responds - to it send an ABORT message. We also reset the timeout to make - sure that the target is not sleeping forever. If the command - would not get aborted in some reasonable time like 10 seconds - the timeout routine would go ahead and reset the whole SCSI bus. - Because the command will be aborted in some reasonable time we - can just return the abort request now as successfully completed, - and mark the aborted CCB as aborted (but not mark it as done - yet).</para> - -<programlisting> case HCB_BEING_TRANSFERRED: - untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch); - abort_ccb->ccb_h.timeout_ch = - timeout(xxx_timeout, (caddr_t) hcb, 10 * hz); - abort_ccb->ccb_h.status = CAM_REQ_ABORTED; - /* ask the controller to abort that HCB, then generate - * an interrupt and stop - */ - if(signal_hardware_to_abort_hcb_and_stop(hcb) < 0) { - /* oops, we missed the race with hardware, this transaction - * got off the bus before we aborted it, try again */ - goto abort_again; - } - - break;</programlisting> - - <para>If the CCB is in the list of disconnected then set it up as - an abort request and re-queue it at the front of hardware - queue. Reset the timeout and report the abort request to be - completed.</para> - -<programlisting> case HCB_DISCONNECTED: - untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch); - abort_ccb->ccb_h.timeout_ch = - timeout(xxx_timeout, (caddr_t) hcb, 10 * hz); - put_abort_message_into_hcb(hcb); - put_hcb_at_the_front_of_hardware_queue(hcb); - break; - } - ccb->ccb_h.status = CAM_REQ_CMP; - xpt_done(ccb); - return;</programlisting> - - <para>That is all for the ABORT request, although there is one more - issue. Because the ABORT message cleans all the ongoing - transactions on a LUN we have to mark all the other active - transactions on this LUN as aborted. That should be done in the - interrupt routine, after the transaction gets aborted.</para> - - <para>Implementing the CCB abort as a function may be quite a good - idea, this function can be re-used if an I/O transaction times - out. The only difference would be that the timed out transaction - would return the status CAM_CMD_TIMEOUT for the timed out - request. Then the case XPT_ABORT would be small, like - that:</para> - -<programlisting> case XPT_ABORT: - struct ccb *abort_ccb; - abort_ccb = ccb->cab.abort_ccb; - - if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) { - ccb->ccb_h.status = CAM_UA_ABORT; - xpt_done(ccb); - return; - } - if(xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0) - /* no such CCB in our queue */ - ccb->ccb_h.status = CAM_PATH_INVALID; - else - ccb->ccb_h.status = CAM_REQ_CMP; - xpt_done(ccb); - return;</programlisting> - </listitem> - - <listitem><para><emphasis>XPT_SET_TRAN_SETTINGS</emphasis> - explicitly - set values of SCSI transfer settings</para> - - <para>The arguments are transferred in the instance <quote>struct ccb_trans_setting cts</quote> -of the union ccb:</para> - - <itemizedlist> - <listitem><para><emphasis>valid</emphasis> - a bitmask showing - which settings should be updated:</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_SYNC_RATE_VALID</emphasis> - - synchronous transfer rate</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_SYNC_OFFSET_VALID</emphasis> - - synchronous offset</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_BUS_WIDTH_VALID</emphasis> - - bus width</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_DISC_VALID</emphasis> - - set enable/disable disconnection</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_TQ_VALID</emphasis> - set - enable/disable tagged queuing</para></listitem> - - <listitem><para><emphasis>flags</emphasis> - consists of two - parts, binary arguments and identification of - sub-operations. The binary arguments are:</para> - <itemizedlist> - <listitem><para><emphasis>CCB_TRANS_DISC_ENB</emphasis> - enable disconnection</para></listitem> - <listitem><para><emphasis>CCB_TRANS_TAG_ENB</emphasis> - - enable tagged queuing</para></listitem> - </itemizedlist> - </listitem> - - <listitem><para>the sub-operations are:</para> - <itemizedlist> - <listitem><para><emphasis>CCB_TRANS_CURRENT_SETTINGS</emphasis> - - change the current negotiations</para></listitem> - - <listitem><para><emphasis>CCB_TRANS_USER_SETTINGS</emphasis> - - remember the desired user values sync_period, sync_offset - - self-explanatory, if sync_offset==0 then the asynchronous mode - is requested bus_width - bus width, in bits (not - bytes)</para></listitem> - </itemizedlist> - </listitem> - - </itemizedlist> - - <para>Two sets of negotiated parameters are supported, the user - settings and the current settings. The user settings are not - really used much in the SIM drivers, this is mostly just a piece - of memory where the upper levels can store (and later recall) - its ideas about the parameters. Setting the user parameters - does not cause re-negotiation of the transfer rates. But when - the SCSI controller does a negotiation it must never set the - values higher than the user parameters, so it is essentially the - top boundary.</para> - - <para>The current settings are, as the name says, - current. Changing them means that the parameters must be - re-negotiated on the next transfer. Again, these <quote>new current - settings</quote> are not supposed to be forced on the device, just they - are used as the initial step of negotiations. Also they must be - limited by actual capabilities of the SCSI controller: for - example, if the SCSI controller has 8-bit bus and the request - asks to set 16-bit wide transfers this parameter must be - silently truncated to 8-bit transfers before sending it to the - device.</para> - - <para>One caveat is that the bus width and synchronous parameters - are per target while the disconnection and tag enabling - parameters are per lun.</para> - - <para>The recommended implementation is to keep 3 sets of - negotiated (bus width and synchronous transfer) - parameters:</para> - - <itemizedlist> - <listitem><para><emphasis>user</emphasis> - the user set, as - above</para></listitem> - - <listitem><para><emphasis>current</emphasis> - those actually - in effect</para></listitem> - - <listitem><para><emphasis>goal</emphasis> - those requested by - setting of the <quote>current</quote> parameters</para></listitem> - </itemizedlist> - - <para>The code looks like:</para> - -<programlisting> struct ccb_trans_settings *cts; - int targ, lun; - int flags; - - cts = &ccb->cts; - targ = ccb_h->target_id; - lun = ccb_h->target_lun; - flags = cts->flags; - if(flags & CCB_TRANS_USER_SETTINGS) { - if(flags & CCB_TRANS_SYNC_RATE_VALID) - softc->user_sync_period[targ] = cts->sync_period; - if(flags & CCB_TRANS_SYNC_OFFSET_VALID) - softc->user_sync_offset[targ] = cts->sync_offset; - if(flags & CCB_TRANS_BUS_WIDTH_VALID) - softc->user_bus_width[targ] = cts->bus_width; - - if(flags & CCB_TRANS_DISC_VALID) { - softc->user_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB; - softc->user_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB; - } - if(flags & CCB_TRANS_TQ_VALID) { - softc->user_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB; - softc->user_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB; - } - } - if(flags & CCB_TRANS_CURRENT_SETTINGS) { - if(flags & CCB_TRANS_SYNC_RATE_VALID) - softc->goal_sync_period[targ] = - max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD); - if(flags & CCB_TRANS_SYNC_OFFSET_VALID) - softc->goal_sync_offset[targ] = - min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET); - if(flags & CCB_TRANS_BUS_WIDTH_VALID) - softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH); - - if(flags & CCB_TRANS_DISC_VALID) { - softc->current_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB; - softc->current_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB; - } - if(flags & CCB_TRANS_TQ_VALID) { - softc->current_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB; - softc->current_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB; - } - } - ccb->ccb_h.status = CAM_REQ_CMP; - xpt_done(ccb); - return;</programlisting> - - <para>Then when the next I/O request will be processed it will - check if it has to re-negotiate, for example by calling the - function target_negotiated(hcb). It can be implemented like - this:</para> - -<programlisting> int - target_negotiated(struct xxx_hcb *hcb) - { - struct softc *softc = hcb->softc; - int targ = hcb->targ; - - if( softc->current_sync_period[targ] != softc->goal_sync_period[targ] - || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ] - || softc->current_bus_width[targ] != softc->goal_bus_width[targ] ) - return 0; /* FALSE */ - else - return 1; /* TRUE */ - }</programlisting> - - <para>After the values are re-negotiated the resulting values must - be assigned to both current and goal parameters, so for future - I/O transactions the current and goal parameters would be the - same and <function>target_negotiated()</function> would return - TRUE. When the card is initialized (in - <function>xxx_attach()</function>) the current negotiation - values must be initialized to narrow asynchronous mode, the goal - and current values must be initialized to the maximal values - supported by controller.</para></listitem> - - <listitem><para><emphasis>XPT_GET_TRAN_SETTINGS</emphasis> - get values of - SCSI transfer settings</para> - - <para>This operations is the reverse of - XPT_SET_TRAN_SETTINGS. Fill up the CCB instance <quote>struct - ccb_trans_setting cts</quote> with data as requested by the flags - CCB_TRANS_CURRENT_SETTINGS or CCB_TRANS_USER_SETTINGS (if both - are set then the existing drivers return the current - settings). Set all the bits in the valid field.</para></listitem> - - <listitem><para><emphasis>XPT_CALC_GEOMETRY</emphasis> - calculate logical - (BIOS) geometry of the disk</para> - - <para>The arguments are transferred in the instance <quote>struct - ccb_calc_geometry ccg</quote> of the union ccb:</para> - - <itemizedlist> - - <listitem><para><emphasis>block_size</emphasis> - input, block - (A.K.A sector) size in bytes</para></listitem> - - <listitem><para><emphasis>volume_size</emphasis> - input, - volume size in bytes</para></listitem> - - <listitem><para><emphasis>cylinders</emphasis> - output, - logical cylinders</para></listitem> - - <listitem><para><emphasis>heads</emphasis> - output, logical - heads</para></listitem> - - <listitem><para><emphasis>secs_per_track</emphasis> - output, - logical sectors per track</para></listitem> - - </itemizedlist> - - <para>If the returned geometry differs much enough from what the - SCSI controller BIOS thinks and a disk on this SCSI controller - is used as bootable the system may not be able to boot. The - typical calculation example taken from the aic7xxx driver - is:</para> - -<programlisting> struct ccb_calc_geometry *ccg; - u_int32_t size_mb; - u_int32_t secs_per_cylinder; - int extended; - - ccg = &ccb->ccg; - size_mb = ccg->volume_size - / ((1024L * 1024L) / ccg->block_size); - extended = check_cards_EEPROM_for_extended_geometry(softc); - - if (size_mb > 1024 && extended) { - ccg->heads = 255; - ccg->secs_per_track = 63; - } else { - ccg->heads = 64; - ccg->secs_per_track = 32; - } - secs_per_cylinder = ccg->heads * ccg->secs_per_track; - ccg->cylinders = ccg->volume_size / secs_per_cylinder; - ccb->ccb_h.status = CAM_REQ_CMP; - xpt_done(ccb); - return;</programlisting> - - <para>This gives the general idea, the exact calculation depends - on the quirks of the particular BIOS. If BIOS provides no way - set the <quote>extended translation</quote> flag in EEPROM this flag should - normally be assumed equal to 1. Other popular geometries - are:</para> - -<programlisting> 128 heads, 63 sectors - Symbios controllers - 16 heads, 63 sectors - old controllers</programlisting> - - <para>Some system BIOSes and SCSI BIOSes fight with each other - with variable success, for example a combination of Symbios - 875/895 SCSI and Phoenix BIOS can give geometry 128/63 after - power up and 255/63 after a hard reset or soft reboot.</para> - </listitem> - - <listitem><para><emphasis>XPT_PATH_INQ</emphasis> - path inquiry, in other - words get the SIM driver and SCSI controller (also known as HBA - - Host Bus Adapter) properties</para> - - <para>The properties are returned in the instance <quote>struct -ccb_pathinq cpi</quote> of the union ccb:</para> - - <itemizedlist> - - <listitem><para>version_num - the SIM driver version number, now - all drivers use 1</para></listitem> - - <listitem><para>hba_inquiry - bitmask of features supported by - the controller:</para></listitem> - - <listitem><para>PI_MDP_ABLE - supports MDP message (something - from SCSI3?)</para></listitem> - - <listitem><para>PI_WIDE_32 - supports 32 bit wide - SCSI</para></listitem> - - <listitem><para>PI_WIDE_16 - supports 16 bit wide - SCSI</para></listitem> - - <listitem><para>PI_SDTR_ABLE - can negotiate synchronous - transfer rate</para></listitem> - - <listitem><para>PI_LINKED_CDB - supports linked - commands</para></listitem> - - <listitem><para>PI_TAG_ABLE - supports tagged - commands</para></listitem> - - <listitem><para>PI_SOFT_RST - supports soft reset alternative - (hard reset and soft reset are mutually exclusive within a - SCSI bus)</para></listitem> - - <listitem><para>target_sprt - flags for target mode support, 0 - if unsupported</para></listitem> - - <listitem><para>hba_misc - miscellaneous controller - features:</para></listitem> - - <listitem><para>PIM_SCANHILO - bus scans from high ID to low - ID</para></listitem> - - <listitem><para>PIM_NOREMOVE - removable devices not included in - scan</para></listitem> - - <listitem><para>PIM_NOINITIATOR - initiator role not - supported</para></listitem> - - <listitem><para>PIM_NOBUSRESET - user has disabled initial BUS - RESET</para></listitem> - - <listitem><para>hba_eng_cnt - mysterious HBA engine count, - something related to compression, now is always set to - 0</para></listitem> - - <listitem><para>vuhba_flags - vendor-unique flags, unused - now</para></listitem> - - <listitem><para>max_target - maximal supported target ID (7 for - 8-bit bus, 15 for 16-bit bus, 127 for Fibre - Channel)</para></listitem> - - <listitem><para>max_lun - maximal supported LUN ID (7 for older - SCSI controllers, 63 for newer ones)</para></listitem> - - <listitem><para>async_flags - bitmask of installed Async - handler, unused now</para></listitem> - - <listitem><para>hpath_id - highest Path ID in the subsystem, - unused now</para></listitem> - - <listitem><para>unit_number - the controller unit number, - cam_sim_unit(sim)</para></listitem> - - <listitem><para>bus_id - the bus number, - cam_sim_bus(sim)</para></listitem> - - <listitem><para>initiator_id - the SCSI ID of the controller - itself</para></listitem> - - <listitem><para>base_transfer_speed - nominal transfer speed in - KB/s for asynchronous narrow transfers, equals to 3300 for - SCSI</para></listitem> - - <listitem><para>sim_vid - SIM driver's vendor id, a - zero-terminated string of maximal length SIM_IDLEN including - the terminating zero</para></listitem> - - <listitem><para>hba_vid - SCSI controller's vendor id, a - zero-terminated string of maximal length HBA_IDLEN including - the terminating zero</para></listitem> - - <listitem><para>dev_name - device driver name, a zero-terminated - string of maximal length DEV_IDLEN including the terminating - zero, equal to cam_sim_name(sim)</para></listitem> - - </itemizedlist> - - <para>The recommended way of setting the string fields is using - strncpy, like:</para> - -<programlisting> strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);</programlisting> - - <para>After setting the values set the status to CAM_REQ_CMP and mark the -CCB as done.</para> - </listitem> - </itemizedlist> - - </sect1> - - <sect1> - <title>Polling</title> - - <funcSynopsis><funcPrototype> - <funcDef>static void - <function>xxx_poll</function> - </funcDef> - <paramdef> - <parameter>struct cam_sim *sim</parameter> - </paramdef> - </funcPrototype></funcSynopsis> - - <para>The poll function is used to simulate the interrupts when - the interrupt subsystem is not functioning (for example, when - the system has crashed and is creating the system dump). The CAM - subsystem sets the proper interrupt level before calling the - poll routine. So all it needs to do is to call the interrupt - routine (or the other way around, the poll routine may be doing - the real action and the interrupt routine would just call the - poll routine). Why bother about a separate function then? - Because of different calling conventions. The - <function>xxx_poll</function> routine gets the struct cam_sim - pointer as its argument when the PCI interrupt routine by common - convention gets pointer to the struct - <structName>xxx_softc</structName> and the ISA interrupt routine - gets just the device unit number. So the poll routine would - normally look as:</para> - -<programlisting>static void -xxx_poll(struct cam_sim *sim) -{ - xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */ -}</programlisting> - - <para>or</para> - -<programlisting>static void -xxx_poll(struct cam_sim *sim) -{ - xxx_intr(cam_sim_unit(sim)); /* for ISA device */ -}</programlisting> - - </sect1> - - <sect1> - <title>Asynchronous Events</title> - - <para>If an asynchronous event callback has been set up then the - callback function should be defined.</para> - -<programlisting>static void -ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)</programlisting> - - <itemizedlist> - <listitem><para>callback_arg - the value supplied when registering the - callback</para></listitem> - - <listitem><para>code - identifies the type of event</para></listitem> - - <listitem><para>path - identifies the devices to which the event - applies</para></listitem> - - <listitem><para>arg - event-specific argument</para></listitem> - </itemizedlist> - - <para>Implementation for a single type of event, AC_LOST_DEVICE, - looks like:</para> - -<programlisting> struct xxx_softc *softc; - struct cam_sim *sim; - int targ; - struct ccb_trans_settings neg; - - sim = (struct cam_sim *)callback_arg; - softc = (struct xxx_softc *)cam_sim_softc(sim); - switch (code) { - case AC_LOST_DEVICE: - targ = xpt_path_target_id(path); - if(targ <= OUR_MAX_SUPPORTED_TARGET) { - clean_negotiations(softc, targ); - /* send indication to CAM */ - neg.bus_width = 8; - neg.sync_period = neg.sync_offset = 0; - neg.valid = (CCB_TRANS_BUS_WIDTH_VALID - | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID); - xpt_async(AC_TRANSFER_NEG, path, &neg); - } - break; - default: - break; - }</programlisting> - - </sect1> - - <sect1> - <title>Interrupts</title> - - <para>The exact type of the interrupt routine depends on the type - of the peripheral bus (PCI, ISA and so on) to which the SCSI - controller is connected.</para> - - <para>The interrupt routines of the SIM drivers run at the - interrupt level splcam. So <function>splcam()</function> should - be used in the driver to synchronize activity between the - interrupt routine and the rest of the driver (for a - multiprocessor-aware driver things get yet more interesting but - we ignore this case here). The pseudo-code in this document - happily ignores the problems of synchronization. The real code - must not ignore them. A simple-minded approach is to set - <function>splcam()</function> on the entry to the other routines - and reset it on return thus protecting them by one big critical - section. To make sure that the interrupt level will be always - restored a wrapper function can be defined, like:</para> - -<programlisting> static void - xxx_action(struct cam_sim *sim, union ccb *ccb) - { - int s; - s = splcam(); - xxx_action1(sim, ccb); - splx(s); - } - - static void - xxx_action1(struct cam_sim *sim, union ccb *ccb) - { - ... process the request ... - }</programlisting> - - <para>This approach is simple and robust but the problem with it - is that interrupts may get blocked for a relatively long time - and this would negatively affect the system's performance. On - the other hand the functions of the <function>spl()</function> - family have rather high overhead, so vast amount of tiny - critical sections may not be good either.</para> - - <para>The conditions handled by the interrupt routine and the - details depend very much on the hardware. We consider the set of - <quote>typical</quote> conditions.</para> - - <para>First, we check if a SCSI reset was encountered on the bus - (probably caused by another SCSI controller on the same SCSI - bus). If so we drop all the enqueued and disconnected requests, - report the events and re-initialize our SCSI controller. It is - important that during this initialization the controller will not - issue another reset or else two controllers on the same SCSI bus - could ping-pong resets forever. The case of fatal controller - error/hang could be handled in the same place, but it will - probably need also sending RESET signal to the SCSI bus to reset - the status of the connections with the SCSI devices.</para> - -<programlisting> int fatal=0; - struct ccb_trans_settings neg; - struct cam_path *path; - - if( detected_scsi_reset(softc) - || (fatal = detected_fatal_controller_error(softc)) ) { - int targ, lun; - struct xxx_hcb *h, *hh; - - /* drop all enqueued CCBs */ - for(h = softc->first_queued_hcb; h != NULL; h = hh) { - hh = h->next; - free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET); - } - - /* the clean values of negotiations to report */ - neg.bus_width = 8; - neg.sync_period = neg.sync_offset = 0; - neg.valid = (CCB_TRANS_BUS_WIDTH_VALID - | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID); - - /* drop all disconnected CCBs and clean negotiations */ - for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) { - clean_negotiations(softc, targ); - - /* report the event if possible */ - if(xpt_create_path(&path, /*periph*/NULL, - cam_sim_path(sim), targ, - CAM_LUN_WILDCARD) == CAM_REQ_CMP) { - xpt_async(AC_TRANSFER_NEG, path, &neg); - xpt_free_path(path); - } - - for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++) - for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) { - hh=h->next; - if(fatal) - free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR); - else - free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET); - } - } - - /* report the event */ - xpt_async(AC_BUS_RESET, softc->wpath, NULL); - - /* re-initialization may take a lot of time, in such case - * its completion should be signaled by another interrupt or - * checked on timeout - but for simplicity we assume here that - * it's really fast - */ - if(!fatal) { - reinitialize_controller_without_scsi_reset(softc); - } else { - reinitialize_controller_with_scsi_reset(softc); - } - schedule_next_hcb(softc); - return; - }</programlisting> - - <para>If interrupt is not caused by a controller-wide condition - then probably something has happened to the current hardware - control block. Depending on the hardware there may be other - non-HCB-related events, we just do not consider them here. Then - we analyze what happened to this HCB:</para> - -<programlisting> struct xxx_hcb *hcb, *h, *hh; - int hcb_status, scsi_status; - int ccb_status; - int targ; - int lun_to_freeze; - - hcb = get_current_hcb(softc); - if(hcb == NULL) { - /* either stray interrupt or something went very wrong - * or this is something hardware-dependent - */ - handle as necessary; - return; - } - - targ = hcb->target; - hcb_status = get_status_of_current_hcb(softc);</programlisting> - - <para>First we check if the HCB has completed and if so we check - the returned SCSI status.</para> - -<programlisting> if(hcb_status == COMPLETED) { - scsi_status = get_completion_status(hcb);</programlisting> - - <para>Then look if this status is related to the REQUEST SENSE - command and if so handle it in a simple way.</para> - -<programlisting> if(hcb->flags & DOING_AUTOSENSE) { - if(scsi_status == GOOD) { /* autosense was successful */ - hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID; - free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR); - } else { - autosense_failed: - free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL); - } - schedule_next_hcb(softc); - return; - }</programlisting> - - <para>Else the command itself has completed, pay more attention to - details. If auto-sense is not disabled for this CCB and the - command has failed with sense data then run REQUEST SENSE - command to receive that data.</para> - -<programlisting> hcb->ccb->csio.scsi_status = scsi_status; - calculate_residue(hcb); - - if( (hcb->ccb->ccb_h.flags & CAM_DIS_AUTOSENSE)==0 - && ( scsi_status == CHECK_CONDITION - || scsi_status == COMMAND_TERMINATED) ) { - /* start auto-SENSE */ - hcb->flags |= DOING_AUTOSENSE; - setup_autosense_command_in_hcb(hcb); - restart_current_hcb(softc); - return; - } - if(scsi_status == GOOD) - free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP); - else - free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR); - schedule_next_hcb(softc); - return; - }</programlisting> - - <para>One typical thing would be negotiation events: negotiation - messages received from a SCSI target (in answer to our - negotiation attempt or by target's initiative) or the target is - unable to negotiate (rejects our negotiation messages or does - not answer them).</para> - -<programlisting> switch(hcb_status) { - case TARGET_REJECTED_WIDE_NEG: - /* revert to 8-bit bus */ - softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8; - /* report the event */ - neg.bus_width = 8; - neg.valid = CCB_TRANS_BUS_WIDTH_VALID; - xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg); - continue_current_hcb(softc); - return; - case TARGET_ANSWERED_WIDE_NEG: - { - int wd; - - wd = get_target_bus_width_request(softc); - if(wd <= softc->goal_bus_width[targ]) { - /* answer is acceptable */ - softc->current_bus_width[targ] = - softc->goal_bus_width[targ] = neg.bus_width = wd; - - /* report the event */ - neg.valid = CCB_TRANS_BUS_WIDTH_VALID; - xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg); - } else { - prepare_reject_message(hcb); - } - } - continue_current_hcb(softc); - return; - case TARGET_REQUESTED_WIDE_NEG: - { - int wd; - - wd = get_target_bus_width_request(softc); - wd = min (wd, OUR_BUS_WIDTH); - wd = min (wd, softc->user_bus_width[targ]); - - if(wd != softc->current_bus_width[targ]) { - /* the bus width has changed */ - softc->current_bus_width[targ] = - softc->goal_bus_width[targ] = neg.bus_width = wd; - - /* report the event */ - neg.valid = CCB_TRANS_BUS_WIDTH_VALID; - xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg); - } - prepare_width_nego_rsponse(hcb, wd); - } - continue_current_hcb(softc); - return; - }</programlisting> - - <para>Then we handle any errors that could have happened during - auto-sense in the same simple-minded way as before. Otherwise we - look closer at the details again.</para> - -<programlisting> if(hcb->flags & DOING_AUTOSENSE) - goto autosense_failed; - - switch(hcb_status) {</programlisting> - - <para>The next event we consider is unexpected disconnect. Which - is considered normal after an ABORT or BUS DEVICE RESET message - and abnormal in other cases.</para> - -<programlisting> case UNEXPECTED_DISCONNECT: - if(requested_abort(hcb)) { - /* abort affects all commands on that target+LUN, so - * mark all disconnected HCBs on that target+LUN as aborted too - */ - for(h = softc->first_discon_hcb[hcb->target][hcb->lun]; - h != NULL; h = hh) { - hh=h->next; - free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED); - } - ccb_status = CAM_REQ_ABORTED; - } else if(requested_bus_device_reset(hcb)) { - int lun; - - /* reset affects all commands on that target, so - * mark all disconnected HCBs on that target+LUN as reset - */ - - for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++) - for(h = softc->first_discon_hcb[hcb->target][lun]; - h != NULL; h = hh) { - hh=h->next; - free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET); - } - - /* send event */ - xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL); - - /* this was the CAM_RESET_DEV request itself, it's completed */ - ccb_status = CAM_REQ_CMP; - } else { - calculate_residue(hcb); - ccb_status = CAM_UNEXP_BUSFREE; - /* request the further code to freeze the queue */ - hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN; - lun_to_freeze = hcb->lun; - } - break;</programlisting> - - <para>If the target refuses to accept tags we notify CAM about - that and return back all commands for this LUN:</para> - -<programlisting> case TAGS_REJECTED: - /* report the event */ - neg.flags = 0 & ~CCB_TRANS_TAG_ENB; - neg.valid = CCB_TRANS_TQ_VALID; - xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg); - - ccb_status = CAM_MSG_REJECT_REC; - /* request the further code to freeze the queue */ - hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN; - lun_to_freeze = hcb->lun; - break;</programlisting> - - <para>Then we check a number of other conditions, with processing - basically limited to setting the CCB status:</para> - -<programlisting> case SELECTION_TIMEOUT: - ccb_status = CAM_SEL_TIMEOUT; - /* request the further code to freeze the queue */ - hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN; - lun_to_freeze = CAM_LUN_WILDCARD; - break; - case PARITY_ERROR: - ccb_status = CAM_UNCOR_PARITY; - break; - case DATA_OVERRUN: - case ODD_WIDE_TRANSFER: - ccb_status = CAM_DATA_RUN_ERR; - break; - default: - /* all other errors are handled in a generic way */ - ccb_status = CAM_REQ_CMP_ERR; - /* request the further code to freeze the queue */ - hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN; - lun_to_freeze = CAM_LUN_WILDCARD; - break; - }</programlisting> - - <para>Then we check if the error was serious enough to freeze the - input queue until it gets proceeded and do so if it is:</para> - -<programlisting> if(hcb->ccb->ccb_h.status & CAM_DEV_QFRZN) { - /* freeze the queue */ - xpt_freeze_devq(ccb->ccb_h.path, /*count*/1); - - /* re-queue all commands for this target/LUN back to CAM */ - - for(h = softc->first_queued_hcb; h != NULL; h = hh) { - hh = h->next; - - if(targ == h->targ - && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun) ) - free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ); - } - } - free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status); - schedule_next_hcb(softc); - return;</programlisting> - - <para>This concludes the generic interrupt handling although - specific controllers may require some additions.</para> - - </sect1> - - <sect1> - <title>Errors Summary</title> - - <para>When executing an I/O request many things may go wrong. The - reason of error can be reported in the CCB status with great - detail. Examples of use are spread throughout this document. For - completeness here is the summary of recommended responses for - the typical error conditions:</para> - - <itemizedlist> - - <listitem><para><emphasis>CAM_RESRC_UNAVAIL</emphasis> - some - resource is temporarily unavailable and the SIM driver cannot - generate an event when it will become available. An example of - this resource would be some intra-controller hardware resource - for which the controller does not generate an interrupt when - it becomes available.</para></listitem> - - <listitem><para><emphasis>CAM_UNCOR_PARITY</emphasis> - - unrecovered parity error occurred</para></listitem> - - <listitem><para><emphasis>CAM_DATA_RUN_ERR</emphasis> - data - overrun or unexpected data phase (going in other direction - than specified in CAM_DIR_MASK) or odd transfer length for - wide transfer</para></listitem> - - <listitem><para><emphasis>CAM_SEL_TIMEOUT</emphasis> - selection - timeout occurred (target does not respond)</para></listitem> - - <listitem><para><emphasis>CAM_CMD_TIMEOUT</emphasis> - command - timeout occurred (the timeout function ran)</para></listitem> - - <listitem><para><emphasis>CAM_SCSI_STATUS_ERROR</emphasis> - the - device returned error</para></listitem> - - <listitem><para><emphasis>CAM_AUTOSENSE_FAIL</emphasis> - the - device returned error and the REQUEST SENSE COMMAND - failed</para></listitem> - - <listitem><para><emphasis>CAM_MSG_REJECT_REC</emphasis> - MESSAGE - REJECT message was received</para></listitem> - - <listitem><para><emphasis>CAM_SCSI_BUS_RESET</emphasis> - received - SCSI bus reset</para></listitem> - - <listitem><para><emphasis>CAM_REQ_CMP_ERR</emphasis> - - <quote>impossible</quote> SCSI phase occurred or something else as weird or - just a generic error if further detail is not - available</para></listitem> - - <listitem><para><emphasis>CAM_UNEXP_BUSFREE</emphasis> - - unexpected disconnect occurred</para></listitem> - - <listitem><para><emphasis>CAM_BDR_SENT</emphasis> - BUS DEVICE - RESET message was sent to the target</para></listitem> - - <listitem><para><emphasis>CAM_UNREC_HBA_ERROR</emphasis> - - unrecoverable Host Bus Adapter Error</para></listitem> - - <listitem><para><emphasis>CAM_REQ_TOO_BIG</emphasis> - the request - was too large for this controller</para></listitem> - - <listitem><para><emphasis>CAM_REQUEUE_REQ</emphasis> - this - request should be re-queued to preserve transaction ordering. - This typically occurs when the SIM recognizes an error that - should freeze the queue and must place other queued requests - for the target at the sim level back into the XPT - queue. Typical cases of such errors are selection timeouts, - command timeouts and other like conditions. In such cases the - troublesome command returns the status indicating the error, - the and the other commands which have not be sent to the bus - yet get re-queued.</para></listitem> - - <listitem><para><emphasis>CAM_LUN_INVALID</emphasis> - the LUN - ID in the request is not supported by the SCSI - controller</para></listitem> - - <listitem><para><emphasis>CAM_TID_INVALID</emphasis> - the - target ID in the request is not supported by the SCSI - controller</para></listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>Timeout Handling</title> - - <para>When the timeout for an HCB expires that request should be - aborted, just like with an XPT_ABORT request. The only - difference is that the returned status of aborted request should - be CAM_CMD_TIMEOUT instead of CAM_REQ_ABORTED (that is why - implementation of the abort better be done as a function). But - there is one more possible problem: what if the abort request - itself will get stuck? In this case the SCSI bus should be - reset, just like with an XPT_RESET_BUS request (and the idea - about implementing it as a function called from both places - applies here too). Also we should reset the whole SCSI bus if a - device reset request got stuck. So after all the timeout - function would look like:</para> - -<programlisting>static void -xxx_timeout(void *arg) -{ - struct xxx_hcb *hcb = (struct xxx_hcb *)arg; - struct xxx_softc *softc; - struct ccb_hdr *ccb_h; - - softc = hcb->softc; - ccb_h = &hcb->ccb->ccb_h; - - if(hcb->flags & HCB_BEING_ABORTED - || ccb_h->func_code == XPT_RESET_DEV) { - xxx_reset_bus(softc); - } else { - xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT); - } -}</programlisting> - - <para>When we abort a request all the other disconnected requests - to the same target/LUN get aborted too. So there appears a - question, should we return them with status CAM_REQ_ABORTED or - CAM_CMD_TIMEOUT? The current drivers use CAM_CMD_TIMEOUT. This - seems logical because if one request got timed out then probably - something really bad is happening to the device, so if they - would not be disturbed they would time out by themselves.</para> - - </sect1> - -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/sound/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/sound/chapter.sgml deleted file mode 100644 index 38f39f1e78..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/sound/chapter.sgml +++ /dev/null @@ -1,687 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="oss"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Jean-Francois</firstname> - <surname>Dockes</surname> - <contrib>Contributed by </contrib> - </author> - </authorgroup> - <!-- 23 November 2001 --> - </chapterinfo> - - <title>Sound subsystem</title> - - <sect1> - <title>Introduction</title> - - <para>The FreeBSD sound subsystem cleanly separates generic sound - handling issues from device-specific ones. This makes it easier - to add support for new hardware.</para> - - <para>The &man.pcm.4; framework is the central piece of the sound - subsystem. It mainly implements the following elements:</para> - - <itemizedlist> - <listitem> - <para>A system call interface (read, write, ioctls) to - digitized sound and mixer functions. The ioctl command set - is compatible with the legacy <emphasis>OSS</emphasis> or - <emphasis>Voxware</emphasis> interface, allowing common - multimedia applications to be ported without - modification.</para> - <listitem> - <para>Common code for processing sound data (format - conversions, virtual channels).</para> - </listitem> - <listitem> - <para>A uniform software interface to hardware-specific audio - interface modules.</para> - </listitem> - <listitem> - <para>Additional support for some common hardware interfaces - (ac97), or shared hardware-specific code (ex: ISA DMA - routines).</para> - </listitem> - </itemizedlist> - - <para>The support for specific sound cards is implemented by - hardware-specific drivers, which provide channel and mixer interfaces - to plug into the generic <devicename>pcm</devicename> code.</para> - - <para>In this chapter, the term <devicename>pcm</devicename> will - refer to the central, common part of the sound driver, as - opposed to the hardware-specific modules.</para> - - <para>The prospective driver writer will of course want to start - from an existing module and use the code as the ultimate - reference. But, while the sound code is nice and clean, it is - also mostly devoid of comments. This document tries to give an - overview of the framework interface and answer some questions - that may arise while adapting the existing code.</para> - - <para>As an alternative, or in addition to starting from a working - example, you can find a commented driver template at - <ulink url="http://people.freebsd.org/~cg/template.c"> - http://people.freebsd.org/~cg/template.c</ulink></para> - - </sect1> - - <sect1> - <title>Files</title> - - <para>All the relevant code currently (FreeBSD 4.4) lives in - <filename>/usr/src/sys/dev/sound/</filename>, except for the - public ioctl interface definitions, found in - <filename>/usr/src/sys/sys/soundcard.h</filename></para> - - <para>Under <filename>/usr/src/sys/dev/sound/</filename>, the - <filename>pcm/</filename> directory holds the central code, - while the <filename>isa/</filename> and - <filename>pci/</filename> directories have the drivers for ISA - and PCI boards.</para> - - </sect1> - - <sect1 id="pcm-probe-and-attach"> - <title>Probing, attaching, etc.</title> - - <para>Sound drivers probe and attach in almost the same way as any - hardware driver module. You might want to look at the <link - linkend="isa-driver"> ISA</link> or <link - linkend="pci">PCI</link> specific sections of the handbook for - more information.</para> - - <para>However, sound drivers differ in some ways:</para> - - <itemizedlist> - - <listitem> - <para>They declare themselves as <devicename>pcm</devicename> - class devices, with a <structname>struct - snddev_info</structname> device private structure:</para> - - <programlisting> static driver_t xxx_driver = { - "pcm", - xxx_methods, - sizeof(struct snddev_info) - }; - - DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0); - MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);</programlisting> - - <para>Most sound drivers need to store additional private - information about their device. A private data structure is - usually allocated in the attach routine. Its address is - passed to <devicename>pcm</devicename> by the calls to - <function>pcm_register()</function> and - <function>mixer_init()</function>. - <devicename>pcm</devicename> later passes back this address - as a parameter in calls to the sound driver - interfaces.</para> - </listitem> - - <listitem> - <para>The sound driver attach routine should declare its MIXER - or AC97 interface to <devicename>pcm</devicename> by calling - <function>mixer_init()</function>. For a MIXER interface, - this causes in turn a call to <link linkend="xxxmixer-init"> - <function>xxxmixer_init()</function></link>.</para> - </listitem> - - <listitem> - <para>The sound driver attach routine declares its general - CHANNEL configuration to <devicename>pcm</devicename> by - calling <function>pcm_register(dev, sc, nplay, - nrec)</function>, where <varname>sc</varname> is the address - for the device data structure, used in further calls from - <devicename>pcm</devicename>, and <varname>nplay</varname> - and <varname>nrec</varname> are the number of play and - record channels.</para> - </listitem> - - <listitem> - <para>The sound driver attach routine declares each of its - channel objects by calls to - <function>pcm_addchan()</function>. This sets up the - channel glue in <devicename>pcm</devicename> and causes in - turn a call to - <link linkend="xxxchannel-init"> - <function>xxxchannel_init()</function></link>.</para> - </listitem> - - <listitem> - <para>The sound driver detach routine should call - <function>pcm_unregister()</function> before releasing its - resources.</para> - </listitem> - </itemizedlist> - - <para>There are two possible methods to handle non-PnP devices:</para> - <itemizedlist> - <listitem> - <para>Use a <function>device_identify()</function> method - (example: <filename>sound/isa/es1888.c</filename>). The - <function>device_identify()</function> method probes for the - hardware at known addresses and, if it finds a supported - device, creates a new pcm device which is then passed to - probe/attach.</para> - </listitem> - <listitem> - <para>Use a custom kernel configuration with appropriate hints - for pcm devices (example: - <filename>sound/isa/mss.c</filename>).</para> - </listitem> - </itemizedlist> - - <para><devicename>pcm</devicename> drivers should implement - <function>device_suspend</function>, - <function>device_resume</function> and - <function>device_shutdown</function> routines, so that power - management and module unloading function correctly.</para> - - </sect1> - - <sect1> - <title>Interfaces</title> - - <para>The interface between the <devicename>pcm</devicename> core - and the sound drivers is defined in terms of <link - linkend="kernel-objects">kernel objects</link>.</para> - - <para>There are two main interfaces that a sound driver will - usually provide: <emphasis>CHANNEL</emphasis> and either - <emphasis>MIXER</emphasis> or <emphasis>AC97</emphasis>.</para> - - <para>The <emphasis>AC97</emphasis> interface is a very small - hardware access (register read/write) interface, implemented by - drivers for hardware with an AC97 codec. In this case, the - actual MIXER interface is provided by the shared AC97 code in - <devicename>pcm</devicename>.</para> - - <sect2> - <title>The CHANNEL interface</title> - - <sect3> - <title>Common notes for function parameters</title> - - <para>Sound drivers usually have a private data structure to - describe their device, and one structure for each play and - record data channel that it supports.</para> - - <para>For all CHANNEL interface functions, the first parameter - is an opaque pointer.</para> - - <para>The second parameter is a pointer to the private - channel data structure, except for - <function>channel_init()</function> which has a pointer to the - private device structure (and returns the channel pointer - for further use by <devicename>pcm</devicename>).</para> - - </sect3> - - <sect3> - <title>Overview of data transfer operations</title> - - <para>For sound data transfers, the - <devicename>pcm</devicename> core and the sound drivers - communicate through a shared memory area, described by a - <structname>struct snd_dbuf</structname>.</para> - - <para><structname>struct snd_dbuf</structname> is private to - <devicename>pcm</devicename>, and sound drivers obtain - values of interest by calls to accessor functions - (<function>sndbuf_getxxx()</function>).</para> - - <para>The shared memory area has a size of - <function>sndbuf_getsize()</function> and is divided into - fixed size blocks of <function>sndbuf_getblksz()</function> - bytes.</para> - - <para>When playing, the general transfer mechanism is as - follows (reverse the idea for recording):</para> - - <itemizedlist> - <listitem> - <para><devicename>pcm</devicename> initially fills up the - buffer, then calls the sound driver's <link - linkend="channel-trigger"> - <function>xxxchannel_trigger()</function></link> - function with a parameter of PCMTRIG_START.</para> - </listitem> - - <listitem> - <para>The sound driver then arranges to repeatedly - transfer the whole memory area - (<function>sndbuf_getbuf()</function>, - <function>sndbuf_getsize()</function>) to the device, in - blocks of <function>sndbuf_getblksz()</function> bytes. - It calls back the <function>chn_intr()</function> - <devicename>pcm</devicename> function for each - transferred block (this will typically happen at - interrupt time).</para> - </listitem> - - <listitem> - <para><function>chn_intr()</function> arranges to copy new - data to the area that was transferred to the device (now - free), and make appropriate updates to the - <structname>snd_dbuf</structname> structure.</para> - </listitem> - - </itemizedlist> - - <sect3 id="xxxchannel-init"> - <title>channel_init</title> - - <para><function>xxxchannel_init()</function> is called to - initialize each of the play or record channels. The calls - are initiated from the sound driver attach routine. (See - the <link linkend="pcm-probe-and-attach">probe and attach - section</link>).</para> - - <programlisting> static void * - xxxchannel_init(kobj_t obj, void *data, - struct snd_dbuf *b, struct pcm_channel *c, int dir)<co id="co-chinit-params"> - { - struct xxx_info *sc = data; - struct xxx_chinfo *ch; - ... - return ch;<co id="co-chinit-return"> - }</programlisting> - - <calloutlist> - - <callout arearefs="co-chinit-params"> - <para><varname>b</varname> is the address for the channel - <structname>struct snd_dbuf</structname>. It should be - initialized in the function by calling - <function>sndbuf_alloc()</function>. The buffer size to - use is normally a small multiple of the 'typical' unit - transfer size for your device.</para> - - <para><varname>c</varname> is the - <devicename>pcm</devicename> channel control structure - pointer. This is an opaque object. The function should - store it in the local channel structure, to be used in - later calls to <devicename>pcm</devicename> (ie: - <function>chn_intr(c)</function>).</para> - - <para><varname>dir</varname> indicates the channel - direction (<literal>PCMDIR_PLAY</literal> or - <literal>PCMDIR_REC</literal>).</para> - </callout> - - <callout arearefs="co-chinit-return"> - <para>The function should return a pointer to the private - area used to control this channel. This will be passed - as a parameter to other channel interface calls.</para> - </callout> - - </calloutlist> - - </sect3> - - <sect3> - <title>channel_setformat</title> - - <para><function>xxxchannel_setformat()</function> should set - up the hardware for the specified channel for the specified - sound format.</para> - - <programlisting> static int - xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format)<co id="co-chsetformat-params"> - { - struct xxx_chinfo *ch = data; - ... - return 0; - }</programlisting> - - <calloutlist> - <callout arearefs="co-chsetformat-params"> - <para><varname>format</varname> is specified as an - <literal>AFMT_XXX value</literal> - (<filename>soundcard.h</filename>).</para> - </callout> - - </calloutlist> - </sect3> - - <sect3> - <title>channel_setspeed</title> - - <para><function>xxxchannel_setspeed()</function> sets up the - channel hardware for the specified sampling speed, and - returns the possibly adjusted speed.</para> - - <programlisting> static int - xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed) - { - struct xxx_chinfo *ch = data; - ... - return speed; - }</programlisting> - - </sect3> - - <sect3> - <title>channel_setblocksize</title> - - <para><function>xxxchannel_setblocksize()</function> sets the - block size, which is the size of unit transactions between - <devicename>pcm</devicename> and the sound driver, and - between the sound driver and the device. Typically, this - would be the number of bytes transferred before an interrupt - occurs. During a transfer, the sound driver should call - <devicename>pcm</devicename>'s - <function>chn_intr()</function> every time this size has - been transferred.</para> - - <para>Most sound drivers only take note of the block size - here, to be used when an actual transfer will be - started.</para> - - <programlisting> static int - xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) - { - struct xxx_chinfo *ch = data; - ... - return blocksize;<co id="co-chsetblocksize-return"> - }</programlisting> - - <calloutlist> - <callout arearefs="co-chsetblocksize-return"> - <para>The function returns the possibly adjusted block - size. In case the block size is indeed changed, - <function>sndbuf_resize()</function> should be called to - adjust the buffer.</para> - - </callout> - </calloutlist> - - </sect3> - - <sect3 id="channel-trigger"> - <title>channel_trigger</title> - - <para><function>xxxchannel_trigger()</function> is called by - <devicename>pcm</devicename> to control data transfer - operations in the driver.</para> - - <programlisting> static int - xxxchannel_trigger(kobj_t obj, void *data, int go)<co id="co-chtrigger-params"> - { - struct xxx_chinfo *ch = data; - ... - return 0; - }</programlisting> - - <calloutlist> - <callout arearefs="co-chtrigger-params"> - <para><varname>go</varname> defines the action for the - current call. The possible values are:</para> - <itemizedlist> - - <listitem> - <para><literal>PCMTRIG_START</literal>: the driver - should start a data transfer from or to the channel - buffer. If needed, the buffer base and size can be - retrieved through - <function>sndbuf_getbuf()</function> and - <function>sndbuf_getsize()</function>.</para> - </listitem> - - <listitem> - <para><literal>PCMTRIG_EMLDMAWR</literal> / - <literal>PCMTRIG_EMLDMARD</literal>: this tells the - driver that the input or output buffer may have been - updated. Most drivers just ignore these - calls.</para> - </listitem> - - <listitem> - <para><literal>PCMTRIG_STOP</literal> / - <literal>PCMTRIG_ABORT</literal>: the driver should - stop the current transfer.</para> - </listitem> - </itemizedlist> - - </callout> - </calloutlist> - - <note><para>If the driver uses ISA DMA, - <function>sndbuf_isadma()</function> should be called before - performing actions on the device, and will take care of the - DMA chip side of things.</para> - </note> - - </sect3> - - <sect3> - <title>channel_getptr</title> - - <para><function>xxxchannel_getptr()</function> returns the - current offset in the transfer buffer. This will typically - be called by <function>chn_intr()</function>, and this is how - <devicename>pcm</devicename> knows where it can transfer - new data.</para> - - </sect3> - - <sect3> - <title>channel_free</title> - - <para><function>xxxchannel_free()</function> is called to free - up channel resources, for example when the driver is - unloaded, and should be implemented if the channel data - structures are dynamically allocated or if - <function>sndbuf_alloc()</function> was not used for buffer - allocation.</para> - - </sect3> - - <sect3> - <title>channel_getcaps</title> - - <programlisting> struct pcmchan_caps * - xxxchannel_getcaps(kobj_t obj, void *data) - { - return &xxx_caps;<co id="co-chgetcaps-return"> - }</programlisting> - - <calloutlist> - - <callout arearefs="co-chgetcaps-return"> - <para>The routine returns a pointer to a (usually - statically-defined) <structname>pcmchan_caps</structname> - structure (defined in - <filename>sound/pcm/channel.h</filename>. The structure holds - the minimum and maximum sampling frequencies, and the - accepted sound formats. Look at any sound driver for an - example.</para> - </callout> - - </calloutlist> - - </sect3> - - <sect3> - <title>More functions</title> - - <para><function>channel_reset()</function>, - <function>channel_resetdone()</function>, and - <function>channel_notify()</function> are for special purposes - and should not be implemented in a driver without discussing - it with the authorities (&a.cg;).</para> - - <para><function>channel_setdir()</function> is deprecated.</para> - </sect3> - - </sect2> - - <sect2> - <title>The MIXER interface</title> - - <sect3 id="xxxmixer-init"> - <title>mixer_init</title> - - <para><function>xxxmixer_init()</function> initializes the - hardware and tells <devicename>pcm</devicename> what mixer - devices are available for playing and recording</para> - - <programlisting> static int - xxxmixer_init(struct snd_mixer *m) - { - struct xxx_info *sc = mix_getdevinfo(m); - u_int32_t v; - - [Initialize hardware] - - [Set appropriate bits in v for play mixers]<co id="co-mxini-sd"> - mix_setdevs(m, v); - [Set appropriate bits in v for record mixers] - mix_setrecdevs(m, v) - - return 0; - }</programlisting> - - <calloutlist> - <callout arearefs="co-mxini-sd"> - <para>Set bits in an integer value and call - <function>mix_setdevs()</function> and - <function>mix_setrecdevs()</function> to tell - <devicename>pcm</devicename> what devices exist.</para> - </callout> - </calloutlist> - - <para>Mixer bits definitions can be found in - <filename>soundcard.h</filename> - (<literal>SOUND_MASK_XXX</literal> values and - <literal>SOUND_MIXER_XXX</literal> bit shifts).</para> - - </sect3> - - <sect3> - <title>mixer_set</title> - - <para><function>xxxmixer_set()</function> sets the volume - level for one mixer device.</para> - - <programlisting> static int - xxxmixer_set(struct snd_mixer *m, unsigned dev, - unsigned left, unsigned right)<co id="co-mxset-params"> - { - struct sc_info *sc = mix_getdevinfo(m); - [set volume level] - return left | (right << 8);<co id="co-mxset-return"> - }</programlisting> - - <calloutlist> - <callout arearefs="co-mxset-params"> - <para>The device is specified as a SOUND_MIXER_XXX - value</para> <para>The volume values are specified in - range [0-100]. A value of zero should mute the - device.</para> - </callout> - - <callout arearefs="co-mxset-return"> - <para>As the hardware levels probably won't match the - input scale, and some rounding will occur, the routine - returns the actual level values (in range 0-100) as - shown.</para> - </callout> - </calloutlist> - - </sect3> - - <sect3> - <title>mixer_setrecsrc</title> - - <para><function>xxxmixer_setrecsrc()</function> sets the - recording source device.</para> - - <programlisting> static int - xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src)<co id="co-mxsr-params"> - { - struct xxx_info *sc = mix_getdevinfo(m); - - [look for non zero bit(s) in src, set up hardware] - - [update src to reflect actual action] - return src;<co id="co-mxsr-return"> - }</programlisting> - - <calloutlist> - <callout arearefs="co-mxsr-params"> - <para>The desired recording devices are specified as a - bit field</para> - </callout> - - <callout arearefs="co-mxsr-return"> - <para>The actual devices set for recording are returned. - Some drivers can only set one device for recording. The - function should return -1 if an error occurs.</para> - </callout> - </calloutlist> - </sect3> - - <sect3> - <title>mixer_uninit, mixer_reinit</title> - - <para><function>xxxmixer_uninit()</function> should ensure - that all sound is muted and if possible mixer hardware - should be powered down </para> - - <para><function>xxxmixer_reinit()</function> should ensure - that the mixer hardware is powered up and any settings not - controlled by <function>mixer_set()</function> or - <function>mixer_setrecsrc()</function> are restored.</para> - - </sect3> - </sect2> - - <sect2> - <title>The AC97 interface</title> - - <para>The <emphasis>AC97</emphasis> interface is implemented - by drivers with an AC97 codec. It only has three methods:</para> - - <itemizedlist> - - <listitem><para><function>xxxac97_init()</function> returns - the number of ac97 codecs found.</para> - </listitem> - - <listitem><para><function>ac97_read()</function> and - <function>ac97_write()</function> read or write a specified - register.</para> - </listitem> - - </itemizedlist> - - <para>The <emphasis>AC97</emphasis> interface is used by the - AC97 code in <devicename>pcm</devicename> to perform higher - level operations. Look at - <filename>sound/pci/maestro3.c</filename> or many others under - <filename>sound/pci/</filename> for an example.</para> - - </sect2> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml deleted file mode 100644 index 1b8a0b4cdb..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml +++ /dev/null @@ -1,161 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="sysinit"> - <title>The Sysinit Framework</title> - - <para>Sysinit is the framework for a generic call sort and dispatch - mechanism. FreeBSD currently uses it for the dynamic - initialization of the kernel. Sysinit allows FreeBSD's kernel - subsystems to be reordered, and added, removed, and replaced at - kernel link time when the kernel or one of its modules is loaded - without having to edit a statically ordered initialization routing - and recompile the kernel. This system also allows kernel modules, - currently called <firstterm>KLD's</firstterm>, to be separately - compiled, linked, and initialized at boot time and loaded even - later while the system is already running. This is accomplished - using the <quote>kernel linker</quote> and <quote>linker - sets</quote>.</para> - - <sect1> - <title>Terminology</title> - - <variablelist> - <varlistentry> - <term>Linker Set</term> - <listitem> - <para>A linker technique in which the linker gathers - statically declared data throughout a program's source files - into a single contiguously addressable unit of - data.</para> - </listitem> - </varlistentry> - </variablelist> - </sect1> - - <sect1> - <title>Sysinit Operation</title> - - <para>Sysinit relies on the ability of the linker to take static - data declared at multiple locations throughout a program's - source and group it together as a single contiguous chunk of - data. This linker technique is called a <quote>linker - set</quote>. Sysinit uses two linker sets to maintain two data - sets containing each consumer's call order, function, and a - pointer to the data to pass to that function.</para> - - <para>Sysinit uses two priorities when ordering the functions for - execution. The first priority is a subsystem ID giving an - overall order Sysinit's dispatch of functions. Current predeclared - ID's are in <filename><sys/kernel.h></filename> in the enum - list <literal>sysinit_sub_id</literal>. The second priority used - is an element order within the subsystem. Current predeclared - subsystem element orders are in - <filename><sys/kernel.h></filename> in the enum list - <literal>sysinit_elem_order</literal>.</para> - - <para>There are currently two uses for Sysinit. Function dispatch - at system startup and kernel module loads, and function dispatch - at system shutdown and kernel module unload.</para> - </sect1> - - - <sect1> - <title>Using Sysinit</title> - - <sect2> - <title>Interface</title> - - <sect3> - <title>Headers</title> - - <programlisting><sys/kernel.h></programlisting> - </sect3> - - <sect3> - <title>Macros</title> - - <programlisting>SYSINIT(uniquifier, subsystem, order, func, ident) - SYSUNINIT(uniquifier, subsystem, order, func, ident)</programlisting> - </sect3> - </sect2> - - <sect2> - <title>Startup</title> - - <para>The <literal>SYSINIT()</literal> macro creates the - necessary sysinit data in Sysinit's startup data set for - Sysinit to sort and dispatch a function at system startup and - module load. <literal>SYSINIT()</literal> takes a uniquifier - that Sysinit uses identify the particular function dispatch - data, the subsystem order, the subsystem element order, the - function to call, and the data to pass the function. All - functions must take a constant pointer argument. - </para> - - <para>For example:</para> - - <programlisting>#include <sys/kernel.h> - -void foo_null(void *unused) -{ - foo_doo(); -} -SYSINIT(foo_null, SI_SUB_FOO, SI_ORDER_FOO, NULL); - -struct foo foo_voodoo = { - FOO_VOODOO; -} - -void foo_arg(void *vdata) -{ - struct foo *foo = (struct foo *)vdata; - foo_data(foo); -} -SYSINIT(foo_arg, SI_SUB_FOO, SI_ORDER_FOO, foo_voodoo); - </programlisting> - </sect2> - - <sect2> - <title>Shutdown</title> - - <para>The <literal>SYSUNINIT()</literal> macro behaves similarly - to the <literal>SYSINIT()</literal> macro except that it adds - the Sysinit data to Sysinit's shutdown data set.</para> - - <para>For example:</para> - - <programlisting>#include <sys/kernel.h> - -void foo_cleanup(void *unused) -{ - foo_kill(); -} -SYSUNINIT(foo_cleanup, SI_SUB_FOO, SI_ORDER_FOO, NULL); - -struct foo_stack foo_stack = { - FOO_STACK_VOODOO; -} - -void foo_flush(void *vdata) -{ -} -SYSUNINIT(foo_flush, SI_SUB_FOO, SI_ORDER_FOO, foo_stack); - </programlisting> - </sect2> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml deleted file mode 100644 index 3a483a1cf7..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml +++ /dev/null @@ -1,623 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="usb"> - <title>USB Devices</title> - - <para><emphasis>This chapter was written by &a.nhibma;. Modifications made for - the handbook by &a.murray;.</emphasis></para> - - <sect1> - <title>Introduction</title> - - <para>The Universal Serial Bus (USB) is a new way of attaching - devices to personal computers. The bus architecture features - two-way communication and has been developed as a response to - devices becoming smarter and requiring more interaction with the - host. USB support is included in all current PC chipsets and is - therefore available in all recently built PCs. Apple's - introduction of the USB-only iMac has been a major incentive for - hardware manufacturers to produce USB versions of their devices. - The future PC specifications specify that all legacy connectors - on PCs should be replaced by one or more USB connectors, - providing generic plug and play capabilities. Support for USB - hardware was available at a very early stage in NetBSD and was - developed by Lennart Augustsson for the NetBSD project. The - code has been ported to FreeBSD and we are currently maintaining - a shared code base. For the implementation of the USB subsystem - a number of features of USB are important.</para> - - <para><emphasis>Lennart Augustsson has done most of the implementation of - the USB support for the NetBSD project. Many thanks for this - incredible amount of work. Many thanks also to Ardy and Dirk for - their comments and proofreading of this paper.</emphasis></para> - - <itemizedlist> - - <listitem><para>Devices connect to ports on the computer - directly or on devices called hubs, forming a treelike device - structure.</para></listitem> - - <listitem><para>The devices can be connected and disconnected at - run time.</para></listitem> - - <listitem><para>Devices can suspend themselves and trigger - resumes of the host system</para></listitem> - - <listitem><para>As the devices can be powered from the bus, the - host software has to keep track of power budgets for each - hub.</para></listitem> - - <listitem><para>Different quality of service requirements by the - different device types together with the maximum of 126 - devices that can be connected to the same bus, require proper - scheduling of transfers on the shared bus to take full - advantage of the 12Mbps bandwidth available. (over 400Mbps - with USB 2.0)</para></listitem> - - <listitem><para>Devices are intelligent and contain easily - accessible information about themselves</para></listitem> - - </itemizedlist> - - <para>The development of drivers for the USB subsystem and devices - connected to it is supported by the specifications that have - been developed and will be developed. These specifications are - publicly available from the USB home pages. Apple has been very - strong in pushing for standards based drivers, by making drivers - for the generic classes available in their operating system - MacOS and discouraging the use of separate drivers for each new - device. This chapter tries to collate essential information for a - basic understanding of the present implementation of the USB - stack in FreeBSD/NetBSD. It is recommended however to read it - together with the relevant specifications mentioned in the - references below.</para> - - <sect2> - <title>Structure of the USB Stack</title> - - <para>The USB support in FreeBSD can be split into three - layers. The lowest layer contains the host controller driver, - providing a generic interface to the hardware and its scheduling - facilities. It supports initialisation of the hardware, - scheduling of transfers and handling of completed and/or failed - transfers. Each host controller driver implements a virtual hub - providing hardware independent access to the registers - controlling the root ports on the back of the machine.</para> - - <para>The middle layer handles the device connection and - disconnection, basic initialisation of the device, driver - selection, the communication channels (pipes) and does - resource management. This services layer also controls the - default pipes and the device requests transferred over - them.</para> - - <para>The top layer contains the individual drivers supporting - specific (classes of) devices. These drivers implement the - protocol that is used over the pipes other than the default - pipe. They also implement additional functionality to make the - device available to other parts of the kernel or userland. They - use the USB driver interface (USBDI) exposed by the services - layer.</para> - </sect2> - </sect1> - - <sect1 id="usb-hc"> - <title>Host Controllers</title> - - <para>The host controller (HC) controls the transmission of - packets on the bus. Frames of 1 millisecond are used. At the - start of each frame the host controller generates a Start of - Frame (SOF) packet.</para> - - <para>The SOF packet is used to synchronise to the start of the - frame and to keep track of the frame number. Within each frame - packets are transferred, either from host to device (out) or - from device to host (in). Transfers are always initiated by the - host (polled transfers). Therefore there can only be one host - per USB bus. Each transfer of a packet has a status stage in - which the recipient of the data can return either ACK - (acknowledge reception), NAK (retry), STALL (error condition) or - nothing (garbled data stage, device not available or - disconnected). Section 8.5 of the <ulink - url="http://www.usb.org/developers/docs.html">USB - specification</ulink> explains the details of packets in more - detail. Four different types of transfers can occur on a USB - bus: control, bulk, interrupt and isochronous. The types of - transfers and their characteristics are described below (`Pipes' - subsection).</para> - - <para>Large transfers between the device on the USB bus and the - device driver are split up into multiple packets by the host - controller or the HC driver.</para> - - <para>Device requests (control transfers) to the default endpoints - are special. They consist of two or three phases: SETUP, DATA - (optional) and STATUS. The set-up packet is sent to the - device. If there is a data phase, the direction of the data - packet(s) is given in the set-up packet. The direction in the - status phase is the opposite of the direction during the data - phase, or IN if there was no data phase. The host controller - hardware also provides registers with the current status of the - root ports and the changes that have occurred since the last - reset of the status change register. Access to these registers - is provided through a virtualised hub as suggested in the USB - specification [ 2]. The virtual hub must comply with the hub - device class given in chapter 11 of that specification. It must - provide a default pipe through which device requests can be sent - to it. It returns the standard andhub class specific set of - descriptors. It should also provide an interrupt pipe that - reports changes happening at its ports. There are currently two - specifications for host controllers available: <ulink - url="http://developer.intel.com/design/USB/UHCI11D.htm">Universal - Host Controller Interface</ulink> (UHCI; Intel) and <ulink - url="http://www.compaq.com/productinfo/development/openhci.html">Open - Host Controller Interface</ulink> (OHCI; Compaq, Microsoft, - National Semiconductor). The UHCI specification has been - designed to reduce hardware complexity by requiring the host - controller driver to supply a complete schedule of the transfers - for each frame. OHCI type controllers are much more independent - by providing a more abstract interface doing alot of work - themselves. </para> - - <sect2> - <title>UHCI</title> - - <para>The UHCI host controller maintains a framelist with 1024 - pointers to per frame data structures. It understands two - different data types: transfer descriptors (TD) and queue - heads (QH). Each TD represents a packet to be communicated to - or from a device endpoint. QHs are a means to groupTDs (and - QHs) together.</para> - - <para>Each transfer consists of one or more packets. The UHCI - driver splits large transfers into multiple packets. For every - transfer, apart from isochronous transfers, a QH is - allocated. For every type of transfer these QHs are collected - at a QH for that type. Isochronous transfers have to be - executed first because of the fixed latency requirement and - are directly referred to by the pointer in the framelist. The - last isochronous TD refers to the QH for interrupt transfers - for that frame. All QHs for interrupt transfers point at the - QH for control transfers, which in turn points at the QH for - bulk transfers. The following diagram gives a graphical - overview of this:</para> - - <para>This results in the following schedule being run in each - frame. After fetching the pointer for the current frame from - the framelist the controller first executes the TDs for all - the isochronous packets in that frame. The last of these TDs - refers to the QH for the interrupt transfers for - thatframe. The host controller will then descend from that QH - to the QHs for the individual interrupt transfers. After - finishing that queue, the QH for the interrupt transfers will - refer the controller to the QH for all control transfers. It - will execute all the subqueues scheduled there, followed by - all the transfers queued at the bulk QH. To facilitate the - handling of finished or failed transfers different types of - interrupts are generated by the hardware at the end of each - frame. In the last TD for a transfer the Interrupt-On - Completion bit is set by the HC driver to flag an interrupt - when the transfer has completed. An error interrupt is flagged - if a TD reaches its maximum error count. If the short packet - detect bit is set in a TD and less than the set packet length - is transferred this interrupt is flagged to notify - the controller driver of the completed transfer. It is the host - controller driver's task to find out which transfer has - completed or produced an error. When called the interrupt - service routine will locate all the finished transfers and - call their callbacks.</para> - - <para>See for a more elaborate description the <ulink - url="http://developer.intel.com/design/USB/UHCI11D.htm">UHCI - specification.</ulink></para> - - </sect2> - - <sect2> - <title>OHCI</title> - - <para>Programming an OHCI host controller is much simpler. The - controller assumes that a set of endpoints is available, and - is aware of scheduling priorities and the ordering of the - types of transfers in a frame. The main data structure used by - the host controller is the endpoint descriptor (ED) to which - aqueue of transfer descriptors (TDs) is attached. The ED - contains the maximum packet size allowed for an endpoint and - the controller hardware does the splitting into packets. The - pointers to the data buffers are updated after each transfer - and when the start and end pointer are equal, the TD is - retired to the done-queue. The four types of endpoints have - their own queues. Control and bulk endpoints are queued each at - their own queue. Interrupt EDs are queued in a tree, with the - level in the tree defining the frequency at which they - run.</para> - - <para>framelist interruptisochronous control bulk</para> - - <para>The schedule being run by the host controller in each - frame looks as follows. The controller will first run the - non-periodic control and bulk queues, up to a time limit set - by the HC driver. Then the interrupt transfers for that frame - number are run, by using the lower five bits of the frame - number as an index into level 0 of the tree of interrupts - EDs. At the end of this tree the isochronous EDs are connected - and these are traversed subsequently. The isochronous TDs - contain the frame number of the first frame the transfer - should be run in. After all the periodic transfers have been - run, the control and bulk queues are traversed - again. Periodically the interrupt service routine is called to - process the done queue and call the callbacks for each - transfer and reschedule interrupt and isochronous - endpoints.</para> - - <para>See for a more elaborate description the <ulink - url="http://www.compaq.com/productinfo/development/openhci.html"> - OHCI specification</ulink>. Services layer The middle layer - provides access to the device in a controlled way and - maintains resources in use by the different drivers and the - services layer. The layer takes care of the following - aspects:</para> - - <itemizedlist> - <listitem><para>The device configuration - information</para></listitem> - <listitem><para>The pipes to communicate with a - device</para></listitem> - <listitem><para>Probing and attaching and detaching form a - device.</para></listitem> - </itemizedlist> - - </sect2> - </sect1> - - <sect1 id="usb-dev"> - <title>USB Device Information</title> - - <sect2> - <title>Device configuration information</title> - - <para>Each device provides different levels of configuration - information. Each device has one or more configurations, of - which one is selected during probe/attach. A configuration - provides power and bandwidth requirements. Within each - configuration there can be multiple interfaces. A device - interface is a collection of endpoints. For example USB - speakers can have an interface for the audio data (Audio - Class) and an interface for the knobs, dials and buttons (HID - Class). All interfaces in a configuration are active at the - same time and can be attached to by different drivers. Each - interface can have alternates, providing different quality of - service parameters. In for example cameras this is used to - provide different frame sizes and numbers of frames per - second.</para> - - <para>Within each interface 0 or more endpoints can be - specified. Endpoints are the unidirectional access points for - communicating with a device. They provide buffers to - temporarily store incoming or outgoing data from the - device. Each endpoint has a unique address within - a configuration, the endpoint's number plus its direction. The - default endpoint, endpoint 0, is not part of any interface and - available in all configurations. It is managed by the services - layer and not directly available to device drivers.</para> - - <para>Level 0 Level 1 Level 2 Slot 0</para> - <para>Slot 3 Slot 2 Slot 1</para> - <para>(Only 4 out of 32 slots shown)</para> - - <para>This hierarchical configuration information is described - in the device by a standard set of descriptors (see section 9.6 - of the USB specification [ 2]). They can be requested through - the Get Descriptor Request. The services layer caches these - descriptors to avoid unnecessary transfers on the USB - bus. Access to the descriptors is provided through function - calls.</para> - - <itemizedlist> - <listitem><para>Device descriptors: General information about - the device, like Vendor, Product and Revision Id, supported - device class, subclass and protocol if applicable, maximum - packet size for the default endpoint, etc.</para></listitem> - - <listitem><para>Configuration descriptors: The number of - interfaces in this configuration, suspend and resume - functionality supported and power - requirements.</para></listitem> - - <listitem><para>Interface descriptors: interface class, - subclass and protocol if applicable, number of alternate - settings for the interface and the number of - endpoints.</para></listitem> - - <listitem><para>Endpoint descriptors: Endpoint address, - direction and type, maximum packet size supported and - polling frequency if type is interrupt endpoint. There is no - descriptor for the default endpoint (endpoint 0) and it is - never counted in an interface descriptor.</para></listitem> - - <listitem><para>String descriptors: In the other descriptors - string indices are supplied for some fields.These can be - used to retrieve descriptive strings, possibly in multiple - languages.</para></listitem> - - </itemizedlist> - - <para>Class specifications can add their own descriptor types - that are available through the GetDescriptor Request.</para> - - <para>Pipes Communication to end points on a device flows - through so-called pipes. Drivers submit transfers to endpoints - to a pipe and provide a callback to be called on completion or - failure of the transfer (asynchronous transfers) or wait for - completion (synchronous transfer). Transfers to an endpoint - are serialised in the pipe. A transfer can either complete, - fail or time-out (if a time-out has been set). There are two - types of time-outs for transfers. Time-outs can happen due to - time-out on the USBbus (milliseconds). These time-outs are - seen as failures and can be due to disconnection of the - device. A second form of time-out is implemented in software - and is triggered when a transfer does not complete within a - specified amount of time (seconds). These are caused by a - device acknowledging negatively (NAK) the transferred - packets. The cause for this is the device not being ready to - receive data, buffer under- or overrun or protocol - errors.</para> - - <para>If a transfer over a pipe is larger than the maximum - packet size specified in the associated endpoint descriptor, - the host controller (OHCI) or the HC driver (UHCI) will split - the transfer into packets of maximum packet size, with the - last packet possibly smaller than the maximum - packet size.</para> - - <para>Sometimes it is not a problem for a device to return less - data than requested. For example abulk-in-transfer to a modem - might request 200 bytes of data, but the modem has only 5 - bytes available at that time. The driver can set the short - packet (SPD) flag. It allows the host controller to accept a - packet even if the amount of data transferred is less than - requested. This flag is only valid for in-transfers, as the - amount of data to be sent to a device is always known - beforehand. If an unrecoverable error occurs in a device - during a transfer the pipe is stalled. Before any more data is - accepted or sent the driver needs to resolve the cause of the - stall and clear the endpoint stall condition through send the - clear endpoint halt device request over the default - pipe. The default endpoint should never stall.</para> - - <para>There are four different types of endpoints and - corresponding pipes: - Control pipe / default pipe: There is - one control pipe per device, connected to the default endpoint - (endpoint 0). The pipe carries the device requests and - associated data. The difference between transfers over the - default pipe and other pipes is that the protocol for - the transfers is described in the USB specification [ 2]. These - requests are used to reset and configure the device. A basic - set of commands that must be supported by each device is - provided in chapter 9 of the USB specification [ 2]. The - commands supported on this pipe can be extended by a device - class specification to support additional - functionality.</para> - - <itemizedlist> - <listitem><para>Bulk pipe: This is the USB equivalent to a raw - transmission medium.</para></listitem> - <listitem><para>Interrupt pipe: The host sends a request for - data to the device and if the device has nothing to send, it - will NAK the data packet. Interrupt transfers are scheduled - at a frequency specified when creating the - pipe.</para></listitem> - - <listitem><para>Isochronous pipe: These pipes are intended for - isochronous data, for example video or audio streams, with - fixed latency, but no guaranteed delivery. Some support for - pipes of this type is available in the current - implementation. Packets in control, bulk and interrupt - transfers are retried if an error occurs during transmission - or the device acknowledges the packet negatively (NAK) due to - for example lack of buffer space to store the incoming - data. Isochronous packets are however not retried in case of - failed delivery or NAK of a packet as this might violate the - timing constraints.</para></listitem> - </itemizedlist> - - <para>The availability of the necessary bandwidth is calculated - during the creation of the pipe. Transfers are scheduled within - frames of 1 millisecond. The bandwidth allocation within a - frame is prescribed by the USB specification, section 5.6 [ - 2]. Isochronous and interrupt transfers are allowed to consume - up to 90% of the bandwidth within a frame. Packets for control - and bulk transfers are scheduled after all isochronous and - interrupt packets and will consume all the remaining - bandwidth.</para> - - <para>More information on scheduling of transfers and bandwidth - reclamation can be found in chapter 5of the USB specification - [ 2], section 1.3 of the UHCI specification [ 3] and section - 3.4.2 of the OHCI specification [4].</para> - - </sect2> - </sect1> - - <sect1 id="usb-devprobe"> - <title>Device probe and attach</title> - - <para>After the notification by the hub that a new device has been - connected, the service layer switches on the port, providing the - device with 100 mA of current. At this point the device is in - its default state and listening to device address 0. The - services layer will proceed to retrieve the various descriptors - through the default pipe. After that it will send a Set Address - request to move the device away from the default device address - (address 0). Multiple device drivers might be able to support - the device. For example a modem driver might be able to support - an ISDN TA through the AT compatibility interface. A driver for - that specific model of the ISDN adapter might however be able to - provide much better support for this device. To support this - flexibility, the probes return priorities indicating their level - of support. Support for a specific revision of a product ranks - the highest and the generic driver the lowest priority. It might - also be that multiple drivers could attach to one device if - there are multiple interfaces within one configuration. Each - driver only needs to support a subset of the interfaces.</para> - - <para>The probing for a driver for a newly attached device checks - first for device specific drivers. If not found, the probe code - iterates over all supported configurations until a driver - attaches in a configuration. To support devices with multiple - drivers on different interfaces, the probe iterates over all - interfaces in a configuration that have not yet been claimed by - a driver. Configurations that exceed the power budget for the - hub are ignored. During attach the driver should initialise the - device to its proper state, but not reset it, as this will make - the device disconnect itself from the bus and restart the - probing process for it. To avoid consuming unnecessary bandwidth - should not claim the interrupt pipe at attach time, but - should postpone allocating the pipe until the file is opened and - the data is actually used. When the file is closed the pipe - should be closed again, even though the device might still be - attached.</para> - - <sect2> - <title>Device disconnect and detach</title> - - <para>A device driver should expect to receive errors during any - transaction with the device. The design of USB supports and - encourages the disconnection of devices at any point in - time. Drivers should make sure that they do the right thing - when the device disappears.</para> - - <para>Furthermore a device that has been disconnected and - reconnected will not be reattached at the same device - instance. This might change in the future when more devices - support serial numbers (see the device descriptor) or other - means of defining an identity for a device have been - developed.</para> - - <para>The disconnection of a device is signaled by a hub in the - interrupt packet delivered to the hub driver. The status - change information indicates which port has seen a connection - change. The device detach method for all device drivers for - the device connected on that port are called and the structures - cleaned up. If the port status indicates that in the mean time - a device has been connected to that port, the procedure for - probing and attaching the device will be started. A device - reset will produce a disconnect-connect sequence on the hub - and will be handled as described above.</para> - - </sect2> - </sect1> - - <sect1 id="usb-protocol"> - <title>USB Drivers Protocol Information</title> - - <para>The protocol used over pipes other than the default pipe is - undefined by the USB specification. Information on this can be - found from various sources. The most accurate source is the - developer's section on the USB home pages [ 1]. From these pages - a growing number of deviceclass specifications are - available. These specifications specify what a compliant device - should look like from a driver perspective, basic functionality - it needs to provide and the protocol that is to be used over the - communication channels. The USB specification [ 2] includes the - description of the Hub Class. A class specification for Human - Interface Devices (HID) has been created to cater for keyboards, - tablets, bar-code readers, buttons, knobs, switches, etc. A - third example is the class specification for mass storage - devices. For a full list of device classes see the developers - section on the USB home pages [ 1].</para> - - <para>For many devices the protocol information has not yet been - published however. Information on the protocol being used might - be available from the company making the device. Some companies - will require you to sign a Non -Disclosure Agreement (NDA) - before giving you the specifications. This in most cases - precludes making the driver open source.</para> - - <para>Another good source of information is the Linux driver - sources, as a number of companies have started to provide drivers - for Linux for their devices. It is always a good idea to contact - the authors of those drivers for their source of - information.</para> - - <para>Example: Human Interface Devices The specification for the - Human Interface Devices like keyboards, mice, tablets, buttons, - dials,etc. is referred to in other device class specifications - and is used in many devices.</para> - - <para>For example audio speakers provide endpoints to the digital - to analogue converters and possibly an extra pipe for a - microphone. They also provide a HID endpoint in a separate - interface for the buttons and dials on the front of the - device. The same is true for the monitor control class. It is - straightforward to build support for these interfaces through - the available kernel and userland libraries together with the - HID class driver or the generic driver. Another device that - serves as an example for interfaces within one configuration - driven by different device drivers is a cheap keyboard with - built-in legacy mouse port. To avoid having the cost of - including the hardware for a USB hub in the device, - manufacturers combined the mouse data received from the PS/2 port - on the back of the keyboard and the key presses from the keyboard - into two separate interfaces in the same configuration. The - mouse and keyboard drivers each attach to the appropriate - interface and allocate the pipes to the two independent - endpoints.</para> - - <para>Example: Firmware download Many devices that have been - developed are based on a general purpose processor with - an additional USB core added to it. Because the development of - drivers and firmware for USB devices is still very new, many - devices require the downloading of the firmware after they - have been connected.</para> - - <para>The procedure followed is straightforward. The device - identifies itself through a vendor and product Id. The first - driver probes and attaches to it and downloads the firmware into - it. After that the device soft resets itself and the driver is - detached. After a short pause the device announces its presence - on the bus. The device will have changed its - vendor/product/revision Id to reflect the fact that it has been - supplied with firmware and as a consequence a second driver will - probe it and attach to it.</para> - - <para>An example of these types of devices is the ActiveWire I/O - board, based on the EZ-USB chip. For this chip a generic firmware - downloader is available. The firmware downloaded into the - ActiveWire board changes the revision Id. It will then perform a - soft reset of the USB part of the EZ-USB chip to disconnect from - the USB bus and again reconnect.</para> - - <para>Example: Mass Storage Devices Support for mass storage - devices is mainly built around existing protocols. The Iomega - USB Zipdrive is based on the SCSI version of their drive. The - SCSI commands and status messages are wrapped in blocks and - transferred over the bulk pipes to and from the device, - emulating a SCSI controller over the USB wire. ATAPI and UFI - commands are supported in a similar fashion.</para> - - <para>The Mass Storage Specification supports 2 different types of - wrapping of the command block.The initial attempt was based on - sending the command and status through the default pipe and - using bulk transfers for the data to be moved between the host - and the device. Based on experience a second approach was - designed that was based on wrapping the command and status - blocks and sending them over the bulk out and in endpoint. The - specification specifies exactly what has to happen when and what - has to be done in case an error condition is encountered. The - biggest challenge when writing drivers for these devices is to - fit USB based protocol into the existing support for mass storage - devices. CAM provides hooks to do this in a fairly straight - forward way. ATAPI is less simple as historically the IDE - interface has never had many different appearances.</para> - - <para>The support for the USB floppy from Y-E Data is again less - straightforward as a new command set has been designed.</para> - - </sect1> - -</chapter> diff --git a/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml deleted file mode 100644 index b48098aa00..0000000000 --- a/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml +++ /dev/null @@ -1,255 +0,0 @@ -<!-- - The FreeBSD Documentation Project - - $FreeBSD$ ---> - -<chapter id="vm"> - <title>Virtual Memory System</title> - - <sect1 id="internals-vm"> - <title>The FreeBSD VM System</title> - - <para><emphasis>Contributed by &a.dillon;. 6 Feb 1999</emphasis></para> - - <sect2> - <title>Management of physical - memory—<literal>vm_page_t</literal></title> - - <para>Physical memory is managed on a page-by-page basis through the - <literal>vm_page_t</literal> structure. Pages of physical memory are - categorized through the placement of their respective - <literal>vm_page_t</literal> structures on one of several paging - queues.</para> - - <para>A page can be in a wired, active, inactive, cache, or free state. - Except for the wired state, the page is typically placed in a doubly - link list queue representing the state that it is in. Wired pages - are not placed on any queue.</para> - - <para>FreeBSD implements a more involved paging queue for cached and - free pages in order to implement page coloring. Each of these states - involves multiple queues arranged according to the size of the - processor's L1 and L2 caches. When a new page needs to be allocated, - FreeBSD attempts to obtain one that is reasonably well aligned from - the point of view of the L1 and L2 caches relative to the VM object - the page is being allocated for.</para> - - <para>Additionally, a page may be held with a reference count or locked - with a busy count. The VM system also implements an <quote>ultimate - locked</quote> state for a page using the PG_BUSY bit in the page's - flags.</para> - - <para>In general terms, each of the paging queues operates in a LRU - fashion. A page is typically placed in a wired or active state - initially. When wired, the page is usually associated with a page - table somewhere. The VM system ages the page by scanning pages in a - more active paging queue (LRU) in order to move them to a less-active - paging queue. Pages that get moved into the cache are still - associated with a VM object but are candidates for immediate reuse. - Pages in the free queue are truly free. FreeBSD attempts to minimize - the number of pages in the free queue, but a certain minimum number of - truly free pages must be maintained in order to accommodate page - allocation at interrupt time.</para> - - <para>If a process attempts to access a page that does not exist in its - page table but does exist in one of the paging queues (such as the - inactive or cache queues), a relatively inexpensive page reactivation - fault occurs which causes the page to be reactivated. If the page - does not exist in system memory at all, the process must block while - the page is brought in from disk.</para> - - <para>FreeBSD dynamically tunes its paging queues and attempts to - maintain reasonable ratios of pages in the various queues as well as - attempts to maintain a reasonable breakdown of clean vs. dirty pages. - The amount of rebalancing that occurs depends on the system's memory - load. This rebalancing is implemented by the pageout daemon and - involves laundering dirty pages (syncing them with their backing - store), noticing when pages are activity referenced (resetting their - position in the LRU queues or moving them between queues), migrating - pages between queues when the queues are out of balance, and so forth. - FreeBSD's VM system is willing to take a reasonable number of - reactivation page faults to determine how active or how idle a page - actually is. This leads to better decisions being made as to when to - launder or swap-out a page.</para> - </sect2> - - <sect2> - <title>The unified buffer - cache—<literal>vm_object_t</literal></title> - - <para>FreeBSD implements the idea of a generic <quote>VM object</quote>. - VM objects can be associated with backing store of various - types—unbacked, swap-backed, physical device-backed, or - file-backed storage. Since the filesystem uses the same VM objects to - manage in-core data relating to files, the result is a unified buffer - cache.</para> - - <para>VM objects can be <emphasis>shadowed</emphasis>. That is, they - can be stacked on top of each other. For example, you might have a - swap-backed VM object stacked on top of a file-backed VM object in - order to implement a MAP_PRIVATE mmap()ing. This stacking is also - used to implement various sharing properties, including - copy-on-write, for forked address spaces.</para> - - <para>It should be noted that a <literal>vm_page_t</literal> can only be - associated with one VM object at a time. The VM object shadowing - implements the perceived sharing of the same page across multiple - instances.</para> - </sect2> - - <sect2> - <title>Filesystem I/O—<literal>struct buf</literal></title> - - <para>vnode-backed VM objects, such as file-backed objects, generally - need to maintain their own clean/dirty info independent from the VM - system's idea of clean/dirty. For example, when the VM system decides - to synchronize a physical page to its backing store, the VM system - needs to mark the page clean before the page is actually written to - its backing store. Additionally, filesystems need to be able to map - portions of a file or file metadata into KVM in order to operate on - it.</para> - - <para>The entities used to manage this are known as filesystem buffers, - <literal>struct buf</literal>'s, or - <literal>bp</literal>'s. When a filesystem needs to operate on a - portion of a VM object, it typically maps part of the object into a - struct buf and the maps the pages in the struct buf into KVM. In the - same manner, disk I/O is typically issued by mapping portions of - objects into buffer structures and then issuing the I/O on the buffer - structures. The underlying vm_page_t's are typically busied for the - duration of the I/O. Filesystem buffers also have their own notion of - being busy, which is useful to filesystem driver code which would - rather operate on filesystem buffers instead of hard VM pages.</para> - - <para>FreeBSD reserves a limited amount of KVM to hold mappings from - struct bufs, but it should be made clear that this KVM is used solely - to hold mappings and does not limit the ability to cache data. - Physical data caching is strictly a function of - <literal>vm_page_t</literal>'s, not filesystem buffers. However, - since filesystem buffers are used to placehold I/O, they do inherently - limit the amount of concurrent I/O possible. However, as there are usually a - few thousand filesystem buffers available, this is not usually a - problem.</para> - </sect2> - - <sect2> - <title>Mapping Page Tables - vm_map_t, vm_entry_t</title> - - <para>FreeBSD separates the physical page table topology from the VM - system. All hard per-process page tables can be reconstructed on the - fly and are usually considered throwaway. Special page tables such as - those managing KVM are typically permanently preallocated. These page - tables are not throwaway.</para> - - <para>FreeBSD associates portions of vm_objects with address ranges in - virtual memory through <literal>vm_map_t</literal> and - <literal>vm_entry_t</literal> structures. Page tables are directly - synthesized from the - <literal>vm_map_t</literal>/<literal>vm_entry_t</literal>/ - <literal>vm_object_t</literal> hierarchy. Recall that I mentioned - that physical pages are only directly associated with a - <literal>vm_object</literal>; that is not quite true. - <literal>vm_page_t</literal>'s are also linked into page tables that - they are actively associated with. One <literal>vm_page_t</literal> - can be linked into several <emphasis>pmaps</emphasis>, as page tables - are called. However, the hierarchical association holds, so all - references to the same page in the same object reference the same - <literal>vm_page_t</literal> and thus give us buffer cache unification - across the board.</para> - </sect2> - - <sect2> - <title>KVM Memory Mapping</title> - - <para>FreeBSD uses KVM to hold various kernel structures. The single - largest entity held in KVM is the filesystem buffer cache. That is, - mappings relating to <literal>struct buf</literal> entities.</para> - - <para>Unlike Linux, FreeBSD does <emphasis>not</emphasis> map all of physical memory into - KVM. This means that FreeBSD can handle memory configurations up to - 4G on 32 bit platforms. In fact, if the mmu were capable of it, - FreeBSD could theoretically handle memory configurations up to 8TB on - a 32 bit platform. However, since most 32 bit platforms are only - capable of mapping 4GB of ram, this is a moot point.</para> - - <para>KVM is managed through several mechanisms. The main mechanism - used to manage KVM is the <emphasis>zone allocator</emphasis>. The - zone allocator takes a chunk of KVM and splits it up into - constant-sized blocks of memory in order to allocate a specific type - of structure. You can use <command>vmstat -m</command> to get an - overview of current KVM utilization broken down by zone.</para> - </sect2> - - <sect2> - <title>Tuning the FreeBSD VM system</title> - - <para>A concerted effort has been made to make the FreeBSD kernel - dynamically tune itself. Typically you do not need to mess with - anything beyond the <option>maxusers</option> and - <option>NMBCLUSTERS</option> kernel config options. That is, kernel - compilation options specified in (typically) - <filename>/usr/src/sys/i386/conf/<replaceable>CONFIG_FILE</replaceable></filename>. - A description of all available kernel configuration options can be - found in <filename>/usr/src/sys/i386/conf/LINT</filename>.</para> - - <para>In a large system configuration you may wish to increase - <option>maxusers</option>. Values typically range from 10 to 128. - Note that raising <option>maxusers</option> too high can cause the - system to overflow available KVM resulting in unpredictable operation. - It is better to leave <option>maxusers</option> at some reasonable number and add other - options, such as <option>NMBCLUSTERS</option>, to increase specific - resources.</para> - - <para>If your system is going to use the network heavily, you may want - to increase <option>NMBCLUSTERS</option>. Typical values range from - 1024 to 4096.</para> - - <para>The <literal>NBUF</literal> parameter is also traditionally used - to scale the system. This parameter determines the amount of KVA the - system can use to map filesystem buffers for I/O. Note that this - parameter has nothing whatsoever to do with the unified buffer cache! - This parameter is dynamically tuned in 3.0-CURRENT and later kernels - and should generally not be adjusted manually. We recommend that you - <emphasis>not</emphasis> try to specify an <literal>NBUF</literal> - parameter. Let the system pick it. Too small a value can result in - extremely inefficient filesystem operation while too large a value can - starve the page queues by causing too many pages to become wired - down.</para> - - <para>By default, FreeBSD kernels are not optimized. You can set - debugging and optimization flags with the - <literal>makeoptions</literal> directive in the kernel configuration. - Note that you should not use <option>-g</option> unless you can - accommodate the large (typically 7 MB+) kernels that result.</para> - - <programlisting>makeoptions DEBUG="-g" -makeoptions COPTFLAGS="-O -pipe"</programlisting> - - <para>Sysctl provides a way to tune kernel parameters at run-time. You - typically do not need to mess with any of the sysctl variables, - especially the VM related ones.</para> - - <para>Run time VM and system tuning is relatively straightforward. - First, use softupdates on your UFS/FFS filesystems whenever possible. - <filename>/usr/src/sys/ufs/ffs/README.softupdates</filename> contains - instructions (and restrictions) on how to configure it.</para> - - <para>Second, configure sufficient swap. You should have a swap - partition configured on each physical disk, up to four, even on your - <quote>work</quote> disks. You should have at least 2x the swap space - as you have main memory, and possibly even more if you do not have a - lot of memory. You should also size your swap partition based on the - maximum memory configuration you ever intend to put on the machine so - you do not have to repartition your disks later on. If you want to be - able to accommodate a crash dump, your first swap partition must be at - least as large as main memory and <filename>/var/crash</filename> must - have sufficient free space to hold the dump.</para> - - <para>NFS-based swap is perfectly acceptable on -4.x or later systems, - but you must be aware that the NFS server will take the brunt of the - paging load.</para> - </sect2> - </sect1> - -</chapter> diff --git a/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil b/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil Binary files differdeleted file mode 100644 index 85820c2878..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil +++ /dev/null diff --git a/en_US.ISO8859-1/books/handbook/basics/example-dir1.dot b/en_US.ISO8859-1/books/handbook/basics/example-dir1.dot deleted file mode 100644 index f259e8377d..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/example-dir1.dot +++ /dev/null @@ -1,7 +0,0 @@ -// $FreeBSD$ - -digraph directory { - root [label="Root\n/"]; - root -> "A1/"; - root -> "A2/"; -} diff --git a/en_US.ISO8859-1/books/handbook/basics/example-dir2.dot b/en_US.ISO8859-1/books/handbook/basics/example-dir2.dot deleted file mode 100644 index b846c82399..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/example-dir2.dot +++ /dev/null @@ -1,8 +0,0 @@ -// $FreeBSD$ - -digraph directory { - root [label="Root\n/"]; - root -> "A1/" -> "B1/"; - "A1/" -> "B2/"; - root -> "A2/"; -} diff --git a/en_US.ISO8859-1/books/handbook/basics/example-dir3.dot b/en_US.ISO8859-1/books/handbook/basics/example-dir3.dot deleted file mode 100644 index 178a3a91bb..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/example-dir3.dot +++ /dev/null @@ -1,8 +0,0 @@ -// $FreeBSD$ - -digraph directory { - root [label="Root\n/"]; - root -> "A1/"; - root -> "A2/" -> "B1/"; - "A2/" -> "B2/"; -} diff --git a/en_US.ISO8859-1/books/handbook/basics/example-dir4.dot b/en_US.ISO8859-1/books/handbook/basics/example-dir4.dot deleted file mode 100644 index 82d12b421a..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/example-dir4.dot +++ /dev/null @@ -1,9 +0,0 @@ -// $FreeBSD$ - -digraph directory { - root [label="Root\n/"]; - root -> "A1/"; - root -> "A2/" -> "B1/" -> "C1/"; - "B1/" -> "C2/"; - "A2/" -> "B2/"; -} diff --git a/en_US.ISO8859-1/books/handbook/basics/example-dir5.dot b/en_US.ISO8859-1/books/handbook/basics/example-dir5.dot deleted file mode 100644 index f5aa6e01dc..0000000000 --- a/en_US.ISO8859-1/books/handbook/basics/example-dir5.dot +++ /dev/null @@ -1,9 +0,0 @@ -// $FreeBSD$ - -digraph directory { - root [label="Root\n/"]; - root -> "A1/" -> "C1/"; - "A1/" -> "C2/"; - root -> "A2/" -> "B1/"; - "A2/" -> "B2/"; -} diff --git a/en_US.ISO8859-1/books/handbook/mirrors/chapter.sgml b/en_US.ISO8859-1/books/handbook/mirrors/chapter.sgml index 316fde2cd8..b5115c4d6c 100644 --- a/en_US.ISO8859-1/books/handbook/mirrors/chapter.sgml +++ b/en_US.ISO8859-1/books/handbook/mirrors/chapter.sgml @@ -222,6 +222,7 @@ <link linkend="mirrors-lt">Lithuania</link>, <link linkend="mirrors-nl">Netherlands</link>, <link linkend="mirrors-nz">New Zealand</link>, + <link linkend="mirrors-no">Norway</link>, <link linkend="mirrors-pl">Poland</link>, <link linkend="mirrors-pt">Portugal</link>, <link linkend="mirrors-ro">Romania</link>, @@ -750,6 +751,27 @@ </varlistentry> <varlistentry> + <term><anchor id="mirrors-no">Norway</term> + + <listitem> + <para>In case of problems, please contact the hostmaster + <email>hostmaster@no.FreeBSD.org</email> for this domain.</para> + + <itemizedlist> + <listitem> + <para><ulink + url="ftp://ftp.no.FreeBSD.org/pub/FreeBSD/">ftp://ftp.no.FreeBSD.org/pub/FreeBSD/</ulink></para> + </listitem> + + <listitem> + <para><ulink + url="ftp://ftp3.no.FreeBSD.org/pub/FreeBSD/">ftp://ftp3.no.FreeBSD.org/pub/FreeBSD/</ulink></para> + </listitem> + </itemizedlist> + </listitem> + </varlistentry> + + <varlistentry> <term><anchor id="mirrors-pl">Poland</term> <listitem> @@ -3856,15 +3878,25 @@ doc/zh_TW.Big5</screen> </varlistentry> <varlistentry> - <term>RELENG_4_6</term> + <term>RELENG_4_7</term> <listitem> - <para>The release branch for FreeBSD-4.6, used only + <para>The release branch for FreeBSD-4.7, used only for security advisories and other seriously critical fixes.</para> </listitem> </varlistentry> <varlistentry> + <term>RELENG_4_6</term> + + <listitem> + <para>The release branch for FreeBSD-4.6 and FreeBSD-4.6.2, + used only for security advisories and other seriously + critical fixes.</para> + </listitem> + </varlistentry> + + <varlistentry> <term>RELENG_4_5</term> <listitem> @@ -3913,6 +3945,14 @@ doc/zh_TW.Big5</screen> <variablelist> <varlistentry> + <term>RELENG_4_7_0_RELEASE</term> + + <listitem> + <para>FreeBSD 4.7</para> + </listitem> + </varlistentry> + + <varlistentry> <term>RELENG_4_6_2_RELEASE</term> <listitem> diff --git a/en_US.ISO8859-1/books/porters-handbook/book.sgml b/en_US.ISO8859-1/books/porters-handbook/book.sgml index 785a5b7493..048ea8755d 100644 --- a/en_US.ISO8859-1/books/porters-handbook/book.sgml +++ b/en_US.ISO8859-1/books/porters-handbook/book.sgml @@ -4625,6 +4625,11 @@ PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> </row> <row> + <entry>4.7-RELEASE</entry> + <entry>470000</entry> + </row> + + <row> <entry>5.0-CURRENT</entry> <entry>500000</entry> </row> @@ -4858,7 +4863,10 @@ PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> <row> <entry>5.0-CURRENT after headers stopped using - _BSD_FOO_T_ and started using _FOO_T_DECLARED.</entry> + _BSD_FOO_T_ and started using _FOO_T_DECLARED. + This value can also be used as a conservative + estimate of the start of &man.bzip2.1; package + support.</entry> <entry>500039</entry> </row> diff --git a/ja_JP.eucJP/books/handbook/multimedia/Makefile b/ja_JP.eucJP/books/handbook/multimedia/Makefile deleted file mode 100644 index 2487a8c522..0000000000 --- a/ja_JP.eucJP/books/handbook/multimedia/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# -# Build the Handbook with just the content from this chapter. -# -# $FreeBSD$ -# -# Original revision: 1.1 - -CHAPTERS= sound/chapter.sgml - -VPATH= .. - -MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX} - -DOC_PREFIX?= ${.CURDIR}/../../../.. - -.include "../Makefile" diff --git a/ja_JP.eucJP/books/handbook/multimedia/chapter.sgml b/ja_JP.eucJP/books/handbook/multimedia/chapter.sgml deleted file mode 100644 index 5ded4d2497..0000000000 --- a/ja_JP.eucJP/books/handbook/multimedia/chapter.sgml +++ /dev/null @@ -1,397 +0,0 @@ -<!-- - The FreeBSD Documentation Project - The FreeBSD Japanese Documentation Project - - Original revision: 1.16 - $FreeBSD$ ---> - -<chapter id="sound"> - <chapterinfo> - <authorgroup> - <author> - <firstname>Moses</firstname> - <surname>Moore</surname> - <contrib>���</contrib> - </author> - </authorgroup> - <!-- 20 November 2000 --> - </chapterinfo> - - <title>�������</title> - - <sect1> - <title>���ξϤǤ�</title> - - <para>FreeBSD �Ϥ��ʤ��Υ���ԥ塼�����鸶������¤ʺ�����ڤ��ि��Ρ� - ��¿���μ���Υ�����ɥ����ɤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ - ����ˤ�ꡢMPEG Audio Layer 3 (MP3) �� WAV��Ogg Vorbis �ʤɤ� - ���ڤ�Ͽ�����������������Ǥ���褦�ˤʤ�ޤ��� - ��� FreeBSD Ports ���쥯�����ˤϡ����ʤ���Ͽ���������ڤ� - �Խ������ꡢ�������̤�ä����ꡢ��³���줿 MIDI ��������椷���� - ���뤿��Υ��ץꥱ������󤬴ޤޤ�Ƥ��ޤ���</para> - -<!-- XXX we need to talk about ripping MP3s here. --> - - <para>���ξϤ��ɤ�С��ʲ��Τ��Ȥ��Τ뤳�Ȥ��Ǥ��ޤ�:</para> - <itemizedlist> - <listitem><para>������ɥ����ɤò¥¤¥ó¥¹¥È¡ï¿½ï¿½ë¤¹ï¿½ï¿½ï¿½ï¿½Ë¡</para></listitem> - <listitem><para>�����ƥ�����ꤷ�ƥ�����ɥ����ɤ�ǧ����������ˡ - </para></listitem> - <listitem><para>����ץ륢�ץꥱ�����������Ѥ��ƥ�����ɥ����ɤ� - ���ޤ�ư���Ƥ��뤫�ɤ�����ƥ��Ȥ�����ˡ</para></listitem> - <listitem><para>������ɴ�Ϣ������Υȥ�֥륷�塼����ˡ - </para></listitem> - </itemizedlist> - - <para>���ξϤ��ɤ����ˡ��ʲ��Τ��Ȥ����ò¤·¤Æ¤ï¿½ï¿½ï¿½É¬ï¿½×¤ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½:</para> - - <itemizedlist> - <listitem><para>�����������ͥ�����ꤷ�ƥ��󥹥ȡ��뤹����ˡ (<xref - linkend="kernelconfig">)</para></listitem> - </itemizedlist> - </sect1> - - <sect1> - <title>�������ǥХ����γ�ǧ</title> - - <indexterm><primary>PCI</primary></indexterm> - <indexterm><primary>ISA</primary></indexterm> - <indexterm><primary>������ɥ�����</primary></indexterm> - <para>�����Ϥ�������ˡ����ʤ������äƤ��륫���ɤΥ�ǥ롢 - ���Υ����ɤ����Ѥ��Ƥ�����åס������� PCI��ISA - �ɤ���Υ����ɤʤΤ����ǧ����ɬ�פ�����ޤ��� - FreeBSD �ϡ����ޤ��ޤ� PCI ����� ISA �Υ����ɤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ - �⤷���ʤ��Υ����ɤ����Υꥹ�Ȥ�̵�����ϡ� - &man.pcm.4; �Υޥ˥奢��ڡ������ǧ���Ƥ��������� - ����ϴ����ʥꥹ�ȤǤϤ���ޤ��󤬡� - �ɤ��Ȥ��Ƥ��륫���ɤ����������ޤޤ�Ƥ��ޤ���</para> - - <itemizedlist> - <listitem> - <para>Crystal 4237��4236��4232��4231</para> - </listitem> - - <listitem> - <para>��ޥ� OPL-SAx</para> - </listitem> - - <listitem> - <para>OPTi931</para> - </listitem> - - <listitem> - <para>Ensoniq AudioPCI 1370/1371</para> - </listitem> - - <listitem> - <para>ESS Solo-1/1E</para> - </listitem> - - <listitem> - <para>NeoMagic 256AV/ZX</para> - </listitem> - - <listitem> - <para>Sound Blaster Pro��16��32��AWE64��AWE128��Live</para> - </listitem> - - <listitem> - <para>Creative ViBRA16</para> - </listitem> - - <listitem> - <para>Advanced Asound 100��110������� Logic ALS120</para> - </listitem> - - <listitem> - <para>ES 1868��1869��1879��1888</para> - </listitem> - - <listitem> - <para>Gravis UltraSound</para> - </listitem> - - <listitem> - <para>Aureal Vortex 1 ����� 2</para> - </listitem> - </itemizedlist> - - <indexterm> - <primary>�����ͥ�</primary> - <secondary>����ե����졼�����</secondary> - </indexterm> - <para>�����ͥ���ǻ��Ѥ���ɥ饤�Фϡ� - ���Ѥ��륫���ɤμ���ˤ�äưۤʤ�ޤ��� - ������Ǥϡ������ξܤ�������ȡ� - <link linkend="kernelconfig">�����ͥ륳��ե����졼�����ե�����</link>�� - �����ɲä�����ɤ��Τ��ˤĤ����������ޤ���</para> - - <sect2> - <title>Creative��Advance������� ESS ����������ɥ�����</title> - - <para>�����Υ����ɤ���Ѥ�����ϡ� - �����ͥ륳��ե����졼�����ե�����˰ʲ���������ɲä��ޤ���</para> - - <programlisting>device pcm</programlisting> - - <para>PnP �� ISA �����ɤ���Ѥ�����ϡ������</para> - - <programlisting>device sbc</programlisting> - - <para>��ä��Ƥ��������� - PnP �ǤϤʤ� ISA �Υ����ɤ���Ѥ�����ϡ�</para> - - <programlisting>device pcm</programlisting> - - <para>��</para> - - <programlisting>device sbc0 at isa? port0x220 irq 5 drq 1 flags 0x15</programlisting> - - <para>��ä��ޤ��� - ������ɸ�������ˤ��碌����ΤǤ��Τǡ� - IRQ �ʤɤ������ɬ�פ˱������ѹ�����ɬ�פ�����ޤ��� - �ޤ�������ξܺ٤ˤĤ��Ƥϡ�&man.sbc.4; - �Υޥ˥奢��ڡ����ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½</para> - - <note> - <para>�ѥå���Ŭ�Ѥ��Ƥ��ʤ� FreeBSD 4.0 �� - Sound Blaster Live ���б����Ƥ��ޤ��� - �ޤ�������ʸ��ǤϤ���������ˡ�ˤĤ��Ƥϰ����ޤ��� - ���Υ����ɤ���Ѥ������ˡ��ǿ��� -STABLE - �˥��åץǡ��Ȥ���褦�ˤ��Ƥ���������</para> - </note> - </sect2> - - <sect2> - <title>Gravis ���� UltraSound ������</title> - - <para>PnP �� ISA �����ɤ���Ѥ���ˤϡ� - �����ͥ륳��ե����졼�����ե�����˼��� - 2 �Ĥ�������ɲä��ޤ���</para> - - <programlisting>device pcm</programlisting> - - <programlisting>device gusc</programlisting> - - <para>PnP �ǤϤʤ� ISA �����ɤξ��ˤϡ�</para> - - <programlisting>device pcm</programlisting> - - <para>��</para> - - <programlisting>device gus0 at isa? port 0x220 irq 5 drq 1 flags 0x13</programlisting> - - <para>��ä��ޤ��� - IRQ �ʤɤ������ɬ�פ˱������ѹ�����ɬ�פ�����ޤ��� - �ޤ�������ξܺ٤ˤĤ��Ƥϡ�&man.gusc.4; - �Υޥ˥奢��ڡ����ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½</para> - </sect2> - - <sect2> - <title>Crystal ����������ɥ�����</title> - - <para>Crystal �����Υ����ɤ���Ѥ�����ϡ� - �����ͥ륳��ե����졼�����ե������</para> - - <programlisting>device pcm</programlisting> - - <para>��</para> - - <programlisting>device csa</programlisting> - - <para>��ξ����ɬ�פǤ���</para> - </sect2> - - <sect2> - <title>����Ū�ʥ����ɤΥ��ݡ���</title> - - <para>PnP ISA �����ɤ� PCI �����ɤ���Ѥ�����ϡ�</para> - - <programlisting>device pcm</programlisting> - - <para>�ò¥«¡ï¿½ï¿½Í¥ë¥³ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ì¡¼ï¿½ï¿½ï¿½ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É²Ã¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ - �֥�å��ɥ饤�Ф�����ʤ���PnP ����� ISA - �����ɤξ��ϡ�</para> - - <programlisting>device pcm0 at isa? irq 10 drq 1 flags 0x0</programlisting> - - <para>��ä��ޤ��� - IRQ �ʤɤ�����ϡ� - �ϡ��ɥ�����������˹礦�褦��ɬ�פ˱������ѹ����Ƥ���������</para> - </sect2> - </sect1> - - <sect1> - <title>�����ͥ�κƹ���</title> - - <para>ɬ�פ�����ò¥«¡ï¿½ï¿½Í¥ë¥³ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ì¡¼ï¿½ï¿½ï¿½ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É²Ã¤ï¿½ï¿½ï¿½ï¿½é¡¢ - �����ͥ��ƹ��ۤ��ޤ��� - �ܺ٤ˤĤ��Ƥϥϥ�ɥ֥å���<xref linkend="kernelconfig-building">�ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½</para> - </sect1> - - <sect1> - <title>�ǥХ����Ρ��ɤκ����ȥƥ���</title> - - <indexterm><primary>�ǥХ����Ρ���</primary></indexterm> - <para>�Ƶ�ư�����塢�������󤷤� <command>cat /dev/sndstat</command> - ��¹Ԥ��ޤ�������ȡ��ʲ��Τ褦�˽��Ϥ����Ϥ��Ǥ���</para> - - <programlisting>FreeBSD Audio Driver (newpcm) Sep 21 2000 18:29:53 -Installed devices: -pcm0: <Aureal Vortex 8830> at memory 0xfeb40000 irq 5 (4p/1r +channels duplex)</programlisting> - - <para>���顼��å����������Ϥ������ϡ� - ���ޤǤμ��Τɤ������ְ�äƤ��ޤ��� - �����ͥ륳��ե����졼�����ե������⤦���ٸ�ľ���ơ� - �������ǥХ��������ò¤·¤Æ¤ï¿½ï¿½ë¤«ï¿½É¤ï¿½ï¿½ï¿½ï¿½ï¿½Ç§ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½</para> - - <para>���顼�����Ϥ��줺�� <devicename>pcm0</devicename> - �����Ϥ��줿���ϡ� - <command>su</command> ���ޥ�ɤ� - <username>root</username> �ˤʤꡢ - ���Τ褦�˼¹Ԥ��ޤ���</para> - - <screen>&prompt.root; <userinput>cd /dev</userinput> -&prompt.root; <userinput>sh MAKEDEV snd0</userinput></screen> - - <para>���顼�����Ϥ��줺�� <devicename>pcm1</devicename> - �����Ϥ��줿���ϡ� - <command>su</command> ���ޥ�ɤ� - <username>root</username> �ˤʤꡢ - ���Τ褦�˼¹Ԥ��ޤ���</para> - - <screen>&prompt.root; <userinput>cd /dev</userinput> -&prompt.root; <userinput>sh MAKEDEV snd1</userinput></screen> - - <para>��Υ��ޥ�ɤϤɤ���⡢ - <devicename>/dev/snd</devicename> �Ȥ��� - �ǥХ��������������<emphasis>�ǤϤʤ�</emphasis>�Ȥ����������դ��Ƥ�������! - ����������ˡ� - ���Τ褦��ʣ���ΥǥХ����Ρ��ɤ�������ޤ���</para> - - <informaltable frame="none"> - <tgroup cols="2"> - <thead> - <row> - <entry>�ǥХ���</entry> - <entry>����</entry> - </row> - </thead> - - <tbody> - <row> - <entry><devicename>/dev/audio</devicename></entry> - <entry>SPARC �ߴ������ǥ����ǥХ���</entry> - </row> - - <row> - <entry><devicename>/dev/dsp</devicename></entry> - <entry>(����: 8 �ӥåȤ�) ����ץ�󥰤��벻���ǥХ���</entry> - </row> - - <row> - <entry><devicename>/dev/dspW</devicename></entry> - <entry><devicename>/dev/dsp</devicename>��Ʊ�͡� - ����������ץ�󥰤� 16 �ӥåȡ�</entry> - </row> - - <row> - <entry><devicename>/dev/midi</devicename></entry> - <entry>Raw MIDI ���������ǥХ���</entry> - </row> - - <row> - <entry><devicename>/dev/mixer</devicename></entry> - <entry>����ȥ�����ݡ��ȥߥ������ǥХ���</entry> - </row> - - <row> - <entry><devicename>/dev/music</devicename></entry> - <entry>��٥� 2 �������󥵥��󥿥ե�����</entry> - </row> - - <row> - <entry><devicename>/dev/sequencer</devicename></entry> - <entry>�������󥵥ǥХ���</entry> - </row> - - <row> - <entry><devicename>/dev/pss</devicename></entry> - <entry>�ץ�������ǽ�ʥǥХ������󥿥ե�����</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>���٤Ƥ��ޤ��Ԥ��С� - ������ɥ����ɤε�ǽ����Ѥ��뤳�Ȥ��Ǥ��ޤ��� - ���ޤ��Ԥ��ʤ����ϡ��������������������</para> - </sect1> - - <sect1> - <title>�褯��������</title> - - <qandaset> - <indexterm><primary>�ǥХ����Ρ���</primary></indexterm> - <qandaentry> - <question> - <para>unsupported subdevice XX error ���Фޤ���!</para> - </question> - - <answer> - <para>�����Ĥ��ΥǥХ����Ρ��ɤ���������������Ƥ��ޤ��� - ����μ���⤦���٤�äƤߤƤ���������</para> - </answer> - </qandaentry> - - <indexterm><primary>I/O �ݡ���</primary></indexterm> - <qandaentry> - <question> - <para>sb_dspwr(XX) timed out error ���Фޤ���!</para> - </question> - - <answer> - <para>I/O �ݡ��Ȥ����������ꤵ��Ƥ��ޤ���</para> - </answer> - </qandaentry> - - <indexterm><primary>IRQ</primary></indexterm> - <qandaentry> - <question> - <para>bad irq XX error ���Фޤ���!</para> - </question> - - <answer> - <para>IRQ �����������ꤵ��Ƥ��ޤ��� - �����ͥ륳��ե����졼�����ե�������� - IRQ ������ȡ� - ������ɥ����ɤ� IRQ �����꤬Ʊ���Ǥ��뤫��ǧ���Ƥ���������</para> - </answer> - </qandaentry> - - <qandaentry> - <question> - <para><errorname>xxx: gus pcm not attached, out of memory</errorname> �Ȥ������顼���Фޤ��� - �����������ΤǤ��礦��?</para> - </question> - - <answer> - <para>����ϡ� - �ǥХ�������Ѥ��뤿���ɬ�פʥ��꤬���ݤǤ��ʤ�����ɽ������ޤ���</para> - </answer> - </qandaentry> - </qandaset> - </sect1> -</chapter> - -<!-- - Local Variables: - mode: sgml - sgml-declaration: "../chapter.decl" - sgml-indent-data: t - sgml-omittag: nil - sgml-always-quote-attributes: t - sgml-parent-document: ("../book.sgml" "part" "chapter") - End: ---> diff --git a/ja_JP.eucJP/man/man1/gtar.1 b/ja_JP.eucJP/man/man1/gtar.1 deleted file mode 100644 index 18e74b2912..0000000000 --- a/ja_JP.eucJP/man/man1/gtar.1 +++ /dev/null @@ -1,597 +0,0 @@ -.\" Copyright (c) 1991, 1992, 1993 Free Software Foundation -*- nroff -*- -.\" See /usr/src/gnu/COPYING for conditions of redistribution -.\" -.\" Written by John F. Woods <jfw@jfwhome.funhouse.com> -.\" Updated by Robert Eckardt <roberte@mep.ruhr-uni-bochum.de> -.\" -.\" %FreeBSD: src/gnu/usr.bin/tar/tar.1,v 1.22.2.12 2002/07/14 13:19:46 sobomax Exp % -.\" -.\" $FreeBSD$ -.Dd December 23, 2000 -.Os -.Dt TAR 1 -.Sh ̾�� -.Nm tar -.Nd "�ơ��ץ���������; ""tar"" ���������֥ե���������" -.Sh �� -.Nm -.Op Oo Fl Oc Ns Ar bundled-options Ar Args -.Op Ar gnu-style-flags -.Op Ar filenames | Fl C Ar directory-name -.Ar ... -.Sh ���� -.Nm -�ϡ����Ū����ͳ�ˤ�� -.Dq tape archiver -���ά����̾�դ����ޤ����� -.Nm -�ץ������ϡ� -.Ar tarfile -�ȸƤФ�� -.Nm -�ե����ޥåȤΥ��������֥ե����������������������֤˥ե�������ɲä����ꡢ -�ޤ����������֤���ե��������Ф����ꤷ�ޤ��� -.Ar tarfile -���̾G���ơ��פ�ؤ��ޤ������ե��åԥǥ������åȤ� -�̾�Υե�����Ǥ⹽���ޤ��� -.Pp -�̾ -.Nm -���ޥ�ɥ饤��κǽ�ΰ����ϡ���ǽʸ������ӵ�ǽ�ѹ�ʸ������ʤ�ñ��Ǥ��ꡢ -�������� ����� (-) ���դ��Ƥ��դ��ʤ��Ƥ⤤���褦�ˤʤäƤ��ޤ��� -ñ��ˤϡ����ε�ǽʸ���Τ������� 1 �Ĥ�ޤ�Ǥ���ɬ�פ�����ޤ�: -.Cm A , -.Cm c , -.Cm d , -.Cm r , -.Cm t , -.Cm u , -.Cm x , -�����Ϥ��줾�졢 -.Em �ɲ� (append) -�� -.Em ���� (create) -�� -.Em ��ʬ (difference) -�� -.Em �ִ� (replace) -�� -.Em �ꥹ��ɽ�� (table of contents) -�� -.Em ���� (update) -�� -.Em ��� (extract) -���̣���Ƥ��ޤ� (�����˾ܺ٤�����ޤ�)�� -������¾�ˡ��ʲ��˾ܺ٤�Ҥ٤뵡ǽ�ѹ�ʸ���ò¡¢¥ï¿½ï¿½Þ¥ï¿½ï¿½Ã±ï¿½ï¿½ï¿½ -�ޤ�뤳�Ȥ��Ǥ��ޤ��������Τ����Ĥ��ϡ����ޥ��ñ�����Ʊ����� -���ޥ�ɥ饤��������׵ᤷ�ޤ� ( -.Sx ������ -����ò»²¾ï¿½)�� -��ǽʸ���ȵ�ǽ�ѹ�ʸ���ϡ�GNU �����ΰ����ǻ��ꤹ�뤳�Ȥ�Ǥ��ޤ� -(2 �ĤΥ��å����ǽ���դ���1 �ĤΥ��ޥ��ñ�줴�Ȥ˵�ǽʸ���� -��ǽ�ѹ�ʸ���� 1 �Ĥ������ꤹ��)�� -���������֤ؤ��ɲá����������֤������С������ƥꥹ��ɽ���Τ���� -���ޥ�ɥ饤����ꤹ��ե�����̾�ˤϡ� -������Υѥ�����ޥå�ʸ�������Ѥ��뤳�Ȥ��Ǥ��ޤ��� -.Sh ��ǽ -�ʲ��ε�ǽ�Τ����줫 1 �Ĥ�����ɬ�����ꤹ��ɬ�פ�����ޤ��� -.Pp -.Bl -tag -width "--concatenate" -compact -.It Fl A -.It Fl -catenate -.It Fl "-concatenate" -���ꤵ�줿 ( -.Nm -���������ַ�����) �ե������ tar ���������֤����� -���ɲä��ޤ� (�ɲä������θŤ� end-of-archive �֥��å��Ϻ���� -��ޤ�)�� -����ϡ����ꤵ�줿�ե����뤬���������֤���� 1 �ե�����Ȥʤ�Τ� -�Ϥʤ������ꤷ���ե��������˴ޤޤ�Ƥ���ե�����ò¡¢ºÇ½ï¿½Ë»ï¿½ï¿½ï¿½ -�������������֤��ɲä���Ȥ������̤�����ޤ��� -.Em �� : -���Υ��ץ����� -.Ar tarfile -��ƽñ¤¹ï¿½ï¿½ß¤ï¿½ï¿½ï¿½É¬ï¿½×¤ï¿½ï¿½ï¿½ï¿½ë¤¿ï¿½á¡¢1/4 -����������ȥ�å��ơ��פǤ�ư��ޤ��� -.It Fl c -.It Fl -create -���������������֤�������� (�⤷���ϸŤ����Ƥ��ڤ�ΤƤ�)������ -���줿�ե�����ò¥¢¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¤Ë½ñ¤¹ï¿½ï¿½ß¤Þ¤ï¿½ï¿½ï¿½ -.It Fl d -.It Fl -diff -.It Fl -compare -���������֤���Υե�����ȡ��������������ե����륷���ƥ���� -�ե�����Ȥΰ㤤��Ĵ�����ޤ��� -.It Fl -delete -���ꤵ�줿�ե�����ò¥¢¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ -(1/4 ������ơ��פǤ�ư��ޤ���)�� -.It Fl r -.It Fl -append -���������֤������˥ե�������ɲä��ޤ� -(1/4 ������ơ��פǤ�ư��ޤ���)�� -.It Fl t -.It Fl -list -�������������ƤΥꥹ��ɽ���ò¤·¤Þ¤ï¿½ï¿½ï¿½ï¿½â¤·ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ -.Ar filename -�����ꤵ��Ƥ���С����Υե�����������ꥹ��ɽ������ޤ��� -�����Ǥʤ���С����������֤˴ޤޤ�뤹�٤ƤΥե�����ꥹ�Ȥ�ɽ������ޤ��� -.It Fl u -.It Fl -update -���ꤷ���ե�����Τ�����������������Υե��������ǥ�������� -�ե�������ѹ����郎��������Τ������ɲä��ޤ���1/4 ������ơ��� -�Ǥ�ư��ޤ��� -.It Fl x -.It Fl -extract -.It Fl -get -���������֤���ե��������Ф��ޤ�����ǽ�ʤ�С���Í�ԡ� -�ѹ�����ե�����°���ϥꥹ�ȥ�����ޤ����⤷ -.Ar file -���������ꤵ��Ƥ��ʤ���С�����������������ե����뤬��Ф���ޤ��� -�⤷ -.Ar filename -�������ơ��׾�Υǥ��쥯�ȥ�̾�˥ޥå����Ƥ���С����Υǥ��쥯�ȥ�� -�ǥ��쥯�ȥ���Υե����뤬��Ф���ޤ� (�ǥ��쥯�ȥ���� -���٤ƤΥǥ��쥯�ȥ�ˤĤ��Ƥ�Ʊ�ͤ���Ф���ޤ�)�� -�⤷������������ˡ���������Ʊ���ե����뤬ʣ���ޤޤ�Ƥ���� (�åµï¿½ï¿½ -.Fl -append -���ޥ�ɤò»²¾ï¿½)���Ǹ�˴ޤޤ�Ƥ����Τ�¾�Τ��٤ƤΥե������ -��ñ¤¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.El -.Sh ���ץ���� -.Nm -��¾�Υ��ץ����ϡ��Ȥ߹�碌�ƻ��Ѥ��뤳�Ȥ��Ǥ��ޤ��� -1 ʸ�����ץ����ϡ����ޥ��ñ�����ǻ��ꤹ�뤳�Ȥ��Ǥ��ޤ��� -������Ϳ����٤����ץ����ξ�硢���ץ�����³���ư�������ꤷ -�ޤ���1 ʸ�����ץ����Ǥ���С������³�����ޥ�ɥ饤������� -���Ѥ��ޤ� (�ʲ��� -.Sx ������ -�ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½)�� -.Pp -.Bl -tag -width "--preserve-permissions" -compact -.It Fl -help -.Nm -�Τ��٤ƤΥ��ޥ�ɥ��ץ����ˤĤ��ư����Ȳ����ɽ�����ޤ��� -.It Fl -atime-preserve -�ơ��פ˽ñ¤«¤ï¿½Æ¤ï¿½ï¿½ë¡¢ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ê¥¹ï¿½È¥ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -(inode ���ѹ����郎�ѹ�����뤳�Ȥ����դ��Ƥ�������!) -.It Fl b -.It Fl -block-size Ar number -�ɤ߽ñ¤¤ï¿½ï¿½ï¿½Ö¥ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Ar number -* 512-byte �֥��å� �����ꤷ�ޤ��� -.It Fl B -.It Fl -read-full-blocks -û���ɤߤ����֥��å��ò¡¢´ï¿½ï¿½ï¿½ï¿½Ê¥Ö¥ï¿½ï¿½Ã¥ï¿½ï¿½Ëºï¿½ï¿½È¤ï¿½Î©ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ ( -.Bx 4.2 -�ѥ��פ��ɤ߹�����)�� -.It Fl C Ar directory -.It Fl -directory Ar directory -�Ĥ�ΰ���������������� -.Ar directory -�ذ�ư���ޤ��� -.It Fl -checkpoint -���������֤��ɤ߽ñ¤¤ï¿½ï¿½ï¿½Ö¤ï¿½ï¿½É¤ß½ñ¤¤ï¿½ï¿½ï¿½ï¿½Ð¥Ã¥Õ¥ï¿½ï¿½Î¿ï¿½ï¿½ï¿½É½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl f Xo -.Oo Ar hostname : Oc Ns Ar file -.Xc -.It Fl -file Xo -.Oo Ar hostname : Oc Ns Ar file -.Xc -���ꤵ�줿 -.Ar file -(�ǥե���Ȥ� -.Pa /dev/sa0 ) -���ɤ߽ñ¤¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -�⤷ -.Ar hostname -�����ꤵ��Ƥ���С� -.Nm -�� -.Xr rmt 8 -��Ȥäơ���⡼�ȥޥ����� -.Ar file -���ɤ߽ñ¤¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Dq Ar - -�ϥե�����̾�Ȥ��ƻ��Ѥ���뤳�Ȥ⤢��ޤ����� -�����ɸ�����Ϥ����ɤ߽Ф����ꡢɸ����Ϥؽñ¤½Ð¤ï¿½ï¿½ï¿½ï¿½ê¤¹ï¿½ë¤¿ï¿½ï¿½Ë»ï¿½ï¿½Ñ¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl -force-local -�����󤬤�����Ǥ��������������֥ե�����ϥ�������Τ�ΤȤ��ޤ��� -.It Fl F Ar file -.It Fl -info-script Ar file -.It Fl -new-volume-script Ar file -���줾��Υ��������֤�����ȡ�������ץȤ�¹Ԥ��ޤ� (���ۤ� -.Fl M -���꤬�Ԥʤ��ޤ�)�� -.It Fl -fast-read -�磻��ɥ����ɤǻ��ꤵ��Ƥ��ʤ����٤Ƥ���Х������åȤ� -������������˸��Ĥ��ä��顢���λ����ǽ�λ���ޤ��� -.It Fl G -.It Fl -incremental -�Ť� GNU-format ���󥯥��󥿥�Хå����åץե���������/�ꥹ��/��Ф��ޤ��� -.It Fl g Ar file -.It Fl -listed-incremental Ar file -������ GNU-format ���󥯥��󥿥�Хå����åץե������ -����/�ꥹ��/��Ф��ޤ��� -.It Fl h -.It Fl -dereference -����ܥ�å���󥯤ò¥·¥ï¿½Ü¥ï¿½Ã¥ï¿½ï¿½Î¤Þ¤Þ½ñ¤¹ï¿½ï¿½ß¤Þ¤ï¿½ï¿½ó¡£¥ï¿½ï¿½ï¿½Ü¥ï¿½Ã¥ï¿½ï¿½ï¿½ó¥¯¤ï¿½ -�ؤ��Ƥ���ǡ�����ñ¤¹ï¿½ï¿½ß¤Þ¤ï¿½ï¿½ï¿½ -.It Fl i -.It Fl -ignore-zeros -���������֤���Υ����֥��å� (�̾End-Of-File ���̣����) ��̵�뤷�ޤ��� -.It Fl -ignore-failed-read -�ե����뤬�ɤ�ʤ��Ƥ⡢�� 0 �Υ��ơ������� exit ���ޤ��� -.It Fl j -.It Fl y -.It Fl -bzip -.It Fl -bzip2 -.It Fl -bunzip2 -���������֤� -.Xr bzip2 1 -�ǥե��륿��󥰤��ޤ��� -.It Fl k -.It Fl -keep-old-files -�ǥ�������˴��ˤ���ե�������ݻ����ޤ����Ĥޤꡢ���������֤��� -��Ф���ե�����ϡ��ǥ�������Υե�����ؾ�ñ¤¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl K Ar file -.It Fl -starting-file Ar file -���������֤���� -.Ar file -���� (��С��ꥹ�Ȥʤɤ�) �Ϥ�ޤ��� -.It Fl l -.It Fl -one-file-system -����ե����륷���ƥ���ˤ���ե���������ǥ��������֤�������ޤ� -(¾�ե����륷���ƥ�ؤΥޥ���ȥݥ���Ȥ�٤��ޤ���)�� -.It Fl L Ar number -.It Fl -tape-length Ar number -.Ar number -* 1024 �Х��Ƚñ¤¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥Æ¡ï¿½ï¿½×¤Î¸ò´¹¤ï¿½ï¿½×µá¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl m -.It Fl -modification-time -�ե�������ѹ��������Ф��ޤ��� -.It Fl M -.It Fl -multi-volume -�ޥ���ܥ�塼�ॢ�������֤����/�ꥹ��/��Ф��ޤ��� -.It Fl n -.It Fl -norecurse -�������˺Ƶ�Ū�˥��֥ǥ��쥯�ȥ���������ޤ��� -.It Fl -volno-file Ar file -�ܥ�塼���ֹ��դ��Υե�����̾�Ǥ��� -.It Fl N Ar date -.It Fl -after-date Ar date -.It Fl -newer Ar date -�������֤� -.Ar date -��꿷�����ե������������Ф��ޤ��� -.It Fl -newer-mtime Ar date -�ѹ����֤� -.Ar date -��꿷�����ե������������Ф��ޤ��� -.It Fl o -.It Fl -old-archive -.It Fl -portability -POSIX �ե����ޥåȤǤϤʤ���V7 �ե����ޥåȤΥ��������֤�������ޤ��� -.It Fl O -.It Fl -to-stdout -�ե������ɸ����Ϥ���Ф��ޤ��� -.It Fl p -.It Fl -same-permissions -.It Fl -preserve-permissions -�ݸ�����������Ф��ޤ��� -.It Fl -preserve -.Fl p s -�λ����Ʊ�����̤�����ޤ��� -.It Fl P -.It Fl -absolute-paths -�ե�����̾������Ƭ�� -.Ql / -��Ȥ�ޤ��� -.It Fl R -.It Fl -record-number -��å�������˥�����������Υ쥳�����ֹ��������ɽ�����ޤ��� -.It Fl -remove-files -���������֤��ɲä����ե�������ɲø�˺�����ޤ��� -.It Fl s -.It Fl -same-order -.It Fl -preserve-order -�����������⤫����Ф���ե�����ò¡¢»ï¿½ï¿½ê¤µï¿½ì¤¿ï¿½ï¿½Î¤Þ¤Þ¤Ë¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl -show-omitted-dirs -���������ֺ�����˽������줿�ǥ��쥯�ȥ��ɽ�����ޤ��� -.It Fl S -.It Fl -sparse -.Dq �¤� -�ե�������ΨŪ�˰����褦�ˤ��ޤ��� -.It Fl T Ar file -.It Fl I Ar file -.It Fl -files-from Ar file -.Ar file -������Ф⤷���Ϻ�������ե�����̾�����ޤ� (1 �� 1 �ե�����̾)�� -.It Fl -null -null �ǽ���äƤ���̾�����θ���� -.Fl T -�ο�����ѹ����ޤ��� -����� -.Fl C -�����̵���ˤ��ޤ��� -.It Fl -totals -.Fl -create -�ˤ�äƽñ¤«¤ì¤¿ï¿½ï¿½ï¿½Ð¥ï¿½ï¿½È¿ï¿½ï¿½ï¿½É½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl U -.It Fl -unlink -.It Fl -unlink-first -�ե����������������ˡ����ä��������ޤ��� -.It Fl v -.It Fl -verbose -.Fl -create -�ǥ��������֤˽ñ¤¯¥Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Fl -extract -�ǥ��������֤��� -���Ф��ե�����̾��ꥹ��ɽ�����ޤ��� -�ե�������ݸ�����ե�����̾�ȤȤ��ɽ��������ˤϡ� -.Fl -list -��Ȥ��ޤ��� -.It Fl V Ar volume-name -.It Fl -label Ar volume-name -���ꤵ�줿 -.Ar volume-name -����ä����������֤�������ޤ��� -.It Fl -version -.Nm -�ץ������ΥС�������ֹ��ɽ�����ޤ��� -.It Fl w -.It Fl -interactive -.It Fl -confirmation -���٤Ƥ�ư����Ф��ơ���ǧ�����褦�ˤʤ�ޤ��� -.It Fl W -.It Fl -verify -���������֤�ñ¤¹ï¿½ï¿½ï¿½ï¿½ï¿½å¡¢ï¿½Ù¥ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß¤Þ¤ï¿½ï¿½ï¿½ -.It Fl -exclude Ar pattern -.Ar pattern -�˥ޥå�����ե������������ޤ� -(��Ф��ޤ����ɲä��ޤ��󡣥ꥹ��ɽ�����ޤ���)�� -.It Fl X Ar file -.It Fl -exclude-from Ar file -.Ar file -�˰�������Ƥ���ե������������ޤ��� -.It Fl Z -.It Fl -compress -.It Fl -uncompress -���������֤� -.Xr compress 1 -�ǥե��륿��󥰤��ޤ��� -.It Fl z -.It Fl -gzip -.It Fl -gunzip -���������֤� -.Xr gzip 1 -�ǥե��륿��󥰤��ޤ��� -.It Fl -use-compress-program Ar program -���������֤� -.Ar program -�ǥե��륿��󥰤��ޤ� -(����ϡ� -.Fl d -�����ꤵ�줿�Ȥ��� -.Dq decompress -���̣���ʤ���Фʤ�ޤ���)�� -.It Fl -block-compress -�ơ��פ⤷���ϥե��åԤΤ���ˡ����̥ץ������ν��Ϥ�֥��å� -�����ޤ� (�������ʤ��ȡ��֥��å�Ĺ�����������ʤꡢ�ǥХ����ɥ饤�Ф� -���Υ֥��å�����䤹��Ǥ��礦)�� -.It Fl Xo -.Op Cm 0 Ns - Ns Cm 7 Ns -.Op Cm lmh -.Xc -�ơ��ץɥ饤�֤�̩�٤���ꤷ�ޤ��� -.El -.Sh �� -�Ķ��ѿ� -.Ev TAR_OPTIONS -�� -.Nm -�Υǥե���ȥ��ץ������ݻ������뤳�Ȥ���ǽ�Ǥ��� -�����Υ��ץ����Ϻǽ�˲�ᤵ��ޤ��Τǡ� -����Ū�ʥ��ޥ�ɥ饤��ѥ�᡼���Ǿ�ñ¤²ï¿½Ç½ï¿½Ç¤ï¿½ï¿½ï¿½ -.Sh ������ -.Pa bert -�� -.Pa ernie -�Ȥ����ե������ޤࡢ -�֥��å��������� 20 �֥��å��Υ��������֤� -�ơ��ץɥ饤�� -.Pa /dev/sa0 -�˺��ˤϡ� -.Dl "tar cfb /dev/sa0 20 bert ernie" -�⤷���� -.Dl "tar --create --file /dev/sa0 --block-size 20 bert ernie" -�����Ϥ��ޤ��� -.Fl f -����� -.Fl b -�ե饰��ξ���Ȥ������ɬ�פȤ��Ƥ��뤳�Ȥ����դ��Ƥ��������� -���ΰ����ϡ����ޥ��ñ��˽ñ¤«¤ï¿½Æ¤ï¿½ï¿½ï¿½Î¤ï¿½Æ±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ï¿½ï¿½Þ¥ï¿½É¥é¥¤ï¿½ó¤«¤ï¿½ -��������ޤ��� -.Pp -.Pa /dev/sa0 -�ϥǥե���ȤΥǥХ����Ǥ��ꡢ20 �ϥǥե���ȤΥ֥��å� -�������Ǥ��Τǡ��åµï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ï¿½Î¤è¤¦ï¿½ï¿½Ã±ï¿½ã²½ï¿½Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Dl "tar c bert ernie" -\&"backup.tar" �Ȥ������������֤��顢���٤Ƥ� C �������ڤӥإå��� -��Ф���ˤϡ����Τ褦�˥����פ��ޤ��� -.Pp -.Dl tar xf backup.tar '*.[ch]' -.Pp -�����뤬�����ȥǥ��쥯�ȥ���Υե�����̾��Ÿ�����ʤ��褦���ѥ������ -�������Ȥ��ʤ���Фʤ�ʤ����Ȥ����դ��Ƥ������� (������ -������ϥ�����������Υե���������˥����������뤳�ȤϤǤ��ޤ���)�� -.Pp -�ե�������ع�¤���ȥ��ԡ�����ˤϡ����Τ褦�˥��ޥ�ɤ���Ѥ��Ƥ�������: -.Bd -literal -tar cf - -C srcdir . | tar xpf - -C destdir -.Ed -.Pp -�ǥ������åȤˡ� -.Xr gzip 1 -��Ȥä����̥��������֤��������ˤϡ����� -�褦�ʥ��ޥ�ɥ饤���Ȥ��Ȥ����Ǥ��礦�� -.Dl "tar --block-compress -z -c -v -f /dev/fd1a -b 36 tar/" -.Pp -�ޤȤ����ե饰�� -.Fl - -��������Υե饰�òº®ºß¤ï¿½ï¿½ï¿½ï¿½ë¤³ï¿½È¤ï¿½ï¿½Ç¤ï¿½ï¿½Ê¤ï¿½ -���Ȥ����դ��Ƥ������������Τ褦�˥����פ��ʤ���Фʤ�ʤ��櫓�� -�Ϥʤ����åµï¿½Î¤è¤¦ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ 1 ʸ���ե饰��Ȥ����Ȥ��Ǥ��ޤ��� -.Dl "tar --block-compress --gzip --verbose --file /dev/fd1a --block-size 20 tar/" -.Pp -��Τ褦�ˤ��ƺ��������ǥ����������Ƥϡ����Τ褦�ˤ���Хꥹ�� -ɽ���Ǥ��ޤ��� -.Pp -.Dl "tar tvfbz /dev/fd1a 36" -.Pp -2 �Ĥ� -.Nm -���������֤� 1 �ĤΥ��������֤ˤޤȤ��ˤϡ� -.Dl "tar Af archive1.tar archive2.tar" -��Ȥ��ޤ�����������ȡ� -.Pa archive2.tar -�˴ޤޤ�Ƥ���ե����뤬 -.Pa archive1.tar -���������ɲä���ޤ� (� -.Dl "cat archive2.tar >> archive1.tar" -�ȥ����פ��Ƥ⤦�ޤ������ʤ����Ȥ����դ��Ƥ����������ʤ��ʤ顢 -.Nm -���������֤������ˤ� end-of-file �֥��å������뤫��Ǥ�)�� -.Pp -.Pa srcdir -�ǥ��쥯�ȥ꤫�� 1997 ǯ 2 �� 9 �� 13:00 �ʹߤ��ѹ��ò¤µ¤ì¤¿ -���ƤΥե�����ò¥¢¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¤ï¿½ï¿½ë¤¿ï¿½ï¿½Ë¤Ï¡ï¿½ï¿½Ê²ï¿½ï¿½Î·ï¿½ï¿½ï¿½ï¿½ï¿½È¤Ã¤Æ²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Dl "tar -c -f backup.tar --newer-mtime 'Feb 9 13:15 1997' srcdir/" -.Pp -¾�λ��ֻ�������Ȥ��Ƥϡ� -.Sq "02/09/97 13:15" , -.Sq "1997-02-09 13:15" , -.Sq "13:15 9 Feb 1997" , -.Sq "'9 Feb 1997 13:15" , -.Sq "Feb. 9, 1997 1:15pm" , -.Sq "09-Feb" , -.Sq "3 weeks ago" , -.Sq "May first Sunday" -������ޤ��� -�����������ॾ�������ꤹ�뤿��ˤϡ� -.Sq "13:15 CEST" -�� -.Sq "13:15+200" -����Ѥ��Ʋ������� -.Sh �Ķ��ѿ� -.Nm -�ץ������ϡ��ʲ��δĶ��ѿ��ò»²¾È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Bl -tag -width "POSIXLY_CORRECT" -.It Ev POSIXLY_CORRECT -�̾ -.Nm -�ϥե�����������˺����ä��ե饰��������ޤ��� -���δĶ��ѿ������ꤹ��ȡ� -.Nm -�Ϻǽ�Υե饰�ʳ��ΰ����ò¸«¤Ä¤ï¿½ï¿½ï¿½ -�Ȥ���ʹߤΰ������Ф��ƥե饰������Ԥʤ�ʤ��Ȥ�����POSIX ���� -�˹�碌��ư���Ԥʤ��褦�ˤʤ�ޤ��� -.It Ev SHELL -���󥿥饯�ƥ��֥⡼�ɤˤ����ơ����֥�����ε�ư���׵ᤵ�줿�Ȥ��� -.Ev SHELL -�ѿ������ꤵ��Ƥ���Ф��줬�����ꤵ��Ƥ��ʤ���� -.Pa /bin/sh -�����Ѥ���ޤ��� -.It Ev TAPE -.Nm -�Υǥե���ȤΥơ��ץɥ饤�֤��ѹ����ޤ� (����ϡ������ -.Fl f -�ե饰�ˤ�ä��ѹ����뤳�Ȥ��Ǥ��ޤ�)�� -.It TAR_RSH -TAR_RSH �Ķ��ѿ��ϡ��ǥե���ȥ������ͥ�褷�ơ� -.Nm tar -�Υǡ���ž���˻��Ѥ���ޤ��� -.El -.Sh ��Ϣ�ե����� -.Bl -tag -width "/dev/sa0" -.It Pa /dev/sa0 -�ǥե���ȤΥơ��ץɥ饤�� -.El -.Sh �ߴ��� -.Fl y -�� FreeBSD �����ε�ǽ�Ǥ��� -GNU -.Nm -���ƥʤϡ� -.Fl j -�� GNU -.Nm -1.13.18 �ʹߤˤ���������� -.Xr bzip2 1 -���̥��ץ����Ȥ��ƺ��Ѥ��ޤ����� -.Fl I -���ץ����ϡ�Solaris �� -.Nm -�Ȥθߴ����Τ���ˤ���ޤ��� -.Sh ��Ϣ���� -.Xr bzip2 1 , -.Xr compress 1 , -.Xr gzip 1 , -.Xr pax 1 , -.Xr rmt 8 -.Sh ��� -.Nm -�ե����ޥåȤ�Ω�ɤ���ˤ���äƤ��ơ�Sixth Edition UNIX �� -����������ޤ��� -���� -.Nm -����� GNU �����Ǥ��ꡢ -.An John Gilmore -�ˤ�äƽñ¤«¤ì¤¿ -�ѥ֥�å��ɥᥤ�� -.Nm -�����ˤʤäƤ��ޤ��� -.Sh ��� -.An -nosplit -���οͤ�ޤࡢ����¿���ο͡���[����������� -.Pa ChangeLog -�ե�����˵��Ҥ���Ƥ���͡�] -.An John Gilmore -(���ꥸ�ʥ�Υѥ֥�å��ɥᥤ���Ǥκ��), -.An Jay Fenlason -(�ǽ�� GNU ���), -.An Joy Kendall , -.An Jim Kingdon , -.An David J. MacKenzie , -.An Michael I Bushnell , -.An Noah Friedman -������ -�Х��ե��å������ɲä�׸����Ƥ��줿̵���ο͡��� -.Pp -���Υޥ˥奢��ڡ����� -.Nx 1.0 -release ���顢 -.Fx -���롼�פ� -���������ΤǤ��� -.Sh �Х� -��ħŪ�� -.Fl C -���ץ�����ư��ϡ�����Ū�� -.Nm -�ץ������Τ���Ȥϰۤʤ�Τǡ� -���ޤ����ˤϤǤ��ޤ��� -.Pp -.Fl A -���ޥ�ɤ�Ǥ�դο��� -.Nm -���������֤���Ǥ���Ф����ΤǤ���������ϤǤ��ޤ��� -����������Ȥ��Ƥ⡢2 ���ܰʹߤΥ��������֤� -end-of-archive �֥��å���������줺�˻ĤäƤ��ޤ��ޤ��� -.Pp -.Nm -�ե�����ե����ޥåȤϽ�������ե�����ɥե����ޥåȤǤ��ꡢ -�ǥХ����ֹ��ѤΥե�����ɤ� 16 �ӥå��� -(�᥸�㡼 8 �ӥåȤǥޥ��� 8 �ӥå�) -�˥ǥ����󤵤�Ƥ��ꡢ�桹�� 32 �ӥå��ֹ� -(�᥸�㡼 8 �ӥåȤǥޥ��� 16+8 �ӥå�) -��ۼ��Ǥ��ޤ��� diff --git a/ja_JP.eucJP/man/man4/man4.i386/aic.4 b/ja_JP.eucJP/man/man4/man4.i386/aic.4 deleted file mode 100644 index f0c01ec9ef..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/aic.4 +++ /dev/null @@ -1,51 +0,0 @@ -.\" -.\" Copyright (c) 1994 James A. Jegers -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: aic.4,v 1.4 1997/02/22 13:25:10 peter Exp % -.\" $FreeBSD$ -.\" -.Dd November 29, 1994 -.Dt AIC 4 i386 -.Os -.Sh ̾�� -.Nm aic -.Nd Adaptec �� AIC-6260 �� AIC-6360 �� SCSI �ɥ饤�� -.Sh �� -.Cd "device aic0 at isa? port 0x340 bio irq 11" -.Sh ���� -.Nm aic -�ɥ饤�Ф� Adaptec �� AIC-6260 �� AIC-6360 �� SCSI -����ȥ�������åפΥ��ݡ��Ȥ��󶡤��ޤ��� -����ϡ�Adaptec 152x �� Creative -Labs SoundBlaster SCSI �ۥ��ȥ����ץ���ޤߤޤ��� -.Pp -�����Υ���ȥ�������åפ��Ѥ���¿���Υ����ƥ�� -�֡��� ROM ����äƤ��ޤ��󡣤������äơ���������֡��ȤϤǤ��ޤ��� -.Sh ��Ϣ���� -.Xr cd 4 , -.Xr ch 4 , -.Xr intro 4 , -.Xr sd 4 , -.Xr st 4 - - diff --git a/ja_JP.eucJP/man/man4/man4.i386/apm.4 b/ja_JP.eucJP/man/man4/man4.i386/apm.4 deleted file mode 100644 index 779f0a77f1..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/apm.4 +++ /dev/null @@ -1,160 +0,0 @@ -.\" LP (Laptop Package) -.\" -.\" Copyright (c) 1994 by HOSOKAWA, Tatsumi <hosokawa@mt.cs.keio.ac.jp> -.\" -.\" This software may be used, modified, copied, and distributed, in -.\" both source and binary form provided that the above copyright and -.\" these terms are retained. Under no circumstances is the author -.\" responsible for the proper functioning of this software, nor does -.\" the author assume any responsibility for damages incurred with its -.\" use. -.\" -.\" %Id: apm.4,v 1.9 1998/12/18 03:08:57 jkoshy Exp % -.\" $FreeBSD$ -.\" -.Dd November 1, 1994 -.Dt APM 4 i386 -.Os -.Sh ̾�� -.Nm apm -.Nd APM BIOS ���󥿥ե����� -.Sh �� -.Cd device apm0 at isa? -.Sh ���� -.Nm apm -�ϥ�åץȥå� PC �� Intel / Microsoft APM (Advanced Poewr Management) -BIOS �ؤΥ��󥿥ե������Ǥ��� -.Pp -.Nm apm -�ϼ����Ÿ�������ǽ���󶡤��ޤ��� -.Bl -enum -offset indent -.It -�����ƥब�����ڥ�ɥ⡼�ɤ��������������ˡ� -.Nm apm -�ϥ����ƥ�λ��פ� RTC �˹�碌�ޤ��� -.It -�����ƥब�����ڥ�ɥ⡼�ɤ��������������ˡ� -�����ƥब������������ȥ����ڥ�ɥ⡼����˷вᤷ�����֤ǹ�������� -�������� -.Nm apm -�� -.Xr syslogd 8 -�����Τ��ޤ��� -.It -.Nm apm -�ϥ����ƥ�γ�ư (�¹Բ�ǽ�ʥץ������������ߤʤ�) ���ʤ����� -CPU �Υ����å���®���ޤ��� -���ε�ǽ�� APM �� CPU �Υ����ɥ�󥰤ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½ë¥·ï¿½ï¿½ï¿½Æ¥ï¿½Ç¤Î¤ï¿½Í���Ǥ��� -.It -.Nm apm -�ϥ���饯�����ǥХ����Ȥ��ƥ��ץꥱ������󥤥󥿥ե��������󶡤��ޤ��� -���ץꥱ�������Ϥ��Υ��󥿥ե�������𤷤� APM �����椷���ꡢ -APM �ξ��־��������Ф����ꤹ�뤳�Ȥ��Ǥ��ޤ��� -.Nm apm -�ϼ��Υ��󥿥ե��������󶡤��ޤ��������Υ���ܥ�� -.Dq Pa /usr/include/machine/apm_bios.h -���������Ƥ��ޤ��� -.Bl -tag -width 4n -offset indent -.It Sy APMIO_SUSPEND -�����ƥ�ò¥µ¥ï¿½ï¿½Ú¥ï¿½É¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Sy APMIO_GET -�Ÿ�������������ꤷ�ޤ��� -.It Sy APMIO_ENABLE -.It Sy APMIO_DISABLE -�Ÿ�������Í�� / ̵���ˤ��ޤ��� -.It Sy APMIO_HALTCPU -.It Sy APMIO_NOTHALTCPU -�����ͥ륳��ƥ������ڤ��ؤ��롼����Ǥ� HLT �μ¹Ԥ����椷�ޤ��� -.Pp -HLT -.Pq �����ߤ�ȯ������ޤ� CPU ����� -̿��� -.Dq Pa Idle CPU -�ƤӽФ�����Ǽ¹Ԥ��� APM �μ����⤢��ޤ����������Ǥʤ���Τ⤢��ޤ��� -�Ǥ����餳���Í���ˤ���ȡ� -.Dq Pa Idle CPU -��ƤӽФ������ͥ륳��ƥ������ڤ��ؤ��롼���� -���� HLT ̿���¹Ԥ��뤳�Ȥˤ�ꡢ -;ʬ�� HLT ̿���¹Ԥ��뤳�Ȥˤʤ��ǽ��������ޤ��� -���η�̡������ƥ�Υԡ�����ǽ�ò¸º¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -�ޤ��������ͥ륳��ƥ������ڤ��ؤ��롼����Ǥ� HLT ̿���̵���ˤ�����硢 -�ޥ���� APM ����� -.Dq Pa Idle CPU -�� HLT ��¹Ԥ��ʤ����ˤϡ������ƥ�ϥϥ󥰥��åפ��ޤ��� -CPU �����å��θ�®�ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤Ï¡ï¿½APM �� HLT -��¹Ԥ��ʤ����⤷��ޤ��� -���Τ褦�ʥޥ���Ǥϡ� -.Nm apm -�� -.Sy APMIO_NOTHALTCPU -������̵���ˤ��ޤ��� -.Pp -���ߤΥС������� -.Nm apm -�ϡ������å��θ�®�����ݡ��Ȥ���Ƥ��ʤ����ˤϡ� -�����ͥ륳��ƥ������ڤ��ؤ��롼���󤫤� -.Dq Pa Idle CPU -��ƤӽФ������ǥե���ȤǤ� HLT ̿���¹Ԥ��ޤ��� -�������äơ�����ξ��ˤϤ����� 2 �Ĥ�����Ԥ�ɬ�פϤ���ޤ��� -.El -.Pp -�����Υ��󥿥ե������� -.Xr apm 8 -�� -.Xr apmconf 8 -�����Ѥ��ޤ��� -.It -.Nm apm -�� APM ���٥�Ȥ�ݡ���󥰤������Υ��٥�Ȥ�������ޤ��� -.Bl -column PMEV_POWERSTATECHANGEXXX "suspend system xxxxx" -.It Sy "̾�� " "ư�� " "����" -.It Dv "PMEV_STANDBYREQ " No "�����ڥ�� " "�Ե��׵�" -.It Dv "PMEV_SUSPENDREQ " No "�����ڥ�� " "�����ڥ���׵�" -.It Dv "PMEV_USERSUSPENDREQ " No "�����ڥ�� " "�桼�������ڥ���׵�" -.It Dv "PMEV_CRITSUSPEND " No "�����ڥ�� " "��掠���ڥ���׵�" -.It Dv "PMEV_NORMRESUME " No "�쥸�塼�� " "�̾������" -.It Dv "PMEV_CRITRESUME " No "�쥸�塼�� " "�������" -.It Dv "PMEV_STANDBYRESUME " No "�쥸�塼�� " "�Ե�����" -.It Dv "PMEV_BATTERYLOW " No "���������� " "������Â" -.It Dv "PMEV_UPDATETIME " No "���׹�碌 " "����ò¹¹¿ï¿½" -.El -.El -.Sh �Х� -�ٹ�! -���ߤΤȤ�������åץȥåץޥ���� APM BIOS �μ����ϡ� -�ۤȤ�ɤȤޤǤϤ����ʤ��Ƥ�Х����餱�Ǥ��� -���Υ��󥿥ե���������Ѥ���� LCD �ǥ����ץ쥤�����Ӥ� -�����ˤ��餹��ǽ��������ޤ��� -(���줬 MS-Windows ������Ȥʤ�ʤ���ͳ�ϥꥢ��⡼�ɥ��󥿥ե����� -����Ѥ��Ƥ��뤫��Ǥ���) -���Υ����ɤ���Ѥ��Ƥ��ʤ��Υ����ƥब��̯��ư��ò¤¹¤ï¿½Î¤ï¿½È¯ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ï¡ï¿½ -�Ÿ��ץ饰�����Ӥ�ľ���ˤȤޤǤϤ����ʤ��Ƥ�Ǥ�������᤯ȴ���� -���Υ����ɤ�̵���ˤ��Ƥ��������� -.Pp -��ã�Ϥ��Υ����ɤ�ư���褦�ˤʤ뤳�Ȥ˴ؿ�����äƤ��ޤ��� -�۾��ư��δѻ���̤ò¤¼¤Ò»ï¿½Ã£ï¿½ï¿½Ï¢ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Pp -.Nm apm -��Í���Ǥ�������ۥåȥ�����Ȥä� BIOS ����롼�����ƤӽФ��� -�����ƥ�쥸�塼����˽���ʾ㳲�������������ǽ��������ޤ��� -BIOS ����ץ������ϥ֡��ȥ��ȥ�å׻��ޤ��� DOS ����ƤӽФ��٤��Ǥ��� -.Pp -APM �μ����ˤ�äƤϡ��Ÿ��ܥ���ò²¡¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ä¥«ï¿½Ð¡ï¿½ï¿½ï¿½ï¿½Ä¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ã¤ï¿½ -���٥�Ȥò°·¤ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ç¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ç¤¬ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -���Τ褦�ʼ����ǥ����ƥ�ò¥µ¥ï¿½ï¿½Ú¥ï¿½É¤ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ï¡ï¿½ -.Ar ɬ�� -.Xr apm 8 -�ޤ��� -.Xr zzz 8 -.Ar ���� -����Ѥ��Ƥ��������� -.Pp -�ǥ�������®��LCD �Хå��饤�����桢�ѥ����ǥޥ�ɤ� -���ߤΥС������Ǥϥ��ݡ��Ȥ���Ƥ��ޤ��� -.Sh ��Ϣ���� -.Xr apm 8 , -.Xr apmconf 8 , -.Xr zzz 8 -.Sh ��� -Tatsumi Hosokawa <hosokawa@jp.FreeBSD.org> diff --git a/ja_JP.eucJP/man/man4/man4.i386/ar.4 b/ja_JP.eucJP/man/man4/man4.i386/ar.4 deleted file mode 100644 index 561ef5afaf..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/ar.4 +++ /dev/null @@ -1,108 +0,0 @@ -.\" -.\" Copyright (c) 1995 John Hay. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by John Hay. -.\" 4. Neither the name of the author nor the names of any co-contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY John Hay ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL John Hay BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" %Id: ar.4,v 1.9 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.\" WORD: link level layer ��󥯥�٥���� -.\" -.Dd November 19, 1995 -.Dt AR 4 i386 -.Os -.Sh ̾�� -.Nm ar -.Nd -Ʊ�� Arnet �ǥХ����ɥ饤�� -.Sh �� -.Cd "device ar0 at isa? port 0x300 net irq 10 iomem 0xd0000" -.Cd "device ar1 at isa? port 0x310 net irq 11 iomem 0xd0000" -.Pp -.Cd "pseudo-device sppp" -.Sh ���� -.Nm ar -�ɥ饤�Ф� HD64570 ���åפ���Ѥ��� Arnet SYNC/570i ISA �����ɤ� -���ݡ��Ȥ��ޤ��� -2 �ݡ��Ȥ� 4 �ݡ��Ȥ�ξ���Υ����ɤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ï¿½Æ°ï¿½ï¿½ï¿½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -����®�٤Ϻ���� 2Mbps �ޤ������ޤ�������®�٤Ǥ� 486DX �ץ����å��� -�Ӱ���� 85 % ����Ѥ��뤳�Ȥ��Ǥ��ޤ��� -.Pp -��󥯥�٥���ؤˡ�ɸ��� -.\" link level layer �� OSI ��ǥ�Ǥ� data link layer ������������ -.\" �⤷���� data link layer �ΰ��������������ΤȻפ��ޤ�������ʸ�� -.\" º�Ť��ơ֥�󥯥�٥���ءפȤ����� -.Tn FreeBSD -sppp �����ɤ���Ѥ��ޤ��� -�ǥե���ȤΥץ��ȥ���� PPP �Ǥ��� -Cisco HDLC �ץ��ȥ���� -.Xr ifconfig 8 -�� -.Ar link2 -���ɲä��뤳�Ȥˤ�äƻ��ѤǤ��ޤ��� -.Sh �ֹ� -�����ͥ�����ե�����Ǥϡ���������� 1 �ԤΤߤ�ɬ�פǤ��� -�ǽ�Υ����ɤΥݡ��Ȥϡ�ar0 ����Ƴ������ޤ��� -���Υ����ɤ��ֹ�ϡ��ǽ�Υ����ɤǻߤޤä��꤫��³���ޤ��� -�Ĥޤꡢ�⤷�ǽ�Υ����ɤ� 2 �ݡ��ȤΥ����ɤʤ顢���Υ����ɤ� ar0 �� ar1 -��Ȥ��ޤ��������Ƽ��Υ����ɤϡ�ar2 ����Ϥ�ޤ��� -.Pp -�����ɤ� IRQ 3, 5, 7, 10, 11, 12, 15 �Τߤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -iomem �ΰ�ϡ�16Kb �֥��å��Ǥ��ꡢ16Kb ��������Ϥޤ�ɬ�פ�����ޤ��� -.Pp -.Sh ���� -.Bl -diag -.It "ar%d: Warning illegal interrupt %d." -�����ɤ����ꤵ�줿�����ߤ���ѤǤ��ޤ���¾�γ����ߤ�����Ǥ��������� -.El -.Sh ��Ϣ�ե����� -.Bl -tag -width /sys/i386/isa/ic/hd64570.h -compact -.It Pa /sys/i386/isa/ic/hd64570.h -.It Pa /sys/i386/isa/if_arregs.h -.It Pa /sys/i386/isa/if_ar.c -.El -.Sh �Х� -�������� V.35 �� X.21 ���󥿥ե��������������Ƥ��ޤ��� -¾�Τ�ΤǤϥ����å���ʬ�Υ����ɤ���Ĵ������ɬ�פ�����Ǥ��礦�� -.Pp -���Υ����ɤˤϡ������餯��Ŭ����;�Ϥ�����ޤ��� -.Pp -���Υ����ɤϡ��ޤ��Ǥ����Ф���Ǥ���������¿���ΥХ�������Ǥ��礦�� -���� jhay@mikom.csir.co.za ����𤷤Ƥ��������� -.Sh ��Ϣ���� -.Xr cx 4 , -.Xr netintro 4 , -.Xr ifconfig 8 , -.Xr lsdev 8 -.Sh ��� -.Nm ar -�ǥХ����ɥ饤�Ф� -.An John Hay Aq jhay@mikom.csir.co.za -���������ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/cs.4 b/ja_JP.eucJP/man/man4/man4.i386/cs.4 deleted file mode 100644 index fa87b907ed..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/cs.4 +++ /dev/null @@ -1,105 +0,0 @@ -.\" -.\" Copyright (c) 1998 Michael Smith -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" %Id: cs.4,v 1.2 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.Dd July 20, 1998 -.Dt CS 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm cs -.Nd �������ͥåȥǥХ����ɥ饤�� -.Sh �� -.Cd "device cs0 at isa? port 0x300 net irq ?" -.Cd "device cs1 at isa? port 0x300 net irq 10 iomem 0xd0000" -.Sh ���� -.Nm -�ɥ饤�Ф� -.Nm Crystal Semiconductor CS8900 �� CS8920 -NIC ��١����ˤ��� ISA �������ͥåȥ����ץ��ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -�����ΥǥХ����� CS89x0 �ե��ߥ�η������䤦������ -�⤤�����٤Ⱦ��������������ʲ���¸������� -.Nm IBM EtherJet ISA -�����ץ������Ʊ�ǥХ������Ȥ߹����¿�������ʤˤ����ƻȤ��Ƥ��ޤ��� -.Pp -.Nm -�ɥ饤�Ф�����ѥ�᡼�������ꥨ��ȥ�ޤ��ϥ����ɤΤɤ��餫��Ǥ� -�����Ǥ��ޤ������ꥨ��ȥ�ǻ��ꤵ�줿�ѥ�᡼�����⤷¸�ߤ���� -���������Ѥ��ޤ����������ɤϥ��եȥ�����������Ǥ���Τǡ� -�����������Ŭ�����ͤˤʤäƤ���Ȼפ��ޤ��� -CS8920 �١����Υ����ץ��ϡ��̾� PnP ������󶡤���Τǡ��ɥ饤�Ф� -.Nm IBM EtherJet -�� -.Nm CSC6040 -��ưŪ�˸��Ф��ޤ��� -.Pp -CS8900 �� 4 �Ĥ� IRQ �ͤ˸��ꤵ��Ƥ��뤳�Ȥ����դ��Ƥ����������������ͤ� -�̾� 5, 10, 11, 12 �ȤʤäƤ��ޤ���CS8920 �ˤϤ��Τ褦�����¤Ϥ���ޤ��� -.Pp -����ޥåפ� DMA ư��ϸ������Ǥϥ��ݡ��Ȥ���Ƥ��ޤ��� -.Sh ���� -.Bl -diag -.It "cs%d: full/half duplex negotiation timeout" -�ϥ֤Ȥ����������ͥ��������Ȼ�Ԥ������ॢ���Ȥòµ¯¤ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -���Τ��Ȥϥ����֥���³�����꤬���뤫����٤����ߴ����Τʤ��ϥ֤Ǥ��뤳�Ȥ� -�����Ƥ��ޤ��� -.It "cs%d: failed to enable <media>" -CS89x0 �ϻؼ����줿��ǥ���������˼��Ԥ��ޤ��������Υ�ǥ�����¸�ߤ��ʤ����� -������������ޤ��� -.It "cs%d: No EEPROM, assuming defaults" -CS89x0 �� EEPROM ���ʤ�������˾Ū��»�����Ƥ��ޤ������ꥨ��ȥ꤬�����ץ��� -�ͤ�Ŭ�����ͤˤʤäƤ������ˤ������Ǥ��ޤ��� -.It "cs%d: Invalid irq" -���ꥨ��ȥ�ǻ��ꤵ�줿 IRQ �������ץ��ˤ��äƤ��ޤ��� -.It "cs%d: Could not allocate memory for NIC" -��̿Ū�ʥ�����Â�Ǥ��������ץ���ư���ޤ��� -.It "cs%d: Adapter has no media" -�����ץ�������Υ�ǥ��������פ����ꤵ��Ƥ��ޤ��� -��ǥ��������פϼ�ư�ǥ��åȤ���ɬ�פ�����ޤ��� -.It "This is a %s, but LDN %d is disabled" -PnP õ�������ɤϽ�����ǽ�ʥ����ץ��ò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -�����ץ���̵��������Ƥ��ޤ��� -.It "failed to read pnp parms" -PnP �����ץ������Ф���ޤ����������Υ����ץ��Ѥ�����ѥ�᡼�����ɤ�ޤ��� -.It "failed to pnp card parametars" -PnP ��ͳ�������ѥ�᡼����ɥ饤�Фϼ����Ȥ�ޤ���Ǥ����������ץ��Ϥ��֤� -ư���ʤ��Ǥ��礦�� -.Sh �ٹ� -CS89x0 �ե��ߥ�Υ����ץ��ϡ��ȤƤ⾮���� RAM �Хåե� (4K) ���� -���äƤ��ޤ��󡣤��Τ��Ȥ϶�ü�˹⤤�ͥåȥ����٤� -��ȯŪ�ʥͥåȥ���ȥ�ե��å����Ǥ�����òµ¯¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â¤·ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -�ºݡ�NFS ���ϥ����Х����ɤ�����ˡ� 1k ���ɤ߽ñ¤½ï¿½ï¿½ï¿½ï¿½ï¿½ -���¤���٤��Ǥ��� -.Sh ��� -.Nm -�ǥХ����ɥ饤�Ф� -.An Maxim Bolotin -�� -.An Oleg Sharoiko -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -���Υޥ˥奢��ڡ����� -.An Michael Smith -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ diff --git a/ja_JP.eucJP/man/man4/man4.i386/cx.4 b/ja_JP.eucJP/man/man4/man4.i386/cx.4 deleted file mode 100644 index ab92ab9b43..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/cx.4 +++ /dev/null @@ -1,289 +0,0 @@ -.\" -.\" %Id: cx.4,v 1.4 1997/06/23 04:02:37 steve Exp % -.\" $FreeBSD$ -.\" -.Dd December 12, 1994 -.Dt CX 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm cx , -.Nm if_cx -.Nd Ʊ��/��Ʊ�� Cronyx-Sigma �����ץ��ɥ饤�� -.Sh ���� -.Cd "device cx0 at isa? port 0x240 irq 15 drq 7" -.Cd "device cx1 at isa? port 0x260 irq 12 drq 6" -.Cd pseudo-device sppp -.Pp -i/o �١������ɥ쥹�ϡ��ܡ��ɾ�Υ����Ѥ����ꤵ��ޤ��� -DMA ����ͥ�ȳ����ߥꥯ�������ֹ�ϡ� -�����ץ���������˥��եȥ����������ꤵ��ޤ��� -�̾���ͤϰʲ����̤�Ǥ��� -.Pp -.Bl -tag -compact -width Port -.It Port -0x240, 0x260, 0x280, 0x300, 0x320, 0x380 -.It IRQ -3, 5, 7, 10, 11, 12, 15 -.It DMA -5, 6, 7 -.Sh ���� -Cronyx-Sigma �ɥ饤�Фϥ�ǥ� 100, -400, 500, 401, 404, 410, 440, 703, 801, 810, 840 �ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -��ǥ뤬�ۤʤ�ȡ�����ͥ�Υ��åȤ��ۤʤ�ޤ��� -.Pp -.Bl -tag -compact -width Cronyx-Sigma-999 -.It ��ǥ� -����ͥ� -.It Cronyx-Sigma-100 -0 -.It Cronyx-Sigma-400 -4, 5, 6, 7 -.It Cronyx-Sigma-500 -0, 4, 5, 6, 7 -.It Cronyx-Sigma-401 -0, 1, 2, 3 -.It Cronyx-Sigma-404 -0, 1, 2, 3 -.It Cronyx-Sigma-410 -0, 1, 2, 3 -.It Cronyx-Sigma-440 -0, 1, 2, 3 -.It Cronyx-Sigma-703 -0, 1, 2, 4, 5, 6, 7 -.It Cronyx-Sigma-801 -0, 1, 2, 3, 4, 5, 6, 7 -.It Cronyx-Sigma-810 -0, 1, 2, 3, 4, 5, 6, 7 -.It Cronyx-Sigma-840 -0, 1, 2, 3, 4, 5, 6, 7 -.El -.Pp -�դ��ĤΥ����ץ��ϡ��ܡ��ɴ���³�Ѥ�û�����ѥ����֥����³���뤳�Ȥ��Ǥ��ޤ��� -�դ��Ĥ���³���줿�����ץ��ϡ�Ʊ�� IRQ �� DMA ����ͥ����Ѥ��� -�ɥ饤�Ф��鸫��ФҤȤĤ� 16 ����ͥ�ޥ���ץ쥯���Ȥ���ư��ޤ��� -��³���줿�ܡ��ɤ������� ``�ޥ���'' �ˡ��⤦������ ``���졼��'' �ˤʤ�ޤ��� -.Pp -���졼�֤ˤʤä��ܡ��ɤΥ���ͥ�ϡ� -�ɥ饤�Фˤ�ä� 8 ����Ϥޤ��ֹ椬������Ƥ��ޤ��� -���Ȥ��Х�ǥ� 100 �� ��ǥ� 500 ����³����ȡ� -0, 8, 12, 13, 14, 15 �֤Υ���ͥ��ֹ椬������Ƥ��ޤ��� -.Pp -RS-232C ���󥿥ե��������ĥ���ͥ�ϡ� -Ʊ���⡼�ɤ���Ʊ���⡼�ɤΤɤ���Ǥ�ư��뤳�Ȥ���ǽ -(cxconfig �桼�ƥ���ƥ��ˤ�äƥ��եȥ�����Ū�����ò¤·¤Þ¤ï¿½) �Ǥ��ꡢ -������ ``��˥С��������ͥ�'' �ȸƤФ�ޤ��� -.Pp -Cronyx-Sigma �����ץ��ѤΥǥХ������ü�ե����� -.Pa /dev/* -�ϡ� -.Xr MAKEDEV 8 -�ˤ�ú���ޤ��� -���Ȥ��С��ʲ��Τ褦�˺��ޤ�: -.Bd -literal -cd /dev -sh MAKEDEV cronyx ttyx0 ttyx1 ttyy0 -.El -.Sh ��Ʊ���ɥ饤�� -.Pp -��Ʊ������ͥ�ΥǥХ����ե�����ˤϼ��Τ褦��̾�����դ����ޤ�: -.Pa /dev/ttyx# -- �ϥ����ץ� cx0 �ˡ� -.Pa /dev/ttyy# -- �ϥ����ץ� cx1 �ˡ� -.Pa /dev/ttyz# -- �ϥ����ץ� cx2 ���դ����ޤ��� -������ # �� 0-9-a-f �Ρ�16 �ʿ��ǤΥ���ͥ��ֹ�Ǥ��� -.Pp -�ɥ饤�Фϰʲ���ɸ�� ioctl ������դ��ޤ� ( -.Xr ioctl -�ò»²¾ï¿½): -.Pp -.Bl -tag -width TIOCXXXXX -compact -.It Dv TIOCSBRK -BREAK ���������Ϥ��ޤ��� -.It Dv TIOCCBRK -BREAK ����������ߤ��ޤ��� -.It Dv TIOCSDTR -DTR ����ò¥»¥Ã¥È¤ï¿½ï¿½Þ¤ï¿½ (DTR := 1)�� -DTR ����Ϻǽ�� open(2) ��ɬ�����åȤ��졢 -.Dv TIOCCDTR , -.Dv TIOCSDTR , -.Dv TIOCMSET , -.Dv TIOCMBIS , -.Dv TIOCMBIC -�� ioctl �ˤ���ѹ���ǽ�Ǥ��� -.It TIOCCDTR -DTR ����ò¥¯¥ê¥¢ï¿½ï¿½ï¿½Þ¤ï¿½ (DTR := 0)�� -.It TIOCMSET -DTR ����� RTS ����ˡ����ꤷ���ͤò¥»¥Ã¥È¤ï¿½ï¿½Þ¤ï¿½ (<DTR:RTS> := data)�� -DTR ����� RTS ����ϡ� -ioctl �����ƥॳ����ΰ������ -.Dv TIOCM_DTR -�� -.Dv TIOCM_RTS -�ΥӥåȤˤ�������ǽ�Ǥ��� -.It TIOCMBIS -DTR ����� RTS ����ò¥»¥Ã¥È¤ï¿½ï¿½Þ¤ï¿½ (<DTR:RTS> |= data)�� -DTR ����� RTS ����ϡ� -ioctl �����ƥॳ����ΰ������ -.Dv TIOCM_DTR -�� -.Dv TIOCM_RTS -�ΥӥåȤˤ�������ǽ�Ǥ��� -.It TIOCMBIC -DTR ����� RTS ����ò¥¯¥ê¥¢ï¿½ï¿½ï¿½Þ¤ï¿½ (<DTR:RTS> &= ~data)�� -DTR ����� RTS ����ϡ� -ioctl �����ƥॳ����ΰ������ -.Dv TIOCM_DTR -�� -.Dv TIOCM_RTS -�ΥӥåȤˤ�������ǽ�Ǥ��� -.It TIOCMGET -�饤���Υ�ǥ࿮��ξ��֤�Ƚ�ꤷ�ޤ��� -�ƤӽФ��Τ��ȡ������Υǡ����ϲ����ΥӥåȤ��ݻ����Ƥ��ޤ�: -.Pp -.Bl -tag -width TIOCM_XXX -compact -.It TIOCM_LE -��˥��å� (�饤�󥤥͡��֥����) -.It TIOCM_DSR -�ǡ������åȥ�ǥ����� (DSR) ������ -.It TIOCM_CTS -������ǽ���� (CTS) ������ -.It TIOCM_CD -�ǡ�������ꥢ���п��� (CD) ������ -.It TIOCM_DTR -�ǡ���ü����ǥ� (DTR) ���������� -.It TIOCM_RTS -�����׵� (RTS) ������ -.El -.El -.Sh Ʊ���ɥ饤�� -.Pp -Ʊ������ͥ�ȥ�˥С��������ͥ�ϡ� -.Xr cxconfig 8 -�桼�ƥ���ƥ��ˤ�ä�Ʊ���⡼�ɤ����ꤹ��ȡ� -�ͥåȥ�����󥿥ե����� ``cx#'' -(# �� 0 ���� 47 �ޤǤΥ���ͥ��ֹ�) �Ȥ��ƥ���������ǽ�Ǥ��� -���٤Ƥ�ɸ��Ū�ʥͥåȥ�����󥿥ե������ѥ�᡼���ϡ� -.Xr ifconfig 8 -�ˤ�ä������ǽ�Ǥ��� -�ޤ� -.Xr cxconfig 8 -���ޥ�ɤϡ���ĥ���줿����ͥ륪�ץ������ѹ��䡢 -��̥�٥�Υ��եȥ������ץ��ȥ��� -(PpP �� Cisco HDLC �ʤ�) ������˻��Ѥ���ޤ��� -.Pp -��˥С��������ͥ��Ʊ���⡼�ɤǤ���Ʊ���⡼�ɤǤ���Ѥ��뤳�Ȥ��Ǥ��ޤ��� -�ǥե���ȤǤ���Ʊ���⡼�ɤ����ꤵ��Ƥ��ꡢ�⡼�ɤ� -.Xr cxconfig 8 -�桼�ƥ���ƥ��ˤ�ä��ѹ���ǽ�Ǥ��� -����ͥ뤬�ӥ������� (��Ʊ������ͥ뤬�����ץ���֤ξ��䡢 -�ͥåȥ�����󥿥ե�������ư���� (up) ��) -�δ֡��⡼�ɤϥ֥��å�����ޤ��� -.Sh Ʊ���ݥ���ȥġ��ݥ���ȥץ��ȥ��� -.Pp -Cronyx-Sigma �ɥ饤�Фϡ��Ȥ߹��ߤ�Ʊ���ݥ���ȥġ��ݥ���ȥץ��ȥ��� -(sppp) ����Ѥ��ޤ��� -�ܥץ��ȥ���ˤϡ�PpP/HDLC �� Cisco/HDLC��keepalive �ѥ��åȤˤ�� -��ưŪ�ʥ��ͥ������������Ф⥵�ݡ��Ȥ��Ƥ��ޤ��� -sppp �ץ��ȥ��륻�åȤ���Ω�����⥸�塼��Ȥ��Ƽ������졢 -¾��Ʊ�����ꥢ�����ͥ�Υɥ饤�Фˤ�äƻ��Ѥ��뤳�Ȥ��ǽ�Ǥ��� -BSD/386 (BSDI) �Ѥ� -�ɥ饤�ФǤϡ�OS ¦�Ǽ�������Ƥ������Ū��Ʊ���ץ��ȥ���Υ��åȤ���� -��ǽ�Ǥ��������ץ��ȥ��륻�åȤϡ�``cxconfig ext'' ���ޥ�� -( -.Xr cxconfig 8 -�ò»²¾ï¿½) �ˤ�ä������ǽ�Ǥ��� -.Sh ����ͥ륪�ץ����δ��� -.Pp -.Xr cxconfig 8 -�桼�ƥ���ƥ��ϡ�����ͥ륪�ץ��������ꤹ��Τ˻��Ѥ���ޤ��� -����ͥ륪�ץ����ϡ��̾���ڥ졼�ƥ��󥰥����ƥब��ư����ݤ� (���Ȥ��� -.Pa /etc/rc -�ե�����ʤɤ�) ���ꤵ��ޤ��� -���٤Ƥξ��ˤ����ơ� -���٤ƤΥ��ץ���󤬰�̣����ĤȤϸ¤�ʤ����Ȥ����դ��Ƥ��������� -�ޤ��� -���ץ���������ˤ�äƤϡ� -����ͥ�⤷���ϥ����ץ����ΤΥϥ󥰥��åפθ����ˤʤ�ޤ��� -.Pp -�ºݤΥ���ͥ륪�ץ��������浡ǽ�ϡ� -�ǥХ������ü�ե����� /dev/cronyx ������ -�����Ĥ��� ioctl ���ͳ������Ǽ�������Ƥ��ꡢ�ʲ��� ioctl �����ѤǤ��ޤ��� -.Pp -.Bl -tag -width CXIOCXXXXXXX -compact -.It CXIOCGETMODE -����ͥ륪�ץ������ͤ�������ޤ��� -.It CXIOCSETMODE -����ͥ륪�ץ������ͤ����ꤷ�ޤ��� -.El -.Pp -ioctl ������Υǡ��������ϰʲ��Υ��ץ����¤�ΤΥ��ɥ쥹������ޤ�: -.Bd -literal -typedef struct { - unsigned char board; /* �����ץ��ֹ�Ǥ��ꡢ0..2 */ - unsigned char channel; /* ����ͥ��ֹ�Ǥ��ꡢ0..15 */ - unsigned char type; /* ����ͥ륿���� (�ɤ߹�������) */ - unsigned char iftype; /* chan0 ���󥿥ե����� */ - unsigned long rxbaud; /* ����®�� */ - unsigned long txbaud; /* ž��®�� */ - cx_chan_mode_t mode; /* ����ͥ�⡼�� */ - cx_chan_opt_t opt; /* ���̤Υ���ͥ륪�ץ���� */ - cx_opt_async_t aopt; /* ��Ʊ���⡼�ɥ��ץ���� */ - cx_opt_hdlc_t hopt; /* hdlc �⡼�ɥ��ץ���� */ - cx_opt_bisync_t bopt; /* bisync �⡼�ɥ��ץ���� */ - cx_opt_x21_t xopt; /* x.21 �⡼�ɥ��ץ���� */ - cx_soft_opt_t sopt; /* ���եȥ��������ץ����Ⱦ��֥ե饰 */ -} cx_options_t; /* �桼���������ǽ�ʥ��ץ���� */ -.Ed -.Pp -.Bl -tag -width rxbaudxxx -.It Fa board -0..2 �Ρ������ץ��ֹ� -.It Fa channel -0..15 �Ρ�����ͥ��ֹ� -.It Fa type -����ͥ�Υ����� (�ɤ߼�����Ѥΰ���) -.It Fa iftype -0 �� (�� 8 ��) ����ͥ�Υ��󥿥ե����������ס� 0 - RS-232, 1 - RS-449/V.35�� -.It Fa rxbaud -�����ܡ��졼�� -.It Fa txbaud -�����ܡ��졼�� -.It Fa mode -����ͥ�⡼��: ��Ʊ��/HDLC/Bisync/X.21 -.It Fa opt -���̤Υ���ͥ륪�ץ���� -.It Fa aopt -��Ʊ���⡼�ɥ��ץ���� -.It Fa hopt -HDLC �⡼�ɥ��ץ���� -.It Fa bopt -Bisync �⡼�ɥ��ץ���� -.It Fa xopt -X.21 �⡼�ɥ��ץ���� -.It Fa sopt -���եȥ������ץ��ȥ��륪�ץ���� -.El -.Sh ��Ϣ�ե����� -.Bl -tag -width /dev/cxXXXX -compact -.It Pa /dev/cx?? -��Ʊ������ͥ� -.It Pa /dev/cronyx -����ͥ륪�ץ��������ѤΥǥХ������ü�ե����� -.El -.Pp -�ɥ饤�Ф�ޤ�Ǥ��륽�����ե�����ϰʲ����̤�Ǥ�: -.Pp -.Bl -tag -width /dev/cxXXXX -compact -.It Pa /sys/i386/isa/cronyx.c -.It Pa /sys/i386/isa/cx.c -.It Pa /sys/i386/isa/if_cx.c -.It Pa /sys/i386/isa/cronyx.h -.It Pa /sys/i386/isa/cxreg.h -.It Pa /sys/net/if_spppsubr.c -.It Pa /sys/net/if_sppp.h -.El -.Sh ��Ϣ���� -.Xr cxconfig 8 , -.Xr ifconfig 8 diff --git a/ja_JP.eucJP/man/man4/man4.i386/el.4 b/ja_JP.eucJP/man/man4/man4.i386/el.4 deleted file mode 100644 index 674a44c505..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/el.4 +++ /dev/null @@ -1,58 +0,0 @@ -.\" -.\" Copyright (c) 1994 James A. Jegers -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: el.4,v 1.7 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.Dd July 10, 1995 -.Dt EL 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm el -.Nd 3Com Etherlink 3C501 �ǥХ����ɥ饤�ФΤ���Υ������ͥåȥɥ饤�� -.Sh �� -.Cd "device el0 at isa? port 0x300 net irq 9" -.Sh ���� -.Nm -���󥿥ե������ϡ� -3Com 3c501 8 �ӥå� ISA �������ͥåȥ����ɤΥ��ݡ��Ȥ��󶡤��ޤ��� -3c501 �����ɤϤ��ʤ��٤����Ȥ��Τ��Ƥ��ޤ��Τǡ� -�⤷��ǽ�ʤ�¾�Υ������ͥåȥ����ɤ��Ѥ���٤��Ǥ��� -��������10 Mb/s �������ͥåȥͥåȥ���ؤΥ��������Ȥ��Ƥϰ²��Ǥ��� -.Pp -Í���� I/O �ݡ��Ȥ� 0x280-0x3f0 ���ϰϤǤ��� -.Sh �Х� -�ɥ饤�Фϥ����ɤ������ͥ��Ʊ�� IRQ �����ꤵ��Ƥ���Ȳ��ꤷ�ޤ��� -���줬���������ɤ����Τ����ץ����֤�����å��ϹԤ��Ƥ��ޤ��� -.Pp -���ߡ�DMA �ϥ��ݡ��Ȥ��Ƥ��ޤ��� -.Pp -���ߡ��ޥ�����㥹�Ȥϥ��ݡ��Ȥ��Ƥ��ޤ��� -.Sh ��Ϣ���� -.Xr ed 4 , -.Xr eg 4 , -.Xr ep 4 , -.Xr ie 4 , -.Xr intro 4 , -.Xr le 4 , -.Xr ifconfig 8 diff --git a/ja_JP.eucJP/man/man4/man4.i386/ep.4 b/ja_JP.eucJP/man/man4/man4.i386/ep.4 deleted file mode 100644 index 6fdb3ba408..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/ep.4 +++ /dev/null @@ -1,121 +0,0 @@ -.\" -.\" Copyright (c) 1994 Herb Peyerl -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by Herb Peyerl -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: ep.4,v 1.9 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.Dd February 04, 1993 -.Dt EP 4 i386 -.Os -.Sh ̾�� -.Nm ep -.Nd -3Com Etherlink III �������ͥåȥǥХ����ɥ饤�� (3c5x9) -.Sh �� -.Cd "device ep0 at isa? port 0x300 net irq 10" -.Sh ���� -.Nm ep -�ɥ饤�Ф� 3c509 (ISA) �� 3c579 (EISA) �Υ��ݡ��Ȥ��󶡤��ޤ��� -�����Υ����ɤΤ��ޤ��ޤʥ�ǥ�ϡ����ͥ��������󤬤��줾��ۤʤ�ޤ��� -.Pp -.Bl -tag -width xxxxxxxxxxxxxxxxxxxx -.It AUI/DIX -ɸ�� 15 �ԥ󥳥ͥ��� -.It 10Base2 -BNC (���󥱡��֥�Ȥ��Ƥ��Τ��Ƥ�����) -.It 10BaseT -UTP (�ĥ����ȥڥ��Ȥ��Ƥ��Τ��Ƥ�����) -.El -.Pp -�ǥե���Ȥǻ��Ѥ����ݡ��Ȥϡ� -���åȥ��åץ桼�ƥ���ƥ������ò¤µ¤ï¿½Æ¤ï¿½ï¿½ï¿½Ý¡ï¿½ï¿½È¤Ç¤ï¿½ï¿½ï¿½ -����ò¥ª¡ï¿½ï¿½Ð¥é¥¤ï¿½É¤ï¿½ï¿½ï¿½Ë¤Ï¡ï¿½ -.Xr ifconfig 8 -�ޤ��� -.Pa /etc/rc.conf -�ե�����Ǽ��Υե饰����Ѥ��ޤ��� -.Pp -.Bl -tag -width xxxxxxxxxxxxxxxxxxxx -.It link0 -AUI �ݡ��Ȥ���� -.It link1 -BNC �ݡ��Ȥ���� -.It link2 -UTP �ݡ��Ȥ���� -.El -.Pp -����ԥ塼����ʣ���Υ����ɤ����夷�Ƥ�����ϡ����ν��֤�õ����ޤ��� -�ǽ�� 3c579 EISA �����ɤ�õ����ޤ� -- -������ EISA �����å��ֹ��˸��Ф���ޤ��� -���ˡ�3c509 ISA �����ɤ�õ����ޤ� -- -�������ͥåȥ��ɥ쥹�ξ���˸��Ф���ޤ��� -���ˡ��ɤΤ褦�˥ץ����֤���뤫����ò¼¨¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -ep0 at isa0 port 0x6000-0x600f irq 10: aui/bnc address 00:60:8c:70:e5:c5 -ep1 at isa0 port 0x300-0x30f irq 3: aui/bnc/utp address 00:20:af:10:62:ab -.Pp -�����ɤ�ȯ������뤳�Ȥ����Ԥ����ݡ��Ȥ� IRQ ����ꤹ�뤳�Ȥ�Ǥ��ޤ����� -���λ����ɬ������ɬ�פǤϤ���ޤ��� -�����ɤ� ISA �Х���Ǥμ�ʬ�ε����桹��������� -��ʬ�ʥ���ƥꥸ���󥹤������Ƥ���ΤǤ��� -.Pp -.Sh ���� -3c509 �����ɤˤϥ��ɥ쥹�����ꤹ�른���Ѥ�����ޤ��� -3Com �ϥ����ɤΥ��ɥ쥹�����ꤹ�륽�եȥ��������󶡤��Ƥ��ޤ��� -ISA �Х���Ǥ��Υ����ɤò¸«¤Ä¤ï¿½ï¿½ë¤¿ï¿½ï¿½Ë¡ï¿½ -�����ͥ�� IO ���ɥ쥹 0x110 ��ʣ���ʥ����������Ԥ��ޤ��� -���դ��Ƥ�������! ���Υ��ɥ쥹��¾�Υ����ɤ����֤��뤳�Ȥ��ò¤±¤Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Pp -.Sh ���� -ep0: reset (status: %x) -.in +4 -�ɥ饤�Ф� FIFO �Υ�������ޤ��ϥ����Х��ò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¥é¥¤ï¿½Ð¤ï¿½ -�����ɤ�ꥻ�åȤ����ѥ��åȤ������ޤ����������̿Ū�ǤϤ���ޤ��� -.in -4 -ep0: eeprom failed to come ready -.in +4 -EEPROM �ν������Ǥ��Ƥ��ޤ��󡣤����餯�����ɤ����Ǥ��ޤ��� -.in -4 -ep0: 3c509 in test mode. Erase pencil mark! -.in +4 -ï���������ɤξ�Υƥ����ΰ�˱�ɮ����ñ¤¤ò¤·¤Æ¤ï¿½ï¿½ë¤«ï¿½â¤·ï¿½ï¿½Þ¤ï¿½ï¿½ó¡£±ï¿½É®ï¿½ï¿½ -���פ�ä��ƥ�֡��Ȥ��Ƥ������� (����ϥ��硼���ǤϤ���ޤ���)�� -.in -4 -.Sh ��Ϣ���� -.Xr ed 4 , -.Xr eg 4 , -.Xr el 4 , -.Xr ie 4 , -.Xr intro 4 , -.Xr le 4 , -.Xr vx 4 , -.Xr ifconfig 8 -.Sh ���� -�ϰ���ʤꡣË�٤�����褬����ޤ��� - diff --git a/ja_JP.eucJP/man/man4/man4.i386/ex.4 b/ja_JP.eucJP/man/man4/man4.i386/ex.4 deleted file mode 100644 index d7e46e0d6d..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/ex.4 +++ /dev/null @@ -1,84 +0,0 @@ -.\" -.\" Copyright (c) 1997 David E. O'Brien -.\" -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: ex.4,v 1.6 1998/10/22 14:32:20 bde Exp % -.\" $FreeBSD$ -.\" -.\" WORD: Plug-N-Play �ץ饰����ɥץ쥤 -.\" -.Dd January 19, 1997 -.Dt EX 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm ex -.Nd -Intel EtherExpress Pro/10 �� Pro/10+ �������ͥåȥǥХ����ɥ饤�� -.Sh �� -.Cd "device ex0 at isa? port? net irq ?" -.Sh ���� -.Nm -�ɥ饤�Ф� Intel i82595 ���åפ���ܤ��� 16 �ӥå� PCI �� -Intel EtherExpress Pro/10 �� Pro/10+ �������ͥåȥ����ɤ� -���ݡ��Ȥ��󶡤��ޤ��� -.Pp -�ݡ��Ȥγ��ϥ��ɥ쥹�����Ĥ���ʤ���С� -I/O ���ɥ쥹�� 0x200 ���� 0x3a0 ���ϰϤ��饫���ɤ�õ���ޤ��� -IRQ �����ꤵ��Ƥ��ʤ���С������ɤ� EEPROM �����ɤ߽Ф���ޤ��� -������Υ����ɤǤ����������Τ���ˤ� -�ץ饰����ɥץ쥤�Υ��ݡ��Ȥ�̵���ˤ��٤��Ǥ��� -.Pp -.Sh ���� -.Bl -diag -.It "ex%d: Intel EtherExpress Pro/10, address %6D, connector %s" -�ǥХ����ץ����֤ϥ��󥹥ȡ��뤵�줿�����ɤ�ȯ�����ơ� -�ǥХ����ɥ饤�Ф����������󥹥ȡ��뤹�뤳�Ȥ��Ǥ��ޤ����� -.It "ex%d: WARNING: board's EEPROM is configured for IRQ %d, using %d" -�ǥХ����ץ����֤ϥ����ͥ�����ե�����ǻ��ꤵ�줿��ΤȤ� -�ۤʤ�����ߤ����ꤵ��Ƥ���ܡ��ɤò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.It "ex%d: invalid IRQ." -�ǥХ����ץ����֤������� IRQ ����ò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.El -.Pp -.Sh �Х� -���ߤϡ��ɥ饤�Фϥޥ�����㥹�Ȥò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -.Sh ��Ϣ���� -.Xr arp 4 , -.Xr netintro 4 , -.Xr ifconfig 8 -.Sh ��� -.Nm -�ǥХ����ɥ饤�Ф� -.Fx 2.2 -�˽����о줷�ޤ����� -.Sh ��� -.Nm -�ǥХ����ɥ饤�Ф� -.ie t .An Javier Mart\)'in Rueda -.el .An Javier Martin Rueda -�ˤ�äƽñ¤«¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -���Υޥ˥奢��ڡ����� -.An David E. O'Brien -�ˤ�äƽñ¤«¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ diff --git a/ja_JP.eucJP/man/man4/man4.i386/fe.4 b/ja_JP.eucJP/man/man4/man4.i386/fe.4 deleted file mode 100644 index cb1bdb394a..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/fe.4 +++ /dev/null @@ -1,284 +0,0 @@ -.\" All Rights Reserved, Copyright (C) Fujitsu Limited 1995 -.\" -.\" This document may be used, modified, copied, distributed, and sold, in -.\" both source and printed form provided that the above copyright, these -.\" terms and the following disclaimer are retained. The name of the author -.\" and/or the contributor may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS DOCUMENT IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS DOCUMENT, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" Contributed by M. Sekiguchi <seki@sysrap.cs.fujitsu.co.jp>. -.\" for fe driver. -.\" -.\" %Id: fe.4,v 1.11 1998/10/22 13:01:19 bde Exp % -.\" $FreeBSD$ -.\"" lair events -> typo of "rare" events (approved by original writer) -.Dd March 3, 1996 -.Dt FE 4 i386 -.Sh ̾�� -.Nm fe -.Nd �ٻ��� MB86960A/MB86965A ��١����Ȥ����������ͥåȥ����ץ� -.Sh �� -.Cd "device fe0 at isa? port 0x300 net irq ?" -.Sh ���� -.Nm fe -�ϡ��ٻ��� MB86960A, MB86965A �ޤ��Ϥ���¾�θߴ����åפ�١����Ȥ��� -�������ͥåȥ����ץ��Τ���Υͥåȥ���ǥХ����ɥ饤�ФǤ��� -.Pp -���Υɥ饤�Фϡ������ץ��Υϡ��ɥ��������б����Ƥ���С� -I/O �ݡ��ȥ��ɥ쥹�� IRQ �������ưŪ�˹Ԥʤ��ޤ��� -.Pp -���Υɥ饤�Фϥץ������ I/O �ǡ���ž�����Ѥ���Ѥ��Ƥ��ꡢ -�ޤ��ޤ��Υѥե����ޥ󥹤������ޤ��� -�����ץ������Ȥ����äƤ����Ȥ��Ƥ⡢��Í����ϻ��Ѥ��ޤ��� -.Pp -���Υɥ饤�Фϸ��ߤΤȤ�����ISA �Ѥ��ٻ��� FMV-180 ���꡼���� -ISA �Ѥ� ���饤�ɥƥ쥷�� AT1700 ���꡼���� RE2000 ���꡼���� -�ٻ��� MBH10302 PC �����ɤ��б����Ƥ��ޤ��� -.Ss �ѥ�᡼�� -�����ͥ�����ե�����ˤ����ơ�2 �ĤΥѥ�᡼�� -.Ar port -�� -.Ar irq -�ˤϡ������ץ��Υϡ��ɥ����������ȿ�Ǥ����ͤ���ꤹ��ɬ�פ�����ޤ��� -�⤦ 1 �ĥ��ץ����Ȥ��� -.Ar flags -�ѥ�᡼�������ꡢ�ղ�Ū�������Ԥʤ����Ȥ��Ǥ��ޤ��� -����¾�� device ʸ�ˤ�����ѥ�᡼���Ͻñ¼°¤Ë½ñ¤«¤ï¿½Æ¤ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½ -��ɬ�פ�����ޤ��� -.Pp -.Ar port -�ѥ�᡼���ϡ������ץ��Υ١��� I/O �ݡ��ȥ��ɥ쥹����ꤷ�ޤ��� -�����ͤϥ����ץ��Υϡ��ɥ���������ȹ��פ��Ƥ���ɬ�פ�����ޤ��� -.Ar port -�ϡ� -.Dq Li \&? -�ˤ��ơ����ꤻ���˻Ĥ��Ƥ������Ȥ�Ǥ��ޤ��� -���ξ�硢�ɥ饤�Ф� I/O ���ɥ쥹�˴ؤ���ϡ��ɥ���������θ��Ф� -��ưŪ�˻�ߤޤ��� -���ε�ǽ�ϥ����ץ��ϡ��ɥ������ˤ�äƤ�ư���ʤ����⤷��ޤ��� -.Pp -.Ar irq -�ѥ�᡼���ϡ������ץ������Ѥ��� IRQ �ֹ����ꤷ�ޤ��� -�����ͤϥ����ץ��Υϡ��ɥ���������ȹ��פ��Ƥ���ɬ�פ�����ޤ��� -.Ar irq -�ϡ� -.Dq Li \&? -�ˤ��ơ����ꤻ���˻Ĥ��Ƥ������Ȥ�Ǥ��ޤ��� -���ξ�硢�ɥ饤�Ф� IRQ �˴ؤ���ϡ��ɥ���������θ��Ф� -��ưŪ�˻�ߤޤ��� -���ε�ǽ�ϥ����ץ��ϡ��ɥ������ˤ�äƤ�ư���ʤ����⤷��ޤ��� -.Pp -.Ar flags -�ϡ��͡��ʥǥХ���������Ȥ߹�碌����ʤ���ͤǤ��� -���ߤΥС������Ǥϰʲ��� flags ���������Ƥ��ޤ��� -2 �İʾ�������ǥХ��������ꤹ��ˤϡ� -���줾��� flag �ͤ���ͤDzû����Ƥ��������� -�ʲ��ǻ��ꤵ��Ƥ��ʤ� flag �ӥåȤ�ͽ�󤵤�Ƥ��ꡢ0 �ˤ��ʤ���� -�ʤ�ޤ��󡣼ºݤˤϡ����줾��ΥӥåȤ�ñ��̵�뤵��뤫���ƥ����Ѥ� -�ɥ饤�Ф�ʸ�ñ²½¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½Ç½ï¿½ï¿½ï¿½ï¿½ï¿½æ¤¹ï¿½ë¤¿ï¿½ï¿½Ë»È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -ʸ�ñ²½¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½Ç½ï¿½Ë¤Ä¤ï¿½ï¿½Æ¤Ï¡ï¿½ï¿½×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Bl -tag -width "99999999" -.It Li 0x007F -������ flag �ӥåȤϡ� -.Ar flags -�� -.Li 0x0080 -�ӥåȤ����ꤵ��Ƥ�����ˡ�MB86960A/MB86965A ���åפ� DLCR6 �쥸������ -��������뤿��˻��Ѥ���ޤ��� -DLCR6 ��ñ¤µï¿½Ç½ï¿½Ë´Ø¤ï¿½ï¿½ï¿½ÜºÙ¤Ï°Ê²ï¿½ï¿½ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -����ΥС������ˤ�����ɥ饤�Фθߴ������ݻ����뤿��ˡ� -.Li 0x0080 -�ӥåȤ����åȤ���Ƥ��ʤ����ʳ��� -.Li 0x007F -flag �ӥåȤ� 0 �ˤ��Ƥ����Ƥ��������� -.It Li 0x0080 -���� flag �ϡ�MB86960A/MB86965A ���åפ� DLCR6 �쥸�������Ф��� -�ǥե��������� flag �ͤ� ��� 7 bit ���Ѥ��ƾ�ñ¤¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -���� flag ���������ѤΤ�ΤǤ��ꡢ�����ץ��ϡ��ɥ������˴ؤ��� -�μ�������ͤΤߤ����Ѥ��Ƥ��������� -DLCR6 ����˴ؤ���ܺ٤ʾ���ϡ��ٻ��̤Υޥ˥奢��ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.El -.Sh ���ץ���� -.Nm fe -�ɥ饤�Фϥ����ͥ�����ե�����ˤ����ơ� -.Dq option -ʸ�ǻ���Ǥ��뤤���Ĥ��λ�Ū�ʥ��ץ�������äƤ��ޤ��� -�ʲ��˻�Ū���ץ�����ꥹ�Ȥ��ޤ��� -�ɥ饤�ФϤ���ʳ��ˤ�ʸ�ñ²½¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Õ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -������̾���ˤ����� -.Dv "FE_" -�Ȥ������ꤵ�줿��Ƭ�����դ����Ƥ��ޤ��� -ʸ�ñ²½¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½×¥ï¿½ï¿½ï¿½ï¿½Ë¤Ä¤ï¿½ï¿½Æ¤Ï¡ï¿½ï¿½×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Bl -tag -width "FE_" -.It Dv "FE_DEBUG=" Ns Ar level -���Υ��ץ����ϡ��ǥХ����� (�ޤ���) �ɥ饤�ФΥǥХå��󥰥�٥�� -���椹����ͤ�����Ȥ�ޤ��� -.Dv "FE_DEBUG" -�����˥ꥹ�Ȥ���Ƥ��ʤ��ͤ˥��ץ��������ꤹ��ȡ� -ʸ�ñ²½¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Ê¤ï¿½Æ°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â¤·ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -���Υ��ץ����˴ؤ���ǥե���Ȥ������ͤ� 1 �Ǥ��� -.Bl -bullet -.It -.Dv "FE_DEBUG=0" -�����ꤹ��ȡ��������γ�ǧ��ޤ᤿¿���ΥǥХå��ѥ����ɤ��� -�ɥ饤�ФΥ��֥������ȥ����ɤ��������ޤ��� -��������ϺǤ�®���ƾ����ʥ��֥������ȥ����ɤ��������ޤ��� -��������Ǥ��äƤ⡢�����Ĥ���������å������ϵ�Ͽ����ޤ��� -.It -.Dv "FE_DEBUG=1" -�����ꤹ��ȡ�����¤ΥǥХå��ѥ����ɤ��ޤޤ졢 -�Ǿ��̤Υ�å���������Ͽ����ޤ��� -��������Ǥ���̿Ū�ʥ��顼��å������Τߤ���Ͽ����ޤ��� -.It -.Dv "FE_DEBUG=2" -�����ꤹ��ȡ�ɸ��Ū�ʥǥХå��ѥ����ɤ��ޤޤ졢 -����̤Υ�å���������Ͽ����ޤ��� -��������Ǥ���¿�ˤʤ����٥�Ȥ�������ʾ��֤ǤΥ�å���������Ͽ����ޤ��� -.It -.Dv "FE_DEBUG=3" -�����ꤹ��ȡ����ƤΥǥХå��ѥ����ɤ��ޤޤ졢 -�����̤Υ�å���������Ͽ����ޤ��� -��������Ǥ��̾�ư�������쥸�����ͤΥ���פʤɤ� -��Ĺ�ʥ�å���������Ͽ����ޤ��� -.El -.El -.Sh �ϡ��ɥ�������ǥ����Í�ε�ǽ -.Nm fe -�ɥ饤�Фˤϡ������ץ��Υϡ��ɥ�������ǥ����Í�ε�ǽ�����¤� -�����Ĥ�����ޤ��� -�ʲ��Ϥ��Τ褦�������γ�ά�Ǥ��� -.Ss �ٻ��� FMV-180 ���꡼�������ץ� -�����Υ����ץ��Ǥϡ�IRQ �� I/O �ݡ��ȥ��ɥ쥹��ξ���� -��ưŪ�˸��в�ǽ�Ǥ��� -.Pp -FMV-180 ���꡼���Ǥ� -.Nm fe -�μ�ư I/O �ݡ��ȥ��ɥ쥹���е�ǽ�Ϥ����Ƥ��ξ�����ɤ�ư���ޤ��� -�⤷�����ƥ�� 2 �İʾ�� FMV-180 �����ä��Ȥ��Ƥ⡢ -������ư���ޤ��� -������������ʳ��Υ����ץ��Ȥ��Ȥ߹�碌�ϡ��ɥ饤�Ф��𤵤��뤫�� -����ޤ��� -�ϡ��ɥ��������ФDz�������ò´¶¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï¡ï¿½ -.Em "port ?" -��Ȥ�ʤ����Ȥò¤ª´ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -FMV-180 ���꡼���Ǥ� -.Nm fe -�μ�ư IRQ ���е�ǽ�ϳμ¤�ư���ޤ��� -FMV-180 �ˤϾ�� -.Em "irq ?" -��Ȥ����Ȥò¤ª´ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -IRQ �Υϡ��ɥ���������ϡ������ͥ�����ե�����ˤ����� IRQ �ͤ����ꤵ��� -�����Ȥ��Ƥ⡢�����ץ��� EEPROM ���꤫���ɤ߹��ޤ�ޤ��� -�ɥ饤�Фϥ����ͥ�����ե�����ǻ��ꤵ�줿 IRQ �� EEPROM ����¸���줿�ͤ� -��äƤ�����硢�ٹ��å��������������� -����ե�����ǻ��ꤵ�줿�ͤ���Ѥ��ޤ� -(���ο��������Υ�꡼������ѹ��ˤʤäƤ��ޤ�)�� -.Ss ���饤�ɥƥ쥷�� AT1700 ���꡼���� RE2000 ���꡼�������ץ� -���饤�ɥƥ쥷�� AT1700 ���꡼���� RE2000 ���꡼���Ǥϡ� -��ư I/O �ݡ��ȥ��ɥ쥹���е�ǽ��ư���ޤ����� -FMV-180 ���꡼�����ϳμ��٤�����ޤ��� -���饤�ɥƥ쥷���Υ����ץ��Ǥ��ε�ǽ����Ѥ���ΤϤ�����Ǥ��ޤ��� -.Pp -��ư IRQ ���Ф����¤Ĥ��Ǥ�����ǽ�Ǥ��� -.Nm fe -�ɥ饤�Ф�����ե������ -.Dq irq \&? -�����ꤵ��Ƥ�����硢�ܡ��ɤ� EEPROM ������ IRQ ��������褦�Ȥ��ޤ��� -�Թ��ʤ��Ȥˡ�AT1700 ���꡼���� RE2000 ���꡼���ˤ� 2 ����Υ�ǥ뤬 -����褦�˻פ��ޤ�; -���륿���פ� IRQ �� 3/4/5/9 ���������ǽ�ǡ��⤦������ 10/11/12/15 �������� -��ǽ�Ǥ��� -�����Υ�ǥ�μ�����ˡ�ϡ��ɤ��Τ��Ƥ��ޤ��� -���Τ��ᡢ���饤�ɥƥ쥷���Υ����ץ��Ǥμ�ư IRQ ���Фϳμ¤Ǥʤ��褦�Ǥ��� -�����ȥ�֥뤬���������ϡ����Τ� IRQ �ֹ����ꤷ�Ƥ��������� -.Pp -AT17000 ���꡼���� RE2000 ���꡼���ΰ㤤�䡢 -�����Υ��꡼����ǤΥޥ��ʥ�ǥ�θ�ʬ���Ϥ��Ƥ��ޤ��� -.Ss �ٻ��� MBH10302 PC ������ -.Nm fe -�ɥ饤�Ф��ٻ��� MBH10302 �ȸߴ� PC �����ɤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -ư��ˤ� PC ������ (PCMCIA) ���ݡ��ȥѥå�������ɬ�פǤ��� -.Sh ��Ϣ���� -.Xr netstat 1 , -.Xr crd 4 , -.Xr ed 4 , -.Xr netintro 4 , -.Xr ifconfig 8 , -.Xr pccardd 8 -.Sh �Х� -�ʲ��ϡ����Τ��ç¤ï¿½Ê¥Ð¥ï¿½ï¿½Ç¤ï¿½: -.Pp -.Nm fe -�ɥ饤�Фˤ�ä��ݤ���Ƥ��륳�ꥸ���������פ����ΤǤϤ���ޤ���; -.Xr netstat 1 -�� -.Fi i -���ץ����ϼºݤΥ��ꥸ�������㴳���ʤ��ͤò¼¨¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -�פä�����¿���� mbuf ���饹�������ñ¤µ¤ï¿½Þ¤ï¿½ï¿½ï¿½ -�ѥ��åȼ����롼���󤬡�mbuf ���饹���γ�����ƥݥꥷ�ˡ��虜 -�Ȱ�ȿ���Ƥ��뤫��Ǥ��� -��ɬ�פ˳�����Ƥ�줿���饹����û����¸���֤Dz�������뤿�ᡢ -Ĺ���ܤǸ���Х����ͥ��������̤ˤϱƶ����ޤ��� -.Pp -XNS �� IPX �ؤΥ��ݡ��Ȥ��ɥ饤�Фˤϴޤޤ�Ƥ��ޤ����� -���٤�ƥ��ȤϤ���Ƥ��餺����������ΥХ�������Ϥ��Ǥ��� -.Sh ��ԡ���������վ�� -.Pp -.Nm fe -�ɥ饤�Ф� -.An David Greenman -���ñ¤¤¤ï¿½ -.Nm ed -�ɥ饤�Ф����ϤȤ��ơ� -.An M. Sekiguchi Aq seki@sysrap.cs.fujitsu.co.jp -���ȼ��˺������ƴ�£���ޤ����� -.Nm fe -�ˤ����� PC �����ɥ��ݡ��Ȥ� -.An Hidetoshi Kimura Aq h-kimura@tokyo.se.fujitsu.co.jp -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -���Υޥ˥奢��ڡ����� -.An M. Sekiguchi -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.Pp -.Em "All Rights Reserved, Copyright (C) Fujitsu Limited 1995" -.Pp -This document and the associated software may be used, modified, -copied, distributed, and sold, in both source and binary form provided -that the above copyright, these terms and the following disclaimer are -retained. The name of the author and/or the contributor may not be -used to endorse or promote products derived from this document and the -associated software without specific prior written permission. -.Pp -THIS DOCUMENT AND THE ASSOCIATED SOFTWARE IS PROVIDED BY THE AUTHOR -AND THE CONTRIBUTOR -.Dq AS IS -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE -CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -DOCUMENT AND THE ASSOCIATED SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -.Sh ��� -.Nm -�ɥ饤�Ф� -.Fx 2.0.5 -�����о줷�ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/ie.4 b/ja_JP.eucJP/man/man4/man4.i386/ie.4 deleted file mode 100644 index 7c314c8cc9..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/ie.4 +++ /dev/null @@ -1,96 +0,0 @@ -.\" $FreeBSD$ -.\" -.\" Copyright (c) 1994, Wilko Bulte -.\" All rights reserved. -.\" -.\" %Id: ie.4,v 1.7 1998/10/22 14:12:55 bde Exp % -.\" -.Dd September 23, 1994 -.Dt IE 4 i386 -.Os -.Sh ̾�� -.Nm ie -.Nd -���������ͥåȥǥХ����ɥ饤�� -.Sh �� -.Cd "device ie0 at isa? port 0x360 net irq 7 iomem 0xd0000" -.Sh ���� -.Nm ie -�ɥ饤�Фϡ�8 �ӥåȵڤ� 16�ӥåȤ� Intel i82586 ���åפ�١����ˤ����� -ISA �������ͥåȥ����ɤΥ��ݡ��Ȥ��󶡤��ޤ��� -����� AT&T �� Starlan 10 �ڤ� Starlan Fiber�� -EN100��Intel EtherExpress 16��3COM 3C507 �ڤ� RACAL Interlan NI5210 -�ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -.Sh ���� -.Bl -diag -.It "ie%d: unknown board type code %d" -i82586 ���åפϸ��Ĥ���ޤ������� -�ɥ饤�Фϥץ�������˼ºݤΥܡ��ɥ����פ����Ǥ��ޤ���Ǥ����� -.It "ie%d: kernel configured maddr %x doesn't match board configured maddr %x" -�ǥХ����ץ����֤ϡ� -�����ͥ�����ե�����˻��ꤵ�줿 maddr �Ȱۤʤ� maddr �ò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.It "ie%d: can't find shared memory" -�ǥХ����ץ����֤ϡ� -��Í������ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ë¤¿ï¿½ï¿½Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.It "ie%d: kernel configured msize %d doesn't match board configured msize %d" -�ǥХ����ץ����֤ϡ� -��Í������ç¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¥ï¿½ï¿½ï¿½ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½Ë»ï¿½ï¿½ê¤µï¿½ì¤¿ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È°Û¤Ê¤ë¤³ï¿½È¤ï¿½ -���Ф��ޤ����� -.It "ie%d: kernel configured irq %d doesn't match board configured irq %d" -�ǥХ����ץ����֤ϡ� -�ܡ��ɤγ��������꤬�����ͥ�����ե�����˻��ꤵ�줿����Ȱۤʤ뤳�Ȥ� -���Ф��ޤ����� -.It "ie%d: reset" -Intel i82586 �ϥɥ饤�Фˤ��ꥻ�åȤ����ɬ�פ�����ޤ����� -.It "ie%d: transceiver problem" -�ɥ饤�Фϡ����������ͥåȥȥ�󥷡��Ф�����ò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -����ϡ� -���դ��ȥ�󥷡��Ф���Ѥ��Ƥ���Ȥ��˥ȥ�󥷡��Х����֥뤬�ˤ�Ǥ��롢 -�⤷������»���Ƥ��뤳�Ȥ��̣���ޤ��� -�⤷��������ò¥«¡ï¿½ï¿½É¾ï¿½Î¥È¥ï¿½ó¥·¡ï¿½ï¿½Ð¤Ç·Ð¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ï¡ï¿½ -�����ɤ����դ��ȥ�󥷡��Ф���Ѥ���褦�� -���äƥ��������ꤵ��Ƥ��뤫�⤷��ޤ��� -�ǰ��ξ�硢����ܡ��ɥȥ�󥷡��Фϲ���Ƥ��뤫�⤷��ޤ��� -.It "ie%d: TDR detected an open %d clocks away" -�ɥ饤�Фϡ� -���������ͥåȥ����֥�β�ϩ�������ץ�ˤʤäƤ��뤳�Ȥò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -Ʊ�������֥�Ƚ����ñ¹³¤ï¿½ï¿½Ç§ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.It "ie%d: TDR detected a short %d clocks away" -�ɥ饤�Фϡ� -���������ͥåȥ����֥뤬û�����Ƥ��뤳�Ȥò¸¡½Ð¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -Ʊ�������֥�Ƚ�ü�ñ¹³¤ï¿½ï¿½Ç§ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.It "ie%d: TDR returned unknown status %x" -�ɥ饤�Фϡ����������ͥåȥ����֥��������ʾ��֤����ޤ����� -.It "ie%d: multicast address setup command failed" -�����ɤϡ��ޥ�����㥹�ȥ⡼�ɤ�����ޤ���Ǥ����� -.It "ie%d: configure command failed" -�����ɤϡ������������˱������뤳�Ȥ���ݤ��ޤ����� -.It "ie%d: individual address setup command failed" -�������ͥåȤ� MAC ���ɥ쥹��ץ�����ह�뤳�Ȥ˼��Ԥ��ޤ����� -.El -.Sh �ٹ� -Racal Interlan NI5210 �ˤϡ� -��Í���꤬ 8K �Х��ȤΤ�Τ� 16K �Х��ȤΤ�ΤȤ�����ޤ��� -16K �Х��ȤΤ�Τ���Ѥ��뤳�Ȥò¶¯¤ï¿½ï¿½ä¾©ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -8K �Х��ȥ����ɤϡ��ɲä� RAM ���åפ�ä��뤳�Ȥˤ�ꡢ -16K �Х��Ȥˤ��뤳�Ȥ��Ǥ��ޤ��� -.Pp -.Sh ��Ϣ���� -.Xr arp 4 , -.Xr netintro 4 , -.Xr ifconfig 8 -.Sh ��� -.Nm -�ǥХ����ɥ饤�Фϡ� -.An William F. Jolitz -�ڤ� Lawrence Berkeley Laboratories �Υ����ɤ��� -.An Garrett A. Wollman -���������ޤ����� -.Tn 3C507 -���ݡ��Ȥ� -.An Charles M. Hannum -���������ޤ����� -���Υޥ˥奢��ڡ����� -.An Wilko C. Bulte -�����Ҥ��ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/io.4 b/ja_JP.eucJP/man/man4/man4.i386/io.4 deleted file mode 100644 index fabd384abc..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/io.4 +++ /dev/null @@ -1,72 +0,0 @@ -.\" -.\" Copyright (c) 1996 Joerg Wunsch -.\" -.\" All rights reserved. -.\" -.\" This program is free software. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: io.4,v 1.5 1997/03/21 20:13:45 mpp Exp % -.\" $FreeBSD$ -.\" -.Dd Jan 1, 1996 -.Dt IO 4 i386 -.Os -.Sh ̾�� -.Nm io -.Nd I/O �ø��ե����� -.Sh ���� -�ü�ե����� -.Pa /dev/io -�����沼�ˤ��륻�����ƥ��ۡ���ǡ� -.Pq �̾�ϥ����ͥ�����������ɤ�ͽ�󤵤줿 -I/O �ø������뤳�Ȥ�ץ������˵��Ĥ��ޤ��� -.Pa /dev/io -�ò³«¤ï¿½ï¿½ï¿½ï¿½Õ¥ï¿½ï¿½ï¿½ï¿½ëµï¿½Ò»Ò¤ï¿½ï¿½ï¿½Ã¤ï¿½ï¿½É¤ï¿½Ê¥×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤â¡¢ -�ե饰�쥸�������åȤ���� -.Em IOPL -�ӥåȤ����뤳�Ȥ��Ǥ��ޤ��� -���ʤ����ľ�� I/O �����뤳�Ȥ�������ޤ��� -����ϡ��ϡ��ɥ�������ľ������ -�桼�����ɤΥץ�������ñ¤¯¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î©ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -���������������� -.Pa /dev/io -�Υե����륢�������ѡ��ߥå����ˤ�äƴ�������Ƥ��ޤ��Τǡ� -���ΥǥХ������������ѡ��ߥå�����Ϳ����褦�� -���դ���ɬ�פ�����ޤ��� -�ɤ߹������ѤΥ��������Ǥ��������٤Ƥ� I/O �ø��� -Ϳ���Ƥ��ޤ����Ȥ����դ��Ƥ��������� -.Sh �ե����� -.Bl -tag -width Pa -compact -.It Pa /dev/io -.El -.Sh ��Ϣ���� -.Xr mem 4 -.Sh ��� -.Nm io -�ե������ -.Fx 1.0 -���о줷�ޤ����� - - - diff --git a/ja_JP.eucJP/man/man4/man4.i386/lnc.4 b/ja_JP.eucJP/man/man4/man4.i386/lnc.4 deleted file mode 100644 index d98101a2e5..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/lnc.4 +++ /dev/null @@ -1,124 +0,0 @@ -.\" -.\" Copyright (c) 1997 David E. O'Brien -.\" -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: lnc.4,v 1.6 1998/11/06 09:46:02 obrien Exp % -.\" $FreeBSD$ -.\" -.Dd January 19, 1997 -.Dt LNC 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm lnc -.Nd -AMD Lance/PCnet �������ͥåȥǥХ����ɥ饤�� -.Sh �� -.Cd "device lnc0 at isa? port 0x280 net irq 10 drq 0" -.Sh ���� -.Nm -�ɥ饤�Фϡ�Am7990 �� Am79C960 �ޤ� AMD �ե��ߥ�����Ѥ��Ƥ��� -Lance/PCnet Ethernet NIC �ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½ë¤¿ï¿½ï¿½ï¿½ï¿½Ñ°Õ¤ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Nm -���󥿥ե������ˤ�äƥ��ݡ��Ȥ���Ƥ��륤�����ͥåȥ����ɤϼ����̤�Ǥ�: -.Bl -tag -width -offset ident -compat -.It Novell NE2100 -.It Novell NE32-VL -.It Isolan BICC -.It Digital DEPCA -.It Hewlett Packard Vectra 486/66XM -.It Hewlett Packard Vectra XU -.El -.Sh ���� -.Bl -diag -.It "lnc%d: Framing error" -�ե졼�ߥ󥰥��顼��ȯ�����ޤ����� -����Ϥޤ���CRC ���顼��ȯ���������Ȥ��̣���Ƥ��ޤ��� -���η�̡� -�ɥ饤�Фϥե졼�ߥ󥰥��顼��ޤ�Ǥ���ѥ��åȤ���Ȥ��ޤ����� -.It "lnc%d: Receive CRC error" -���������������ͥåȥե졼��ϡ�CRC �����å�����˼��Ԥ��ޤ����� -���η�̡� -�ɥ饤�Ф������å�����˼��Ԥ����ѥ��åȤ���Ȥ��ޤ����� -.It "lnc%d: Packet dropped, no mbufs" -�ɥ饤�Ф� mbuf ��Ȥ��̤��Ƥ��ޤ��ޤ����� -�����餯�ñ¸»¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È»×¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It "lnc%d: Couldn't allocate memory for NIC" -��̿Ū���顼�Ǥ��� -���ξ������Ǥϡ������ɤ��Ф��ƥɥ饤�Фϥ����å�����ޤ��� -.It "lnc%d: Memory allocated above 16Mb limit" -ISA �� ESIA �����ɤϡ� -16MB �ʾ���ΰ�� DMA ž����Ԥ�����ˡ��Х��󥹥Хåե���ɬ�פȤʤ�ޤ��� -Am7990 �� Am79C960 �Υ��ɥ쥹�饤��� 24 �ܤ�������ޤ���Τǡ� -ʪ������Τ��������̤� 16MB �ˤ������������Ǥ��ޤ��� -.Nm -�ɥ饤�Фϡ����ʤ�������Ƥ���꤬���� 16MB ���ϰ���ˤ���Ȳ��ꤷ�Ƥ��ޤ��� -����Ϥ��ޤ������ʲ���ǤϤ���ޤ��󤬡� -����ʳ�����ˡ�Ϻ��ΤȤ�������Ǥ��ޤ��� -��Í��������Ѥ��� NIC �˴ؤ��Ƥϴط�����ޤ��� -.It "lnc%d: Device timeout -- Resetting" -�ǥХ����ϥͥåȥ���˱�������Τ���ߤ����������뤤�ϡ� -�ͥåȥ����³ (�����֥�) �˴ؤ������꤬ȯ�����ޤ����� -������Υͥåȥ����³�ȥ����ɤ����꤬Ʊ���ˤʤäƤ��뤫 -�ɤ�����ǧ���Ƥ��������� -.It "lnc%d: Transmit late collision -- Net error?" -.It "lnc%d: Loss of carrier during transmit -- Net error?" -.It "lnc%d: Transmit of packet failed after 16 attempts -- TDR = %d" -.It "lnc%d: Heartbeat error -- SQE test failed" -.It "lnc%d: Babble error - more than 1519 bytes transmitted" -.It "lnc%d: Missed packet -- no receive buffer" -.It "lnc%d: Memory error -- Resetting" -.It "lnc%d: Couldn't get mbuf for transmit packet -- Resetting" -.It "lnc%d: Receive buffer error" -.It "lnc%d: Receive overflow error" -.It "lnc%d: Receive interrupt with buffer still owned by controller -- Resetting" -.It "lnc%d: Receive interrupt but not start of packet -- Resetting" -.It "lnc%d: Start of packet found before end of previous in receive ring -- Resetting" -.It "lnc%d: End of received packet not found -- Resetting" -.It "lnc%d: Transmit interrupt with buffer still owned by controller -- Resetting" -.It "lnc%d: Transmit interrupt but not start of packet -- Resetting" -.It "lnc%d: Start of packet found before end of previous in transmit ring -- Resetting" -.It "lnc%d: End of transmitted packet not found -- Resetting" -.It "lnc%d: Transmit buffer error -- Resetting" -.It "lnc%d: Transmit underflow error -- Resetting" -.El -.Sh �Х� -���Υɥ饤�Фϡ� -�ɤΥ������ͥåȥɥ饤�Ф����Ĺ�˺���Ƥ����ǽ��������ޤ��� -.Sh ��Ϣ���� -.Xr arp 4 , -.Xr netintro 4 , -.Xr ifconfig 8 -.Sh ��� -.Nm -�ǥХ����ɥ饤�Ф� -.Fx 2.2 -�����о줷�ޤ����� -.Sh ��� -.Nm -�ǥХ����ɥ饤�Ф� -.An Paul Richards -���������ޤ����� -���Υޥ˥奢��ڡ����� -.An David E. O'Brien -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ diff --git a/ja_JP.eucJP/man/man4/man4.i386/mcd.4 b/ja_JP.eucJP/man/man4/man4.i386/mcd.4 deleted file mode 100644 index fb25731e30..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/mcd.4 +++ /dev/null @@ -1,151 +0,0 @@ -.\" -.\" Copyright (c) 1994 Keith E. Walker -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software withough specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: mcd.4,v 1.6 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.Dd December 8, 1994 -.Dt MCD 4 i386 -.Os FreeBSD 2.0 -.Sh ̾�� -.Nm mcd -.Nd Mitsumi CD-ROM �ɥ饤�� -.Sh �� -.Cd "device mcd0 at isa? port 0x300 bio irq 10" -.Sh ���� -.Nm mcd -�ɥ饤�Ф� Mitsumi �� CD-ROM �ץ쥤����Ф��ơ��ǡ����ȥ����ǥ����� -���󥿥ե��������󶡤��ޤ��� -CD-ROM �ץ쥤��ϡ�Mitsumi ���ѤΥ���ȥ����� -�ܡ��ɤ� 1 �Ĥ�Ф�ISA �Х�����³����Ƥ��뤳�Ȥ�ɬ�פǤ��� -���ݡ��Ȥ���Ƥ��륳��ȥ�����ܡ��ɤ� LU002S, LU005S, FX001, �����ư���Ū�� -FX001D �Ǥ��� -.Pp -.Nm mcd -�ɥ饤�Фϥǥ�������Í�� -.Fn ioctl -���ޥ�ɡ����ʤ�� -.Dv DIOCGDINFO , -.Dv DIOCGPART , -.Dv DIOCWDINFO , -.Dv DIOCSDINFO , -���ޥ�ɤ��Ф��Ʊ������ޤ��� -¾�Υǥ�������Í�� -.Fn ioctl -���ޥ�ɤˤϥ��顼���֤���Τ⤢��Ǥ��礦�� -.Pp -.Nm mcd -�ɥ饤�Фϡ����̤� CD-ROM -.Fn ioctl -���ޥ�ɤ��Ф��Ƥ�������ޤ��������Υ��ޥ�ɤϡ�CD-ROM �ץ쥤��� -�����ǥ�����ǽ�����椷�ޤ��� -���ޥ�ɤϼ����̤�Ǥ�: -.Pp -.Bl -tag -width CDIOCREADSUBCHANNEL -compact -offset indent -.It CDIOCREADSUBCHANNEL -�ǥ������������θ��ߤξ��֤ˤ����륵�֥���ͥ�ξ����������ޤ��� -.It CDIOCREADTOCHEADER -�ܼ��إå���������ޤ��� -.It CDIOCREADTOCENTRYS -���Ƥ��ܼ���������ޤ��� -.It CDIOCPLAYTRACKS -���ꤵ�줿���֤ˤ����ơ������ǥ���������Ϥ�ޤ��� -.It CDIOCPLAYBLOCKS -.Dv EINVAL -���顼�Ǽ��Ԥ��ޤ��� -.It CDIOCPLAYMSF -���ꤵ�줿���֤ˤ����ơ������ǥ���������Ϥ�ޤ��� -.It CDIOCRESUME -���餫��������ߤ����ǥ������κ�����쥸�塼�ष�ޤ��� -.It CDIOCPAUSE -�ǥ������κ���������ߤ��ޤ��� -.It CDIOCSTART -�ǥ�����������Ϥ�ޤ��� -.It CDIOCSTOP -���餫���������Υǥ���������ߤ��ޤ��� -.It CDIOCEJECT -�ǥ������ȥ졼�ò¥ª¡ï¿½ï¿½×¥ó¤·¤Þ¤ï¿½ -(�����������륳�ޥ�ɤϥ��ݡ��Ȥ���Ƥ��ޤ���)�� -.It CDIOCRESET -�������������ߤ���Mitsumi ����ȥ�����ܡ��ɤ�ꥻ�åȤ��ޤ��� -.It CDIOCSETDEBUG -�����ͥ�� -.Nm mcd -�ɥ饤�ФˤĤ��ƤΥǥХå���å������ò¥³¥ó¥½¡ï¿½ï¿½ï¿½Ë½ï¿½ï¿½Ï¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It CDIOCCLRDEBUG -�����ͥ�� -.Nm mcd -�ɥ饤�ФˤĤ��ƤΥǥХå���å������ν��Ϥ�λ���ޤ��� -.El -.Pp -�åµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.Fn ioctl -���ޥ�ɤ� -.Nm mcd -�ɥ饤�Ф����ݡ��Ȥ��륳�ޥ�ɤ����Ǥ���( -.Dv CDIOCSETVOL -�� -.Dv CDIOCSETSTERIO -�Τ褦��) CD-ROM ��Ϣ -.Fn ioctl -���ޥ�ɤ�¸�ߤ��ޤ��������Τ褦�ʥ��ޥ�ɤ� -�ɥ饤�Фξ���ΥС������ǥ��ݡ��Ȥ���뤫���Τ�ޤ��� -.Sh ��Ϣ�ե����� -.Bl -tag -width /dev/(r)mcd0a -compact -.It Pa /dev/(r)mcd0a -�ǥ�������� BSD �ѡ��ƥ������˥����������ޤ����̾CD-ROM �ǥ����� -���¸�ߤ���ե����륷���ƥ��ñ��Ǥ��� -.It Pa /dev/(r)mcd0c -raw �ǥХ����˥����������ޤ��� -.El -.Sh �� -.Nm mcd -�ɥ饤�ФΥ���饯���⡼�ɥǥХ����ϡ� -�����ǥ�����ǽ�˸��ꤷ�ƥ����������뤿��˻Ȥ��٤��Ǥ��� -�ǡ�����ǽ�˥�����������ȡ���ǽ���Ҥɤ���������Ǥ��� -.Pp -�ɥ饤�Фθ��ߤΥС������ϡ��������줿������ IRQ ���Ф��Ƴ����� -�ϥ�ɥ���ݻ����Ƥ���ˤ⤫����餺�����󥿥ե������ܡ��ɤ� DMA �� -IRQ ��ǽ�Τɤ�����Ѥ��Ƥ��ޤ��� -�Ȥ⤫�� DMA ��ǽ�����ݡ��Ȥ����ޤǡ��ܡ��� -��������������ߤ����ϥɥ饤�Фˤ�äƥ��ݡ��Ȥ���ޤ��� -.Sh ��Ϣ���� -.Pa /usr/include/sys/cdio.h -.Sh ��� -�ɥ饤�Ф� -.An Holger Veit -(�ǡ�����ʬ) �ڤ� -.An Brian Moore -(�����ǥ�����ʬ) ���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð¤ï¿½ï¿½ï¿½ï¿½Ñ¹ï¿½ï¿½ï¿½ -.An Gary Clark II , -.An Andrew A. Chernov , -.An Jordan K. Hubbard -�ˤ�ä��󶡤���ޤ����� -.Sh ��� -.Nm mcd -�ɥ饤�Ф� -.Fx 1.0 -�Ǻǽ���о줷�ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/npx.4 b/ja_JP.eucJP/man/man4/man4.i386/npx.4 deleted file mode 100644 index f44bbaabde..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/npx.4 +++ /dev/null @@ -1,79 +0,0 @@ -.\" -.\" Copyright (c) 1993 Christopher G. Demetriou -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by Christopher G. Demetriou. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software withough specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" from: npx.4,v 1.1 1993/08/06 10:58:03 cgd Exp -.\" %Id: npx.4,v 1.5 1998/10/22 14:22:13 bde Exp % -.\" $FreeBSD$ -.\" -.\" WORD: Numeric Processing Extension coprocessor ���ͱ黻���ץ����å� -.\" -.Dd August 28, 1993 -.Dt NPX 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm npx -.Nd ���ͱ黻���ץ����å��ȥ��ߥ�졼�� -.Sh �� -.Cd "options MATH_EMULATE" -.\" XXX this is awful hackery to get it to work right... -- cgd -.Cd "device npx0 at isa? port IO_NPX tty irq 13" -.Sh ���� -.Nm npx -�ɥ饤�Фϡ������ƥ�˿��ͱ黻���ץ����å�������С� -��������ѤǤ���褦�ˤ��ޤ��� -��ĥ���ͱ黻��ǽ (NPX) �ϡ� -.Sy 486DX -CPU ��Ȥä������ƥ�䡢 -.Sy 387 -�ޤ��� -.Sy 487SX -���ץ����å���Ȥä������ƥ��¸�ߤ��ޤ��� -.Nm npx -�ɥ饤�Ф� NPX ��¸�ߤ��뤫�ݤ��˴ؤ�餺�� -�����ƥब�����ư��뤿���ɬ�פǤ��� -.Pp -�⤷ NPX �������ƥ��¸�ߤ��ʤ����ˤϡ� -�����ͥ�����ե������ "MATH_EMULATE" ���ץ���� -���Ҥ���Ƥ��뤳�Ȥ�ɬ�פǤ��� -����ˤ�ꡢ�̾�� NPX �Ǽ¹Ԥ����̿�᤬���ݡ��Ȥ���ޤ��� -�����ƥ�� NPX ��¸�ߤ����������ͥ뤬���إ��ߥ�졼�������դ����� -���ۤ���Ƥ�����ˤϡ������ƥ�ϵ�ư���ޤ��� -.Sh �ٹ� -���ߥ�졼���� NPX ���ץ����å�����٤������٤��Ǥ��� -���Τ��ᡢ���ߥ�졼����Ȥ�ʤ���Фʤ�ʤ��Ȥ��ˤϡ� -��ư�������黻����ǽ�������ʤ�ޤ��� -.Sh �Х� -�������󤢤�ޤ����ä˰¤äݤ��ޥ����ܡ��ɾ�ǻȤä����ˤϤ����Ǥ��� -NPX ���� CPU �ؤγ����ߥ饤����������������Ƥ��ʤ� -�ޥ����ܡ��ɤ�����ޤ��� -�⤷���Τ褦�ʾ��ˡ������ƥब��������ư��ò¤¹¤ë¤³ï¿½È¤ï¿½Ë¾ï¿½ï¿½Ê¤ï¿½Ð¡ï¿½ -���ߥ�졼����Ȥ����Ȥ�ɬ�פǤ��� -.Pp -Ķ�۴ؿ�̿��Υ��ߥ�졼�����������ΤǤ��� -����ʳ���̿��Υ��ߥ�졼������������Ǥ��� diff --git a/ja_JP.eucJP/man/man4/man4.i386/pcf.4 b/ja_JP.eucJP/man/man4/man4.i386/pcf.4 deleted file mode 100644 index 7f14fc2530..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/pcf.4 +++ /dev/null @@ -1,65 +0,0 @@ -.\" Copyright (c) 1998, Nicolas Souchu -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" -.\" $FreeBSD$ -.Dd August 6, 1998 -.Dt PCF 4 -.Os FreeBSD -.Sh ̾�� -.Nm pcf -.Nd -Philips I2C �Х�����ȥ����� -.Sh �� -.Cd "controller pcf0 at isa? port? irq 5" -.Pp -1 �İʾ�� iicbus ������ -.Cd "controller iicbus0" -.Sh ���� -.Em pcf -�ɥ饤�Ф� -.Xr iicbus 4 -�����ƥ��Ѥ� Philips PCF8584 I2C ����ȥ�����Υ��ݡ��Ȥ��󶡤��ޤ��� -.Pp -PCF8584 �� CMOS �ƥ��Υ������߷פ��줿���Ѳ�ϩ�Ǥ��ꡢ -�ۤȤ�ɤ�ɸ��Ū�ʥѥ���Х��ޥ���������ȥ�����/�ޥ������ץ����å��� -���ꥢ�� I2C �Х��Ȥδ֤Υ��󥿥ե��������󶡤��ޤ��� -PCF8584 �ϥޥ����ȥ��졼�֤�ξ���ε�ǽ���󶡤��ޤ��� -I2C �Х��Ȥ��̿��ϳ����ߤ��ݡ���󥰥ϥ�ɥ���������Ȥ��� -�Х��Ȥ���ܤȤ��Ƽ¹Ԥ���ޤ��� -�ޤ���I2C ����Í�Υ������󥹡��ץ��ȥ��롢Ĵ�䡢�����ߥ󥰤����Ƥ� -���椷�ޤ��� -PCF8584 �ϥѥ���Х������ƥ�� I2C �Х��Ȥ��������̿����ǽ�ˤ��Ƥ��ޤ��� -.Pp -.Sh ��Ϣ���� -.Xr iicbus 4 -.Sh ��� -.Nm -�ޥ˥奢��ڡ����� -.Fx 3.0 -���о줷�ޤ����� -.Sh ��� -���Υޥ˥奢��ڡ����� -.An Nicolas Souchu -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ diff --git a/ja_JP.eucJP/man/man4/man4.i386/perfmon.4 b/ja_JP.eucJP/man/man4/man4.i386/perfmon.4 deleted file mode 100644 index 16d20578b0..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/perfmon.4 +++ /dev/null @@ -1,225 +0,0 @@ -.\" -.\" Copyright 1996 Massachusetts Institute of Technology -.\" -.\" Permission to use, copy, modify, and distribute this software and -.\" its documentation for any purpose and without fee is hereby -.\" granted, provided that both the above copyright notice and this -.\" permission notice appear in all copies, that both the above -.\" copyright notice and this permission notice appear in all -.\" supporting documentation, and that the name of M.I.T. not be used -.\" in advertising or publicity pertaining to distribution of the -.\" software without specific, written prior permission. M.I.T. makes -.\" no representations about the suitability of this software for any -.\" purpose. It is provided "as is" without express or implied -.\" warranty. -.\" -.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS -.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, -.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT -.\" SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" %Id: perfmon.4,v 1.6 1998/03/12 07:30:36 charnier Exp % -.\" $FreeBSD$ -.Dd March 26, 1996 -.Dt PERFMON 4 i386 -.Os FreeBSD 2.2 -.Sh ̾�� -.Nm perfmon -.Nd CPU ����ǽ��˥���󥰤ò¤¹¤ë¥¤ï¿½ó¥¿¥Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ -.Sh �� -.Cd cpu \&"I586_CPU\&" -.Cd cpu \&"I686_CPU\&" -.Cd options PERFMON -.Sh ���� -.Nm perfmon -�ɥ饤�Фˤ�� -.Tn Intel -�� -.Tn Pentium -�� -.Tn "Pentium Pro" -�� -CPU ��������ǽ��˥���󥰵�ǽ�˥��������Ǥ��ޤ��� -�����Υץ����å��ˤ�¿�̤ʥ��٥�ȤˤĤ���ȯ������ޤ��� -(CPU ��������Ǥ�) ��³���֤Τɤ��餫��¬�ꤹ��褦������Ǥ��� -2 �Ĥ����������󥿤ȡ�Ʊ���������å��������������� -1 �ĤΥ������륫���󥿤���������Ƥ��ޤ��� -.Nm -�ɥ饤�ФǤϤ����ε�ǽ���Ф��ƥǥХ��������ˤ�륤�󥿥ե��������� -���ޤ��� -.Pp -��ǽ��˥���󥰤ò¤¹¤ë¥«ï¿½ï¿½ï¿½ó¥¿¤Ø¤ï¿½ï¿½ï¿½ï¿½Æ¤Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -�ǥХ������ü�ե������ -.Dq Pa /dev/perfmon -���޲�Ȥ��ƽ�������ޤ��� -���ΥǥХ������󶡤��� -.Xr ioctl 2 -�ꥯ�����Ȥ�¿������ -.Aq Pa machine/perfmon.h -�����������졢���Υե��������ˤ� -.Tn Pentium -�� -.Tn "Pentium Pro" -�ץ����å���ξ���ο����ʥ����󥿤�����⤢��ޤ��� -.Pp -.Sy ���ջ���: -���Ѳ�ǽ�ʥ��٥�Ȥν���ϥץ����å���˰ۤʤ�ޤ��� -���Ѥ���륤�٥�ȥ����ɤ�¬�ꤵ��� CPU �η������Ф��� -Ŭ���Ǥ��뤳�Ȥ��ǧ���뤳�Ȥϥץ�����ޤ���Ǥ�Ǥ��� -.Pp -�ʲ��� -.Xr ioctl 2 -�ꥯ�����Ȥ��������Ƥ��ޤ�: -.Bl -tag -width PMIOTSTAMP -.It Dv PMIOSETUP -.Pq Li "struct pmc" -��¤�Τ��������Ƥ���ѥ�᡼���ȥե饰�ǥ����󥿤����ꤷ�ޤ��� -�ʲ��Υե�����ɤ� -.Li struct pmc -���������Ƥ��ޤ�: -.Bl -tag -width "u_char pmc_eventx" -.It Li "int pmc_num" -���ꤹ�륫�����ֹ�Ǥ��� -.Dv NPMC -(���ߤ� 2) ��꾮�����ʤ���Фʤ�ޤ��� -.It Li "u_char pmc_event" -��˥����٤�����Υ��٥�ȥ����ɤǡ� -.Aq Pa machine/perfmon.h -���������Ƥ��ޤ��� -.It Li "u_char pmc_unit" -���٥�Ȥη����б��������֤Υޥ������ͤǤ� ( -.Tn Intel -��ʸ��ò»²¾ï¿½)�� -.It Li "u_char pmc_flags" -�����󥿤�Ư�����ѹ�����ե饰 (��������) �Ǥ��� -.It Li "u_char pmc_mask" -�����󥿤Υޥ������ͤǤ����Ĥޤꡢ���衢�����ͤϻ��ꤵ�줿���Υ����å� -�ʾ� (���ϰʲ�) �δַ�³���륤�٥�Ȥ˥�����Ȥ����¤���٤˻��Ѥ���뤷������ -�Ǥ��� -.El -.Pp -���Τ褦�� -.Li pmc_flags -���ͤ��������Ƥ��ޤ�: -.Bl -tag -compact -width PMCF_USRxx -.It Dv PMCF_USR -���٥�Ȥ�桼���⡼�ɤǥ�����Ȥ��ޤ��� -.It Dv PMCF_OS -���٥�Ȥò¥«¡ï¿½ï¿½Í¥ï¿½â¡¼ï¿½É¤Ç¥ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Dv PMCF_E -���٥�Ȥ��³���֤ǤϤʤ����ο��ǥ�����Ȥ��ޤ��� -.It Dv PMCF_INV -�����󥿤Υޥ�������Ӥΰ�̣���ž���ޤ��� -.El -.It Dv PMIOGET -.Pq Li "struct pmc" -���ꤵ�줿�����󥿤θ��ߤ�������֤��ޤ��� -.It Dv PMIOSTART -.It Dv PMIOSTOP -.Pq Li int -���ꤷ�������󥿤�ư (���) ���ޤ����ϡ��ɥ������η�٤ˤ�ꡢ�ֹ��� -��ư����ߤò¤·¤Ê¤ï¿½ï¿½ï¿½Ð¤Ê¤ï¿½Þ¤ï¿½ï¿½ï¿½ -(¨���������� 0 ��ɬ���ޤ������� 1 ����ߤ��Ƥ�����ߤ��ʤ���Фʤ�ޤ���)�� -�ɥ饤�ФǤϤ�������� -.Sy �������Ƥ��ޤ��� -(�ȸ����Τâ¾ï¿½ï¿½ï¿½ CPU �ǤϤ�������Ϥʤ��ʤ뤫���Τ�ޤ���)�� -.It Dv PMIORESET -.Pq Li int -���ꤵ�줿�����󥿤� 0 �˥ꥻ�åȤ��ޤ��������󥿤ϥꥻ�åȤ������� -.Dv PMIOSTOP -�ˤ����ߤ���ʤ���Фʤ�ޤ������ƤΥ����󥿤ϼ�ưŪ�� -.Dv PMIOSETUP -�ˤ�äƥꥻ�åȤ���ޤ��� -.It Dv PMIOREAD -.Pq Li "struct pmc_data" -�����󥿤θ��ߤ��ͤ���Ф��ޤ��� -.Li pmc_data -��¤�Τˤϼ��Τ褦�� 2 �ĤΥե�����ɤ��������Ƥ��ޤ�: -.Pp -.Bl -tag -compact -width "quad_t pmcd_value" -.It Li "int pmcd_num" -�ɤ߽Ф������󥿤��ֹ档 -.It Li "int pmcd_value" -64 �ӥåȤ�����դ������Ǥν�λ�͡� -.El -.Pp -���衢 -.Tn "Pentium Pro" -�ץ����å����� -�����󥿤�ľ���ɤ߽Ф��٤� -.Li RDPMC -̿�����ѽ�����ͤˤʤ�Ǥ��礦�� -.It Dv PMIOTSTAMP -.Pq Li "struct pmc_tstamp" -�����ॹ����ץ����󥿤��ɤ߽Ф��ޤ��� -.Li pmc_tstamp -��¤�ΤǤ� 2 �ĤΥե�����ɤ��������Ƥ��ޤ�: -.Pp -.Bl -tag -compact -width "quad_t pmct_value" -.It Li "int pmct_rate" -�����󥿤� MHz �ǤΤ����褽��®�٤Ǥ��� -.It Li "quad_t pmct_value" -64 �ӥå������ǤΥ����󥿤θ��ߤ��ͤǤ��� -.El -.Pp -.Li pmct_rate -�ե�����ɤ�Ϳ�����륫���󥿤�®�٤ϡ� -����������ʻ��䥯���å��οʹԤ��Դ����ʰ٤ˡ� -�����ˤ������ΤǤϤʤ����Ȥ����դ���������ڤǤ��� -���Υե�����ɤˤĤ��Ƥ� -�����å������®�٤�ºݤ�ɽ�������ΤȤ������� -�꤬���꤫����Ŭ�����θ������餤�˹ͤ���٤��Ǥ��� -.El -.Sh ��Ϣ�ե����� -.Bl -tag -compact -width "/usr/include/machine/perfmon.h" -.It Pa /dev/perfmon -�����󥿤ؤ�ʸ�����ǥХ����Υ��󥿥ե����� -.It Pa /usr/include/machine/perfmon.h -��¤�Τȥ��٥�ȥ����ɤ�������Ƥ��륤�󥯥롼�ɥե����� -.It Pa /usr/share/examples/perfmon -���Ƥ� -.Fn ioctl -���ޥ�ɤλ��Ѥ����Ū���㼨��������ץ�Υ����������� -.El -.Sh ��Ϣ���� -.Xr ioctl 2 -.Rs -.%A Intel Corporation -.%B Pentium Pro Family Developer's Manual -.%D January 1996 -.%V vol. 3 -.%O Operating System Writer's Manual -.Re -.\"���������� -.Rs -.%A ����ƥ른��ѥ������� -.%B Pentium Pro �ե��ߥ꡼ �ǥ��٥��åѡ��� �ޥ˥奢�� -.%D January 1996 -.%V ���� -.%O ���ڥ졼�ƥ��� �����ƥ� �饤������ �ޥ˥奢�� -.Re -.\"���������� -.Sh ��� -The -.Nm -�ǥХ����� -.Fx 2.2 -�ǽ��Ƹ���ޤ����� -.Sh ��� -.Nm -�ɥ饤�Ф� -.An Garrett A. Wollman , -MIT Laboratory for Computer Science -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.\"Translated by Tetsuro Furuya <ht5t-fry@asahi-net.or.jp>, Dec. 1999. -.\"ML Checked by Tetsuya Isaki (���ů��) <isaki@net.ipc.hiroshima-u.ac.jp>, -.\" Satoru Koizumi (���� �� )<koizumi@cms.phys.s.u-tokyo.ac.jp> -.\"Final Checked by diff --git a/ja_JP.eucJP/man/man4/man4.i386/pnp.4 b/ja_JP.eucJP/man/man4/man4.i386/pnp.4 deleted file mode 100644 index 98905b0302..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/pnp.4 +++ /dev/null @@ -1,221 +0,0 @@ -.\" pnp(4) - manual page for the scanner device driver `asc' -.\" -.\" -.\" Copyright (c) 1997 Luigi Rizzo -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgements: -.\" This product includes software developed by Luigi Rizzo. -.\" 4. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: pnp.4,v 1.2 1998/03/12 07:30:36 charnier Exp % -.\" -.\" Based on Japanese translation by Yasuhito FUTATSUKI <futatuki@fureai.or.jp> -.\" [man-jp 1426] -.\" $FreeBSD$ -.\" -.Dd September 7, 1997 -.Dt PNP 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm pnp -.Nd PnP �ǥХ����Υ��ݡ��� -.Sh �� -.Cd controller pnp0 -.Sh ���� -.Fx -�� PnP �ǥХ������ݡ��Ȥˤ�äơ��桼���� PnP �����ɤ������ -�������ꤹ�뤳�Ȥ���ǽ�ˤʤ�ޤ����ޤ����ǥХ����ɥ饤�Ф� PnP �����ɤ� -�ѥ�᡼����������ѹ����뤳�Ȥ���ǽ�ˤʤ�ޤ��� -.Pp -��ư�Ƕ������ꤹ�뵡ǽ���Ѥ��뤿��ˤϡ������ͥ�� -.Cd options USERCONFIG -�դ��ǥ���ѥ��뤹��ɬ�פ�����ޤ��� -���ΤȤ������ͥ�ϡ�PnP �ǥХ����������Ͽ���뤿��� -������ç¤ï¿½ï¿½ï¿½Î¥Æ¡ï¿½ï¿½Ö¥ï¿½ (�ǥե���Ȥ� 20 ����ȥ�) ����ݤ��ޤ��� -PnP ������ 1 �Ĥ�ʣ������Ω�����ǥХ������鹽������Ƥ��� -���Ȥ⤢��ޤ� (5 �� 6 �Ĥ⤢��Ȥ������Ȥϰ۾�ǤϤ���ޤ���)�� -.Pp -�����ͥ�� -.Dq Fl c -�ե饰�դ��ǥ֡��Ȥ��뤳�Ȥǡ� -PnP �����ɤ������ѹ��Υ��ޥ�ɤ���ѤǤ��ޤ������ޥ�ɤ� -.Dl pnp CSN LDN -�Ȥ����������󥹤���Ϥޤ�ޤ��������ǡ�CSN �ʤ�Ӥ� LDN �� -���줾�졢�ǥХ����˿����Ƥ��륫���������ֹ� -.Pq Card Select Number -����������ǥХ����ֹ� -.Pq Logiacal Device Number -�Ǥ��� -���Υ������󥹤�³���ơ��ʲ��Υ��ޥ�ɤ�Ǥ�դ��Ȥ߹�碌���Ȥ��ޤ��� - -.Bl -tag -width "mmmmmmmmmm"" -.It Dv irqN Ar line -�����ɾ�γ����� 0 �ޤ��� 1 -.Pq ����: N �ǻ��� -�˻��Ѥ��� IRQ �������ꤷ�ޤ��� -.Ar line -�� 0 ����ꤹ�뤳�Ȥϡ�IRQ ������Ѥ��ʤ����Ȥ��̣���ޤ��� -.It Dv drqN Ar n -�����ɾ�� DMA 0 �ޤ��� 1 -.Pq ����: N �ǻ��� -�˻��Ѥ��� DRQ ����ͥ�����ꤷ�ޤ��� -����ͥ�� 4 ����ꤹ�뤳�Ȥϡ�����ͥ����Ѥ��ʤ����Ȥ��̣���ޤ��� -.It Dv portN Ar address -N ���ܤΥݡ����ΰ� -.Pq port's range -�δ��쥢�ɥ쥹 -.Pq base address -�����ꤷ�ޤ� (N=0..7)�� -.Ar address -�� 0 ����ꤹ�뤳�Ȥϡ��ݡ��Ȥ���Ѥ��ʤ����Ȥ��̣���ޤ��� -.It Dv memN Ar address -N ���ܤΥ����ΰ� -.Pq memory's range -�δ��쥢�ɥ쥹 -.Pq base address -�����ꤷ�ޤ� (N=0..3)�� -.Ar address -�� 0 ����ꤹ�뤳�Ȥϡ������ΰ����Ѥ��ʤ����Ȥ��̣���ޤ��� -.It Dv bios -PnP �ǥХ���������Ȥ��ơ�BIOS �����ꤷ����Τ���Ѥ��ޤ��� -����ϥǥե���ȤǤ��ꡢ -BIOS �� PnP �ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤ï¿½ï¿½Ì¾ï¿½Ï¤ï¿½ï¿½ï¿½Ç¤è¤¤ï¿½Ç¤ï¿½ï¿½ç¤¦ï¿½ï¿½ -BIOS �������Ѥ�����ˤ� -.Dq Dv flags -�ʳ��Υѥ�᡼����̵�뤵��ޤ��� -.It Dv os -PnP �ǥХ���������ˡ����Υ���ȥ�ǻ��ꤷ����Τ���Ѥ��ޤ��� -.It Dv enable -PnP �ǥХ�����Í���ˤ��ޤ��� -.It Dv disable -PnP �ǥХ�����̵���ˤ��ޤ��� -.It Dv delete -�ǥХ����˻��Ѥ���Ƥ��륨��ȥ����������̤� CSN/LDN ���Ȥ���� -¾�ΥǥХ����ǻ��ѤǤ���褦�ˤ��ޤ��� -.It Dv flags -�ǥХ����ɥ饤�Ф��Ϥ� 32 �ӥåȤ� flags ����ȥ���ͤ����ꤷ�ޤ��� -flags �ϡ����̤�ư��⡼�ɤ���ꤹ��Τ˻Ȥ��뤳�Ȥ�����ޤ��� -(�㤨�С������Υ�����ɥ����ɤ� SB �� WSS �Υ��ߥ�졼������ -�ڤ��ؤ��롢�ʤ�) -.El -.Pp -���ߤΥơ��֥���������ͤϡ�userconfig �� -.Ic ls -���ޥ�ɤ�ɽ������ޤ��� -���Υơ��֥�ϡ��桼�����Ԥʤä��ѹ��˲ä��� -PnP �ǥХ����ɥ饤�Ф����������������٤Ƥ������ǥХ����Υ���ȥ�� -�ݻ����ޤ��� -.Pp -�ơ��֥���ѹ���̤ϡ� -.Xr dset 8 -���ޥ�ɤˤ�äƥե����륷���ƥ��Υ֡��ȥ��᡼������¸����ޤ��� -.Pq ����: �����ͥ�� ELF ���ˤ�� dset ���ޥ�ɤ��ѻߤ���ޤ��� -.Pp -.Sh PnP �ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½ï¿½Ç¥Ð¥ï¿½ï¿½ï¿½ï¿½É¥é¥¤ï¿½ï¿½ -�����ͥ�� PnP �ǥХ�����ưŪ��ǧ���������ꤷ�ޤ��� -PnP �ǥХ����ϰʲ��Υǡ�����¤�Ǽ��̤��ޤ��� -.Bd -literal -struct pnp_device { - char *pd_name; - char *(*pd_probe ) (u_long csn, u_long vendor_id); - void (*pd_attach ) (u_long csn, u_long vend_id, char * name, - struct isa_device *dev); - u_long *pd_count; - u_int *imask; - struct isa_device dev; -}; -.Ed -.Pp -�ץ����� (probe) �롼����ϡ��Ϥ���� vendor_id ����ʬ�� -ǧ�������ΤǤ��뤫�� -���������ɬ�פʥǥХ�����Í���ˤʤäƤ��뤫������å����� -������� -���Ԥ������ˤ� NULL �ͤ������������ˤ� NULL �Ǥʤ��� -(���̤˥ǥХ���̾��ؤ��ݥ���) ���֤��ޤ��� -�ץ����֥롼������ˤ����ơ������ǥХ�����Í���Ǥ��뤫�ɤ����� -�����å��ˤϡ� -.Fn read_pnp_parms -����ѤǤ��ޤ��� -.Pp -�����å� (attach) �롼����ϡ� -PnP �����ɤ� ISA ����������ǽ�ˤ��롢 -�����������롢�ǥХ����� ISA �ɥ饤�Ф�Ƥ֡� -�Ȥ��ä�ɬ�פʽ�����ò¤¹¤Ù¤Æ¹Ô¤ï¿½ï¿½ï¿½ï¿½È¤ï¿½É¬ï¿½×¤Ç¤ï¿½ï¿½ï¿½ -.Pp -���Υ롼����ȥǡ�����¤�����ѤǤ��ޤ��� -.Bl -tag -width "xxxxxxxxxx" -.It Dv struct pnp_cinfo -���Υǡ�����¤ -.Po -.Pa /usr/i386/isa/pnp.h -���������Ƥ��� -.Pc -�ϡ� -PnP �����ǥХ����˴�Ϣ���뤹�٤Ƥξ����ޤ�Ǥ��ޤ��� -.It Fn read_pnp_parms "struct pnp_cinfo *d" "int ldn" -���δؿ����׵ᤵ�줿�����ǥХ�����������֤��ޤ��� -���δؿ��ϥץ����֤���ӥ����å��� -�롼���󤫤�ƤФ�뤳�Ȥ��������ꤷ�Ƥ��뤿�ᡢ -CSN ����ꤹ�뤳�ȤϤǤ��ޤ��� -.It Fn write_pnp_parms "struct pnp_cinfo *d" "int ldn" -���δؿ����׵ᤵ�줿�����ǥХ����Υѥ�᡼�������ꤷ�ޤ��� -Ʊ���ˡ������ͥ�ζ��������ѥơ��֥�Υ���ȥ�ò¹¹¿ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -BIOS �� (userconfig ����Ѥ���) �桼���������� -�ɤ��ѥ�᡼�������ꤹ�٤�����褯�ΤäƤ���Ϥ��ʤΤǡ� -�ǥХ����ɥ饤�Ф��̾�ǥХ�����������ѹ����٤��Ǥ� -.Em ����ޤ��� -�äˡ� -userconfig �ˤ�붯������ᥫ�˥������þ�����Ƥ��ޤ����ᡢ -̵���ˤʤäƤ��������ǥХ����� -.Em Í���ˤ��ƤϤʤ�ޤ��� -�ǥХ����ɥ饤�Ф������ǥХ�����ݡ����ΰ�ʤɤ�̵���ˤ��Ƥ� -���ޤ��ޤ��󤬡�����ϡ� -����ΥǥХ�����ѥ�᡼��������òµ¯¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½ï¤«ï¿½Ã¤Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -�¤�٤��Ǥ��� -.It Fn enable_pnp_card void -���δؿ��ϥ����å��롼���������� -.Em �Τߡ� -�����ɤ� ISA �ݡ���/����Υ��ɥ쥹�ΰ�˥��������������� -.Em �ƤФʤ���Фʤ�ޤ��� -.El -.Pp -.Sh ��Ϣ���� -.Xr dset 8 -.Pq ����: �ѻߤ���ޤ��� -.Sh �Х� -�ӥ��奢�륳��ե�����졼�����ˤϡ�PnP �ǥХ�������Υ��ݡ��Ȥ� -����ޤ��� -userconfig �Υ��ޥ�ɤ� PnP �ǥХ����������������뤳�Ȥ��Ǥ���� -�����餷�����ȤǤ��礦�� -.Sh ��� -PnP ���ݡ��Ȥ� -.An Sujal Patel -�����˼�ݤ�����Τò¸µ¤Ë¡ï¿½ -.An Luigi Rizzo -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.Sh ��� -.Nm -�� -.Fx 2.2.5 -�˽����о줷�ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/scd.4 b/ja_JP.eucJP/man/man4/man4.i386/scd.4 deleted file mode 100644 index e730f7b6e8..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/scd.4 +++ /dev/null @@ -1,65 +0,0 @@ -.\" -.\" Copyright (c) 1995 Jordan K. Hubbard -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software withough specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: scd.4,v 1.6 1998/03/12 07:30:37 charnier Exp % -.\" $FreeBSD$ -.\" -.Dd January 1, 1995 -.Dt SCD 4 i386 -.Os FreeBSD 2.0.5 -.Sh ̾�� -.Nm scd -.Nd Sony CDU31/33 CD-ROM �ɥ饤�� -.Sh �� -.Cd "device scd0 at isa? port 0x230 bio" -.Sh ���� -.Nm scd -�ɥ饤�Ф� Sony CDU31 �ڤ� CDU33A CD-ROM �ɥ饤�֤��Ф��� -�ǡ������󥿥ե��������󶡤��ޤ��� -�ɥ饤�֤ϡ� -Sony ��Í�Υ��󥿥ե����������ɤ��ߴ������ɤ���³����ɬ�פ�����ޤ��� -.Sh ��Ϣ�ե����� -.Bl -tag -width /dev/[r]scd0a -compact -.It Pa /dev/[r]scd0a -�ǥ�������� BSD �ѡ��ƥ������˥����������ޤ����̾CDROM �ǥ����� -��ˤ�ñ��Υե����륷���ƥ�Τ�¸�ߤ��ޤ��� -.It Pa /dev/[r]scd0c -raw �ǥХ����˥����������ޤ��� -.Sh ��Ϣ���� -.Pa /sys/i386/isa/scd.c -.Sh ��� -�ܥɥ饤�Фϡ� -.An Holger Veit -�� -.An Brian Moore -����£���������ɤ��Ѥ��ơ� -.An Mikael Hybsch -���ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ -.Sh ��� -.Nm scd -�ɥ饤�Ф� -.Fx 2.0.5 -�Ǻǽ���о줷�ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/spkr.4 b/ja_JP.eucJP/man/man4/man4.i386/spkr.4 deleted file mode 100644 index 0e702a1c9d..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/spkr.4 +++ /dev/null @@ -1,234 +0,0 @@ -.\" -.\" %Id: spkr.4,v 1.10 1998/03/12 07:30:38 charnier Exp % -.\" $FreeBSD$ -.\" -.Dd November 7, 1993 -.Dt SPKR 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm speaker , -.Nm spkr -.Nd ���󥽡��륹�ԡ����ΥǥХ����ɥ饤�� -.Sh �� -.Cd pseudo-device speaker -.Fd #include <machine/speaker.h> -.Sh ���� -���ԡ����ǥХ����ɥ饤�Фϡ� -.Tn FreeBSD -�����äƤ��� -.Tn IBM-PC -�ߴ� PC ��ǡ� -���ץꥱ������󤬥��󥽡��륹�ԡ���������Ǥ���褦�ˤ��ޤ��� -.Pp -�����ʤ�Ȥ��Ǥ⡢���ΥǥХ����ò¥ª¡ï¿½ï¿½×¥ï¿½Ç¤ï¿½ï¿½ï¿½Î¤ï¿½ -���� 1 �ĤΥץ����������Ǥ��� -���Τ��ᡢ���ΥǥХ����Υ��å��Ȳ����ˤϡ� -.Xr open 2 -�� -.Xr close 2 -����Ѥ��ޤ��� -¾�Υץ��������ǥХ��������ꤷ�Ƥ�����˥����ץ󤷤褦�Ȥ���ȡ� -.Er EBUSY -���顼�ò¼¨¤ï¿½ï¿½ï¿½ -1 ���֤��ޤ��� -�ǥХ����ؤνñ¤¹ï¿½ï¿½ß¤Ï¡ï¿½ ASCII ʸ����ñ��˥���ǥ���ɽ������ -����ʸ���� (`play string') �Ȥ��Ʋ�ᤵ��ޤ��� -.Xr ioctl 2 -�ꥯ�����Ȥˤ��Ǥ�դμ��ȿ���ȯ���⥵�ݡ��Ȥ���Ƥ��ޤ��� -.Pp -ȯ�����뤳�Ȥǥץ����å������ꤹ�뤳�ȤϤ���ޤ��� -�ºݤˤϡ��ɥ饤�Ф� PC �ϡ��ɥ�����������ȯ���Ƥ���֤� -�ۤȤ�ɤλ��֤ò¥¹¥ê¡¼ï¿½×¤ï¿½ï¿½ï¿½ï¿½Ô¤Ã¤Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -¾�Υץ������ϥɥ饤�Ф����äƤ���֤˥ӡ��פ��Ĥ餹���Ȥ��Ǥ��ޤ��� -.Pp -���ץꥱ�������ϡ����ԡ����Υե����ëµï¿½Ò»Ò¤ï¿½ï¿½Ð¤ï¿½ï¿½ï¿½ -.Xr ioctl 2 -�ƤӽФ��ò¤¹¤ë¤³ï¿½È¤Ë¤ï¿½ê¡¢ï¿½ï¿½ï¿½Ô¡ï¿½ï¿½ï¿½ï¿½É¥é¥¤ï¿½Ð¤ï¿½Ä¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç½ï¿½Ç¤ï¿½ï¿½ï¿½ -.Xr ioctl 2 -���󥿥ե������ˤĤ��Ƥ������ -.Pa /usr/include/machine/speaker.h -�ˤ���ޤ��� -�����θƤӽФ��˻Ȥ��� -.Li tone_t -��¤�Τˤϡ� -���ȿ� (�إ��) �Ȼ�³���� (1/100 ��ñ�̤�) ����ꤹ�� -2 �ĤΥե�����ɤ�����ޤ��� -���ȿ� 0 �ϡ�����Ȳ�ᤵ��ޤ��� -.Pp -���ߤ��Τ褦�� -.Xr ioctl 2 -�ƤӽФ��� 2 �Ĥ���ޤ��� -.Dv SPKRTONE -�ϡ��� 3 ������� tone ��¤�ΤؤΥݥ��� 1 �Ĥ������ꡢ -�������դ��ޤ��� -.Dv SPKRTUNE -�ϡ�ñ��� tone ��¤���������Ƭ�ؤΥݥ��� 1 �Ĥ������ꡢ -��������֤˱��դ��ޤ��� -�����������������³���� 0 �Υ��Фǽ��äƤ��뤳�Ȥ�ɬ�פǤ��� -.Pp -����ʸ����θ�ˡ�� -.Tn IBM -Advanced BASIC 2.0 �� PLAY ʸ�ν��������路�Ƥ��ޤ��� -PLAY ʸ�� -.Li MB , -.Li MF , -.Li X -���Ǥϻ�ʬ��Ķ��Ǥ����Ω���ʤ����������ޤ��� -`�����������ɽ�' ��ǽ�ȥ��顼����Ͽ������ɲä��줿��ΤǤ��� -.Pp - 7 ���������� 84 �������Ѳ�ǽ�� 1-84 ���ֹ椬�Ĥ��Ƥ��ޤ��� -.\" ��ʸ�Ǥ� 1-83 �ȤʤäƤ��롣 send-pr �Ѥߡ� -���줾��Υ��������֤� C ���� B �ޤ�³���Ƥ��� 0-6 ���ֹ椬�Ĥ��Ƥ��ޤ��� -������ A440 �˹�碌��ĴΧ����Ƥ��ơ����������� 3 �Ͽ���� C ����Ϥޤ�ޤ��� -�ǥե���ȤǤϱ��յ�ǽ��Ⱦ�äβ����ȯ���������Τ����Ǹ�� 1/16 �äϵ٤ߤޤ��� -.Pp -����ʸ����Ϻ����鱦�ؤȡ����ե��ޥ�ɥ��롼�פ�Ϣ³�Ȥ��Ʋ�ᤵ��ޤ��� -��ʸ����ʸ���϶��̤���ޤ��󡣱��ե��ޥ�ɥ��롼�פϼ����̤�Ǥ�: -.Bl -tag -width CDEFGABxx -.It Li CDEFGAB -A ���� G �ޤǤ�ʸ�����б����벻�ò¸½ºß¤Î¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¤ï¿½ï¿½Ä¤é¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -����ʸ���ˤϥ��ץ����ǡ� # + - �Τ��������줫�ҤȤĤ� -.Dq Em "�׻�����" -��³���뤳�Ȥ��Ǥ��ޤ������Τ����ǽ�� 2 �Ĥϲ���Ⱦ���⤯���� -�Ǹ�Τ�Τϲ���Ⱦ���㤯���ޤ��� -�ޤ�����ʸ���θ�ˤϲ�Ĺ��ɽ���������������� (���) ��Ĥ��뤳�Ȥ�Ǥ��ޤ��� -��Ĺ�ϼ��� L ���ޥ�ɤξ���Ʊ�ͤ˲�ᤵ��ޤ��� -.It Ns Li O Sy n -�⤷ -.Sy n -�������ʤ顢�ʸ�Υ��������֤����ꤷ�ޤ��� -.Sy n -�� -.Li L -�ޤ��� -.Li N -�Τ����줫����ꤹ�뤳�Ȥˤ�ꡢ -�����������ɽ���Í���ޤ���̵���ˤ��뤳�Ȥ��Ǥ��ޤ� -(�ǥե���ȤǤ�̵���Ǥ�)�� -�����������ɽ���Í���ˤʤäƤ�����ϡ�1 �Ȥβ�����᤹��ȡ� -����֤Ǥβ����κ����Ǿ��ˤʤ�褦��ɬ�פ˱����ƥ��������֤��Ѳ����ޤ��� -�������äơ� ``olbc'' �� ``olb>c'' �Τ褦�ˡ� -``olcb'' �� ``olc<b'' �Τ褦�˱��դ���ޤ��� -�����������ɽ��ϡ�> �� < �� O[0123456] ��³����1 ����ˤĤ��Ƥ�̵���Ǥ��� -(�����������ɽ���ǽ�� -.Tn IBM -BASIC �Ǥϥ��ݡ��Ȥ���Ƥ��ޤ���) -.It Li > -���ߤΥ��������֤� 1 �ľ夲�ޤ��� -.It Li < -���ߤΥ��������֤� 1 �IJ����ޤ��� -.It Ns Li N Sy n -���� -.Sy n -����դ��ޤ��� -.Sy n -�� 1 ���� 84 �������ߤβ�Ĺ�ε���Ȥ��� 0 �Ǥ��� -���������³���뤳�Ȥ�Ǥ��ޤ��� -.It Ns Li L Sy n -����β�Ĺ�����ꤷ�ޤ����ǥե���Ȥ� -.Li L4 -�ǡ���ʬ����Ǥ��� -�����ͤ� 1 ���� 64 �ޤǤ�ǧ����ޤ��� -.Li L1 -��������ˡ� -.Li L2 -����ʬ����ˡ� -.Li L4 -�ϻ�ʬ����ˡ��ʤɤ����ꤵ��ޤ��� -.It Ns Li P Sy n -.Sy n -�� -.Ns Li L Sy n -��Ʊ�ͤ˲�ᤷ������Ǥ������������Ĥ��뤳�Ȥ�Ǥ��ޤ��� -.Li ~ -�Ƚñ¤¯¤ï¿½ï¿½È¤ï¿½Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Ns Li T Sy n -1 ʬ������λ�ʬ����ο������ꤷ�ޤ����ǥե���Ȥ� 120 �Ǥ��� -�褯����ƥ�ݤβ���̾: - -.Bd -literal -offset indent - �ƥ�� ʬ��������� -�ȤƤ��٤� Larghissimo - Largo 40-60 - Larghetto 60-66 - Grave - Lento - Adagio 66-76 -�٤� Adagietto - Andante 76-108 -�椯�餤 Andantino - Moderato 108-120 -®�� Allegretto - Allegro 120-168 - Vivace - Veloce - Presto 168-208 -�ȤƤ�®�� Prestissimo -.Ed -.It Li M[LNS] -Ĵ�������ꤷ�ޤ��� -.Li MN -.Ns No ( Li N -������ (normal) �ò¼¨¤ï¿½ï¿½Þ¤ï¿½) ���ǥե���Ȥǡ�����κǸ� 1/8 ��٤ߤޤ��� -�쥬���� (�٤ߤʤ�) �ˤ���ˤ� -.Li ML -�ò¡¢¥ï¿½ï¿½ï¿½ï¿½Ã¥ï¿½ï¿½ï¿½ï¿½ï¿½ (1/4 �٤�) �ˤ���ˤ� -.Li MS -������Ǥ��ޤ��� -.El -.Pp -���� (�Ĥޤ� -.Li CDEFGAB -�ޤ��� -.Li N -���ޥ��ʸ�����롼��) �ˤ��������� (.) ��³���뤳�Ȥ��Ǥ��ޤ��� -.\" dot �Ȥ� . �Ǥ��뤬���ܸ�Ǥ��������ʤ��Ȥ狼��ʤ� -���줾������������ 1 �ĤˤĤ�������β�Ĺ�� 1.5 �ܤˤ��ޤ��� -�������äơ��������椬 1 �ĤĤ�������ϤĤ��Ƥ��ʤ���Τ� 3/2 �β�Ĺ�ˡ� -2 �ĤĤ�������� 9/4 �β�Ĺ�ˡ� -3 �ĤĤ�������� 27/8 �β�Ĺ�ˤʤ�ޤ��� -.Pp -�������������ˤϥ��顼���� (_) ��³���뤳�Ȥ��Ǥ��ޤ��� -����ˤ�äƲ���θ�����ʤ��뾮���ʵ٤ߤ������ơ� -����ò¼¡¤Î²ï¿½ï¿½ï¿½Ë¥ï¿½ï¿½é¡¼ï¿½Ç¤Ä¤Ê¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½(���顼��ǽ�� -.Tn IBM -BASIC �Ǥϥ��ݡ��Ȥ���Ƥ��ޤ���) -.Pp -����ʸ������ζ����ñ�����Ф����Τǡ� -�����ʬ����Τ˻Ȥ����Ȥ��Ǥ��ޤ��� -.Sh �Х� -�����ơ��֥�δݤ�䡢ȯ���ϡ��ɥ������䥿���ޥϡ��ɥ������� -���ܤ� (�ɤ�������٤��θ���Ƥ��ʤ�) �Τ��ᡢ -���������Τ��䥿���ߥ󥰤Ͽ���Ū�˸�̩�ǤϤ���ޤ��� -����Ĵ��Ϥ���ޤ��� -.Pp -2 �İʾ�����������ư���ɸ��Ū�ʲ��ڵ����ȿ�Ǥ��Ƥ��ޤ��� -ɸ��Ū�ˤϡ����줾����������������������Ⱦʬ������Ĺ��Ĺ������ΤǤ��ꡢ -�����ˤ�äƽ������줿�����Ⱦʬ�ǤϤ���ޤ��� -�Ĥޤꡢ�������椬 1 �ĤĤ�������ϤĤ��Ƥ��ʤ���Τ� 3/2 �β�Ĺ�ˡ� -2 �ĤĤ�������� 7/4 �β�Ĺ�ˡ� -3 �ĤĤ�������� 15/8 �β�Ĺ�ˤʤ�ޤ��� -����Ǥ⡢3/2 �ܤˤ������ -.Tn IBM -BASIC �ޥ˥奢��˵�����Ƥ��뤿�ᡢ -�ߴ����Τ���ˤ��Τޤޤˤ��Ƥ��ޤ��� -.Pp -������ (�����ƥ��ʪ�� I/O �֥��å�����Ĺ��) ����ʸ����Ǥϡ� -�֥��å�������ޤ����뤿��ˡ� -����ν�������ͤ������ְ�äƲ�ᤵ��뤳�Ȥ�����ޤ��� -.Sh ��Ϣ�ե����� -.Bl -tag -width /dev/speakerxx -.It Pa /dev/speaker -���ԡ����ǥХ����ե����� -.El -.Sh ��Ϣ���� -.Xr spkrtest 8 -.Sh ��� -.An Eric S. Raymond Aq esr@snark.thyrsus.com -1990 ǯ 6 �� -.Sh �ܿ��� -.An Andrew A. Chernov Aq ache@astral.msk.su -.Sh ��� -.Nm -�ǥХ����� -.Fx 1.0 -�˽����о줷�ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/sr.4 b/ja_JP.eucJP/man/man4/man4.i386/sr.4 deleted file mode 100644 index 04ca6393ff..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/sr.4 +++ /dev/null @@ -1,119 +0,0 @@ -.\" -.\" Copyright (c) 1996 John Hay. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by John Hay. -.\" 4. Neither the name of the author nor the names of any co-contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY John Hay ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL John Hay BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" %Id: sr.4,v 1.10 1998/10/22 14:12:55 bde Exp % -.\" -.\" $FreeBSD$ -.Dd July 4, 1996 -.Dt SR 4 i386 -.Os -.Sh ̾�� -.Nm sr -.Nd Ʊ�� RISCom/N2 / WANic 400/405 �ǥХ����ɥ饤�� -.Sh �� -.Cd "device sr0 at isa? port 0x300 net irq 10 iomem 0xd0000" -.Cd "device sr1 at isa? port 0x310 net irq 11 flags 0x1 iomem 0xd0000" -.Pp -.Cd "pseudo-device sppp" -.Sh ���� -.Nm sr -�ɥ饤�Фϡ�HD64570 ���åפ���Ѥ����� -RISCom/N2 ISA �����ɤ� WANic 400/405 PCI �����ɤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -��󥯥�٥���ؤˡ�ɸ��� -.Tn FreeBSD -sppp �����ɤ���Ѥ��ޤ��� -�ǥե���ȤΥץ��ȥ���� PPP �Ǥ��� -Cisco HDLC �ץ��ȥ���� -.Xr ifconfig 8 -�� -.Em link2 -���ɲä��뤳�Ȥˤ�äƻ��ѤǤ��ޤ��� -.Pp -.Em flags -�ե�����ɤϾ�ά��ǽ�Ǥ�����ά������硢�ɥ饤�Фϼ��Τ褦�˲��ꤷ�ޤ�: -.Pp -.Bl -hang -offset indent -.It "�����ɤˤ� 2 �ݡ��Ȥ���ޤ���" -.It "���ꥢ��ݡ��ȤΥ����å��ϳ����Τ�Τ���Ѥ��Ƥ��ꡢ" -�����ȼ����Υ����å���Ʊ���Ǥ��� -.El -.Pp -.Em flags -�ϥӥåȥե�����ɤǤ��ꡢ�ǥե���Ȱʳ���ư��ò¤µ¤ï¿½ï¿½ë¤¿ï¿½ï¿½Ë»ï¿½ï¿½Ñ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -.Bl -hang -offset indent -.It Em 0x01 -�����ɤˤ� 1 �ݡ��Ȥ�������ޤ��� -.It Em 0x10 -�ݡ��� 0 �ǡ������ȼ������̡��γ��������å�����Ѥ��ޤ��� -.It Em 0x40 -�ݡ��� 1 �ǡ������ȼ������̡��γ��������å�����Ѥ��ޤ��� -.El -.Pp -.Sh �ֹ� -�����ͥ�����ե�����Ǥϡ���������� 1 �ԤΤߤ�ɬ�פǤ��� -�ǽ�Υ����ɤΥݡ��Ȥ� sr0 ���鿶���ޤ��� -���Υ����ɤ��ֹ�ϡ��ǽ�Υ����ɤν��ä��꤫��³�����ޤ��� -�Ĥޤꡢ�⤷�ǽ�Υ����ɤ� 2 �ݡ��ȤΥ����ɤʤ顢���Υ����ɤ� sr0 �� sr1 -��Ȥ��ޤ��������Ƽ��Υ����ɤ� sr2 ����Ϥޤ�ޤ��� -.Pp -�����ɤ� IRQ 3, 4, 5, 7, 10, 11, 12, 15 �Τߤò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -iomem �ΰ�ϡ�16Kb �֥��å��Ǥ��ꡢ16Kb ��������Ϥޤ�ɬ�פ�����ޤ��� -.Pp -.Sh ���� -.Bl -diag -.It "sr%d: Warning illegal interrupt %d." -�����ɤ����ꤵ�줿�����ߤ���ѤǤ��ޤ���¾�γ����ߤ�����Ǥ��������� -.El -.Sh ��Ϣ�ե����� -.Bl -tag -width /sys/i386/isa/ic/hd64570.h -compact -.It Pa /sys/i386/isa/ic/hd64570.h -.It Pa /sys/i386/isa/if_srregs.h -.It Pa /sys/i386/isa/if_sr.c -.It Pa /sys/pci/if_sr_p.c -.El -.Sh �Х� -�������� X.21 ���󥿥ե��������������Ƥ��ޤ��� -¾�Τ�ΤǤϡ������å����ò¥³¡ï¿½ï¿½É¤ï¿½ï¿½ï¿½Ä´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½É¬ï¿½×¤ï¿½ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ç¤¦ï¿½ï¿½ -.Pp -���Υ����ɤˤϡ������餯��Ŭ����;�Ϥ�����ޤ��� -.Sh ��Ϣ���� -.Xr ar 4 , -.Xr cx 4 , -.Xr netintro 4 , -.Xr ifconfig 8 , -.Xr lsdev 8 -.Sh ��� -.Nm sr -�ǥХ����ɥ饤�Ф� -.An John Hay Aq jhay@FreeBSD.org -���������ޤ����� diff --git a/ja_JP.eucJP/man/man4/man4.i386/vx.4 b/ja_JP.eucJP/man/man4/man4.i386/vx.4 deleted file mode 100644 index 149c73366d..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/vx.4 +++ /dev/null @@ -1,102 +0,0 @@ -.\" -.\" Copyright (c) 1996, Fred Gray -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by David Greenman. -.\" 4. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" %Id: vx.4,v 1.7 1998/03/12 07:30:39 charnier Exp % -.\" $FreeBSD$ -.\" -.Dd January 15, 1996 -.Dt VX 4 i386 -.Os -.Sh ̾�� -.Nm vx -.Nd -PCI �������ͥåȥǥХ����ɥ饤�� -.Sh �� -.Cd "device vx0" -.Sh ���� -.Nm vx -�ɥ饤�Фϡ� -3Com �� 3c590 �� 3c595�����ʤ�� EtherLink III �� Fast EtherLink III �� -PCI �������ͥåȥ����ɤ�10 Mbps �⡼�ɤǥ��ݡ��Ȥ��ޤ��� -���� -.Xr ifconfig 8 -���ޥ�ɤؤ� link �ե饰�ˤ�äơ����Τ������ǽ�Ǥ��� -.Pp -.Bl -tag -width LINK0X -compact -.It Em link0 -AUI �ݡ��Ȥ���Ѥ��ޤ��� -.It Em link1 -BNC �ݡ��Ȥ���Ѥ��ޤ��� -.It Em link2 -UTP �ݡ��Ȥ���Ѥ��ޤ��� -.El -.Sh ���� -.Bl -diag -.It "vx%d: not configured; kernel is built for only %d devices." -�����ƥ�ˤ��륢���ץ������Ф��ơ������ͥ�����ե�������� -�ǥХ���������ʬ�ǤϤ���ޤ��� -����ե�����˥ǥХ������ɲä��� -�����ͥ��ƹ��ۤ��ƥ�֡��Ȥ��Ʋ������� -.Pp -¾�Τ��٤Ƥο��Ǥϥϡ��ɥ����������꤫�ɥ饤�ФΥХ��ò¼¨¤ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Sh �ٹ� -����Τ����Ĥ��� 3c590 �����ɤˤ����꤬���ꡢ -�������դ���ﳲ������ޤ��� -���η�̤Ȥ��ơ��ѥ��å�»��������������ޤ��� -��Ԥϡ�3 Com �����󶡤���������ˡ� -���Τ褦�ʥ�ӥ����θ�����������褦�Ȥ��ޤ����� -�������������ν��Ϥ�����ʬ�ϵ��路���ٹ�ˤ����ޤ��� -.Pp -�����ɤΥХ��ޥ�����󥰵�ǽ����Ѥ��� -�ݡ���󥰥⡼�ɤ� I/O �Τߤ���Ѥ��뤳�Ȥ��顢 -���Υɥ饤�Ф���ǽ�Ϥ����餫���¤���ޤ��� -.Sh �Х� -.Nm vx -�ɥ饤�ФϤ����Ĥ��Υ����ƥ��ǥ��֡��Ȥθ塢�����ץ��������� -�ꥻ�åȤ��ʤ����Ȥ��Τ��Ƥ��ޤ��� -.Pp -.Nm vx -�ɥ饤�Фϡ����ݡ��Ȥ��Ƥ���Ȥ���륫���ɤΤ��٤ƤΥ�ǥ�� -Ű��Ū�˥ƥ��Ȥ�ԤʤäƤ���櫓�ǤϤ���ޤ��� -.Sh ��� -.Nm vx -�ǥХ����ɥ饤�Ф� -.Fx 2.1 -�Ǻǽ���о줷�ޤ����� -����� -.Nm ep -�ɥ饤�Ф�ͳ�褷�Ƥ��ơ�¿�������¤�Ѿ����Ƥ��ޤ��� -.Sh ��� -.Nm vx -�ǥХ����ɥ饤�ФȤ��Υޥ˥奢��ڡ����ϡ� -.An Herb Peyerl -�κ�ȤȤ���¾��¿���οͤα������ -.An Fred Gray Aq fgray@rice.edu -�ˤ�äƽñ¤«¤ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ diff --git a/ja_JP.eucJP/man/man4/man4.i386/wd.4 b/ja_JP.eucJP/man/man4/man4.i386/wd.4 deleted file mode 100644 index d1a7de23c8..0000000000 --- a/ja_JP.eucJP/man/man4/man4.i386/wd.4 +++ /dev/null @@ -1,106 +0,0 @@ -.\" -.\" Copyright (c) 1994 Wilko Bulte -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software withough specific prior written permission -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" %Id: wd.4,v 1.10 1998/10/22 14:12:55 bde Exp % -.\" $FreeBSD$ -.\" -.Dd August 31, 1994 -.Dt WD 4 i386 -.Os FreeBSD -.Sh ̾�� -.Nm wd -.Nd -������ WD100x/IDE �ǥ���������ȥ������ѥɥ饤�� -.Sh �� -.Cd "controller wdc0 at isa? port" \&"IO_WD1\&" bio irq 14 -.Cd "disk wd0 at wdc0 drive 0 -.Cd "disk wd1 at wdc0 drive 1 -.Pp -CMD640b IDE ����ȥ�������: -.Cd "options" \&"CMD640\&" -.Sh ���� -���Υɥ饤�Фǡ�Western Digital WD100x ���꡼���ò¥¨¥ß¥ï¿½ì¡¼ï¿½È¤ï¿½ï¿½ï¿½ -����ȥ��������³���줿�ǥ������˥��������Ǥ���褦�ˤʤ�ޤ��� -����ˤϡ�WD1003 ST412 ����ȥ����顢WD1007 ESDI ����ȥ����顢 -�����ƤۤȤ�ɤΥޥ����ܡ��ɤˤ������Ū�� IDE ����ȥ������ޤߤޤ��� -.Pp -WD100x ���꡼���Ȥθߴ����ˤĤ��Ƥϡ��̾����ȥ�����λ���������������ޤ��� -.Pp -.Ar flags -�ѥ�᡼����Ȥäơ��ɥ饤�Ф˥ҥ�Ȥ����������뤳�Ȥ��Ǥ��ޤ��� -.Pp -16 �ӥå������Υե饰���ɥ饤����ˤ��ꡢ -���줾��� 4 (����: �ºݤˤ� 6) �ĤΥӥåȥե�����ɤ�����ޤ�: -.\" By mzaki@e-mail.ne.jp (Mar 1 1999) -.Bl -tag -width 0x0000 -offset 1c -.It 0x8000 -�ɥ饤�֤� 32 �ӥå�ž����ǽ���Ȥ���лȤ��ޤ��� -.It 0x4000 -�ɥ饤�֤����꡼�ץ⡼�ɤ���æ���Ƥ���Ȥ����Ǥ���褦�ʤ�С� -���𤷤Ƥ���Ȥߤʤ��ƺƽ�������ޤ��� -.It 0x2000 -�Ƕ�� PCI ���åץ��åȤˤ���Х��ޥ��� DMA ��ǽ�����뤫Ĵ�٤����Ѥ��ޤ��� -.It 0x1000 -�ǥե���Ȥ� CHS ���ɥ�å��󥰤ǤϤʤ���LBA ���ɥ�å��󥰤�Ȥ��ޤ��� -.It 0x0f00 -�إåɤο��� ((flags & 0xf00)>>8) �ȸ��ʤ��ơ� -����˹礦�褦�˥���������׻���ľ���ޤ��� -.It 0x00ff -�ɥ饤�֤Υޥ��������ž���⡼�ɤ��Ȥ���лȤ��ޤ��� -����� (flags & 0x00ff) ��������ž�����ߤޤ��� -.El -.Pp -���Υե饰�� drive �Ԥ� 16 �ӥå������ǻ��ꤹ�뤫�� -���뤤�� controller �Ԥ� 32 �ӥå������ǻ��ꤷ�ޤ��� -���ξ�硢��� 16 �ӥåȤ��ֹ���ç¤ï¿½Ê¥É¥é¥¤ï¿½Ö¤ï¿½Å¬ï¿½Ñ¤ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -.Dq Dv CMD640 -���ץ����ˤ�äơ�CMD640b IDE ����ȥ�����η�٤��н褹��褦�ˤʤ�ޤ��� -���Υ��ץ���󤬻��ꤵ��Ƥ��ơ� -���� PCI ���֥����ƥब���Υ��åפò¸¡½Ð¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¤Ï¡ï¿½ -�ץ饤�ޥ�ȥ��������Υ���ȥ������Ʊ���ˤϻȤ��ޤ��� -.Sh ��Ϣ�ե����� -.Bl -tag -width Pa -compact -.It Pa /dev/wd* -�ǥ������Υ֥��å��ǥХ����Ρ��� -.It Pa /dev/rwd* -�ǥ������Υ���饯���ǥХ����Ρ��� -.It Pa /sys/i386/conf/GENERIC -.\" ��ʸ -.\" sample generic kernel config file for (a.o.) wd based systems -.\" �� a.o. �äƤʤ�Ǥ��礦�� -wd �ˤ�륷���ƥ�Τ���Υ����ͥ�å������ͥ������ե�����Υ���ץ� -.It Pa /sys/i386/isa/wd.c -�ɥ饤�ФΥ����� -.El -.Sh ��Ϣ���� -.Xr bad144 8 -.Sh ���� -���Υ���ȥ�����ȥǥ��������ȹ�碌�ϡ� -��ưŪ�˥Хåɥ֥��å�������ò¤¹¤ë¤¿ï¿½ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -�Хåɥ֥��å���Ĵ�٤�ˤ� -.Xr bad144 8 -��¹Ԥ���ɬ�פ�����ޤ��� diff --git a/ja_JP.eucJP/man/man8/man8.i386/apm.8 b/ja_JP.eucJP/man/man8/man8.i386/apm.8 deleted file mode 100644 index 9f963ae745..0000000000 --- a/ja_JP.eucJP/man/man8/man8.i386/apm.8 +++ /dev/null @@ -1,157 +0,0 @@ -.\" LP (Laptop Package) -.\" -.\" Copyright (c) 1994 by Tatsumi Hosokawa <hosokawa@jp.FreeBSD.org> -.\" -.\" This software may be used, modified, copied, and distributed, in -.\" both source and binary form provided that the above copyright and -.\" these terms are retained. Under no circumstances is the author -.\" responsible for the proper functioning of this software, nor does -.\" the author assume any responsibility for damages incurred with its -.\" -.\" %FreeBSD: src/usr.sbin/apm/apm.8,v 1.16.2.5 2002/03/08 12:49:11 keramida Exp % -.\" -.\" use. -.\" -.\" $FreeBSD$ -.Dd November 1, 1994 -.Dt APM 8 -.Os -.Sh ̾�� -.Nm apm , zzz -.Nd APM BIOS �������Ԥ������ξ����ɽ������ -.Sh �� -.Nm -.Op Fl ablstzZ -.Op Fl d Ar enable -.Op Fl e Ar enable -.Op Fl h Ar enable -.Op Fl r Ar delta -.Pp -.Nm zzz -.Sh ���� -.Nm -�ϡ� Intel / Microsoft APM (Advanced Power Management) BIOS �����椷�� -��åץȥå� PC ��� APM �θ��ߤξ��֤�ɽ�����ޤ��� -.Nm zzz -�ϡ� APM ����ˤ�äơ������ƥ�ò¥µ¥ï¿½ï¿½Ú¥ï¿½É¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -�ʲ��Υ��ץ���� -.Nm -�����Ѳ�ǽ�Ǥ� -( -.Nm zzz -�ˤϡ����ץ����Ϥ���ޤ���)�� -���ץ����Ϳ�����ʤ��ä����ϡ� -.Nm -�ϡ����ߤ� APM �ξ��֤������Ĺ�⡼�ɤ�ɽ�����ޤ��� -ʣ����ɽ�����ץ���󤬻��ꤵ�줿��硢 -�����˼������֤��ͤ� 1 �Ԥ� 1 �Ĥ���ɽ�����ޤ��� -.Bl -tag -width indent -.It Fl a -���ߤ� AC �Ÿ��ξ��֤������ͤ�ɽ�����ޤ��� -0, 1�����줾�� -.Dq ����Ƥ��� (off-line) -���֤� -.Dq �Ĥʤ��äƤ��� (on-line) -���֤ò¤¢¤ï¿½ï¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl b -�����ͤǡ����ߤΥХåƥ���֤�ɽ�����ޤ��� -0, 1, 2, 3�Ȥ����ͤϤ��줾�졢 -.Dq �ɹ� (high) -���֡� -.Dq ��Хåƥ� (low) -���֡� -.Dq ���� (critical) -���֡� -.Dq ���� (charging) -���֤ò¤¢¤ï¿½ï¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl d Ar enable -�̾�Υ����ڥ�ɤȥǥ����ץ쥤�Υ����ڥ�ɤ��̤˰���ʤ�/�̤˰����� -�֡����� -.Ar enable -�����椷�ޤ��� -������� Libretto 30CT �� 50CT ��ޤ� -¿��Υ�åץȥåפ�ư��ʤ��褦�Ǥ��� -.It Fl e Ar enable -�֡����Ͱ��� -.Ar enable -�˰�¸���ơ�����ԥ塼���� APM ��ǽ��Í��/̵�����ڤ��ؤ��ޤ��� -.It Fl h Ar enable -�֡����Ͱ��� -.Ar enable -�˰�¸���ơ� -�����ͥ륳��ƥ����ȥ����å��롼������� HLT ̿���Í��/̵�����ڤ��ؤ��ޤ��� -�����Υ��ץ����ϡ��ۤȤ�����Ƥ� APM �μ����ˤ����Ƥ����פǤ����� -.Dq Pa Idle CPU -�ƤӽФ��� CPU �����å��θ�®�� HLT ̿���Ʊ���˼¹Ԥ�����ϡ� -���Υԡ�����ǽ�θ������饷���ƥ��ޤ�뤿��� -.Fl t -���ץ����ɬ�פǤ��� -�ܺ٤ˤĤ��Ƥϡ� -.Xr apm 4 -�ò»²¾È¤ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ -.It Fl l -���ߤΥХåƥ�λĤ����ɽ�����ޤ��� -�⤷�����ʤ��Υ�åץȥåפ����ε�ǽ���󶡤��Ƥ��ʤ����ˤϡ� -255 ��ɽ������ޤ��� -.It Fl r Ar delta -��åץȥåפ����ݡ��Ȥ��Ƥ����硢 -�쥸�塼�०���������åץ����ޤ�Í���ˤ��ޤ��� -����ˤ���åץȥåפ������ڥ�ɤ����櫓�ǤϤ���ޤ��󤬡� -��åץȥåפ������ڥ�ɤ��� -�����ڥ�ɤ���Υ쥸�塼�ब���ݡ��Ȥ���Ƥ����硢 -.Ar delta -�ø�˥�åץȥåפ��쥸�塼�ष�ޤ� -(�����ڥ�ɤ�����������Ȥ���ΤǤϤʤ��� -�ܥ��ޥ�ɤ�¹Ԥ������֤����Ȥ��ޤ�)�� -.It Fl s -APM ���ݡ��Ⱦ��֤������ͤ�ɽ�����ޤ���0, 1 �Ȥ����ͤϤ��줾�졢 -.Dq �����Բ� (disabled) -���� -.Dq ���Ѳ�ǽ (enabled) -���� -�ò¤¢¤ï¿½ï¤·ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl t -�Ĥ�ΥХåƥ���֤�ͽ¬���ơ���ñ�̤�ɽ�����ޤ��� -ʬ����ʤ����ˤ� -1 ��ɽ�����ޤ��� -.It Fl Z -������Х��⡼�ɤ˰ܹԤ��ޤ��� -�ܥ⡼�ɤǤϥե�ѥ�⡼��̤���������ڥ�ɥ⡼�ɰʾ�����Ͼ���Ȥʤ�ޤ��� -�����ޤ⤷���ϥ�󥰥��󥸥��������٥�Ȥˤ�ꡢ -���ξ��֤���쥸�塼�ह�뵡ǽ�ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½ï¿½ï¿½Ã¥×¥È¥Ã¥×¤ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -apm �ν��Ϥˤ�ꡢ��åץȥåפ����ò¥µ¥Ý¡ï¿½ï¿½È¤ï¿½ï¿½ï¿½È¼ï¿½Ä¥ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ë¤«ï¿½ï¿½Ê¬ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.It Fl z -�����ƥ�ò¥µ¥ï¿½ï¿½Ú¥ï¿½É¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï¡ï¿½ -.Nm zzz -�������Ǥ��� -.El -.Sh �Х� -�����Ĥ��� APM �����Ǥϡ� -.Nm -��ɬ�פȤ���ѥ�᡼�����󶡤���Ƥ��ޤ��� -���Τ褦�ʥ����ƥ�˱����Ƥϡ� -.Nm -�ϡ��������Τ�ʤ���ɽ�����ޤ��� -.Pp -�����Ĥ��� APM �����Ǥϡ��Ÿ������å��ò²¡¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¤ä¥«ï¿½Ð¡ï¿½ï¿½ï¿½ -�Ĥ��줿���ȤʤɤΥ��٥�Ȥò°·¤ï¿½ï¿½ï¿½ï¿½È¤ï¿½ï¿½Ç¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -���Τ褦�ʼ����˱����Ƥϡ� -�����ƥ�� -.Nm -�� -.Nm zzz -.Ar ������ -�Ĥ��äƥ����ڥ�ɤ��� -.Ar �٤� -�Ǥ��� -.Sh �� -.Xr apmconf 8 -�� -.Xr apm 8 -�˥ޡ������졢 -.Xr apm 8 -������ǽ���֤������ޤ����� -.Sh ��Ϣ���� -.Xr apm 4 -.Sh ��� -.An Tatsumi Hosokawa Aq hosokawa@jp.FreeBSD.org diff --git a/ja_JP.eucJP/man/man8/man8.i386/apmd.8 b/ja_JP.eucJP/man/man8/man8.i386/apmd.8 deleted file mode 100644 index 1b53302484..0000000000 --- a/ja_JP.eucJP/man/man8/man8.i386/apmd.8 +++ /dev/null @@ -1,293 +0,0 @@ -.\" Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> -.\" Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp> -.\" Copyright (c) 1999 Yoshihiko SARUMARU Aq <mistral@imasy.or.jp> -.\" Copyright (c) 1999 Norihiro Kumagai <kuma@nk.rim.or.jp> -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)apmd.8 1.1 (FreeBSD) 6/28/99 -.\" %FreeBSD: src/usr.sbin/apmd/apmd.8,v 1.7.2.5 2001/08/16 15:55:38 ru Exp % -.\" -.\" $FreeBSD: doc/ja_JP.eucJP/man/man8/apmd.8,v 1.12 2001/08/18 23:50:44 horikawa Exp $ -.\" -.Dd June 28, 1999 -.Dt APMD 8 -.Os -.Sh ̾�� -.Nm apmd -.Nd Advanced Power Management �ƻ�ǡ���� -.Sh �� -.Nm -.Op Fl d -.Op Fl f file -.Op Fl v -.Sh ���� -.Nm -�ϡ����ꤷ�� Advanced Power Management -.Pq Tn APM -���٥�Ȥ�ƻ뤷�� -�����줫�Υ��٥�Ȥ�ȯ��������硢 -�б����륳�ޥ�ɥ������󥹤�¹Ԥ��ޤ��� -����ե�����ǻ��ꤵ�줿���٥�ȤΤߤ� -.Nm -�����Τ��졢����ʳ��Υ��٥�Ȥ�̵�뤵��ޤ��� -APM BIOS �ˤ�ä�ȯ�Ԥ��줿 -���٥�Ȥ��Ф��ơ� -.Nm -������ե�����ǻ��ꤵ�줿���ޥ�ɥ������󥹤�¹Ԥ��ޤ��� -.Nm -�ò¥µ¥ï¿½ï¿½Ú¥ï¿½ï¿½/������Х���ƻ뤹��褦�ˤ��Ƶ�ư����ȡ� -�����ͥ�Ϥ������׵ᥤ�٥�Ȥ��Ф��� -������Ԥ��ޤ��󡣤��Τ��᤽���Υ��٥��ȯ������ -�����ò¤µ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï¡ï¿½Å¬ï¿½Ú¤Ê¥ï¿½ï¿½Þ¥ï¿½É¤Þ¤ï¿½ï¿½ï¿½ï¿½È¤ß¹ï¿½ï¿½ß´Ø¿ï¿½ï¿½ï¿½ -����Ū������ե�����˻��ꤹ��ɬ�פ�����ޤ��� -.Pp -.Nm -�ϰʲ��μ¹Ի����ץ��������ò¤·¤Þ¤ï¿½ï¿½ï¿½ -.Bl -tag -width -f_file -.It Fl d -�ǥХå��⡼�ɤǵ�ư���ޤ��� -�ǡ����⡼�ɤǤϤʤ��ե������饦��ɤ�ư��ޤ��� -.It Fl f Ar file -�ǥե���Ȥ�����ե����� -.Pa /etc/apmd.conf -�����˻��Ѥ��롢�̤�����ե����� -.Ar file -����ꤷ�ޤ��� -.It Fl v -��Ĺ�⡼�ɤ�ư��ޤ��� -.El -.Pp -.Nm -�ϵ�ư��������ե����� -(�ǥե���Ȥ� -.Pa /etc/apmd.conf ) -���ɤ߹��ߡ� -�ƻ뤹�٤����٥�Ȥ� APM �ǥХ����ɥ饤�Ф����Τ��ޤ��� -��λ���ˤ� APM �ǥХ����ɥ饤�Фϥ��٥�Ȥδƻ��ưŪ�˲�����ޤ��� -.Pp -.Nm -�ץ������������ʥ� SIGHUP ���������ȡ�����ե�������ɤ߹���ľ���ơ� -������ѹ����Ƥ� APM �ǥХ����ɥ饤�Ф����Τ��ޤ��� -.Pp -.Nm -�ϡ��ǥХ����ե����� -.Pa /dev/apmctl -���ͳ���ơ����٥�Ȥμ������� APM �����ƥ������Ѥ� -.Xr ioctl 2 -�׵��ȯ�Ԥ��ޤ������ΥǥХ����ե��������¾���椵��ƥ����ץ󤵤�뤿�ᡢ -.Nm -�ץ�������Ʊ���� 1 �ĤΤߵ�ư��ǽ�Ǥ��� -.Pp -.Nm -�� APM ���٥�Ȥ�������ȡ�����ե�����ǻ��ꤵ�줿 -���٥�Ȥ��б����륳�ޥ�ɥꥹ�Ȥ�¹Ԥ��뤿��� -�ҥץ����������������Ƥ� APM ���٥�Ȥ��Ԥ����֤ˤʤ�ޤ��� -�������줿�ҥץ������ϡ� -���ꤵ�줿���ޥ�ɤ� 1 �Ĥ�����󤵤줿���֤˼¹Ԥ��ޤ��� -.Pp -.Nm -�� SUSPEND/STANDBY �׵���Ф��륳�ޥ�ɥꥹ�Ȥ�������Ƥ���֡� -�����ͥ���� APM �ǥХ����ɥ饤�Фϡ�APM BIOS ������ -���� 1 ��ʾ����Τ�ȯ�Ԥ�³���ޤ��� -����ˤ�ä� BIOS �ϡ����ޥ�ɽ�����Ǥ����׵᤬ -�ޤ����뤷�Ƥ��ʤ����Ȥ�ǧ�����ޤ��� -.Pp -.Nm -�ǡ����ϥե����� -.Pa /var/run/apmd.pid -����������ץ����� ID ��Ͽ���ޤ�������� -.Nm -�� kill �䡢����ե�������ɤ߹��ޤ��뤿��˻Ȥ��ޤ��� -.Sh ����ե����� -.Nm -������ե�����ι�¤�����˥���ץ�Ǥ����㤨�м��Τ褦�ˤʤ�ޤ��� -.Pp -.Bd -literal -apm_event SUSPENDREQ { - exec "sync && sync && sync"; - exec "sleep 1"; - exec "zzz"; -} -.Ed -.Pp -������Ǥϡ�APM ���٥�� -.Ql SUSPENDREQ -(�ǥ����ץ쥤���Ĥ������ʤɤ�ȯ�����ޤ�) �� -.Nm -���������ȡ� -.Ql sync -���ޥ�ɤ� 3 ��¹Ԥ��������Ԥä����Ȥ� -.Nm zzz ( Ns Nm apm Fl z ) -��¹Ԥ��ƥ����ƥ�ò¥µ¥ï¿½ï¿½Ú¥ï¿½É¤ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ -.Pp -.Bl -bullet -.It -apm_event ������� -.Bd -ragged -offset indent -.Ql apm_event -�ϥ�����ɤǤ��ꡢ���٥�Ȥ��Ȥ�����γ��Ϥ�ؼ����ޤ��� -.Ed -.It -APM ���٥�� -.Bd -ragged -offset indent -ʣ���Υ��٥�Ȥ��Ф���Ʊ��������¹Ԥ��������ϡ������Υ��٥��̾�� -����ޤǶ��ڤäƻ��ꤷ�ޤ���Í���ʥ��٥��̾�ϼ����̤�Ǥ��� -.Bl -item -.It -- -.Nm -����ư����Ƥ���ȥ����ͥ�Ǥν�����Ԥ�ʤ��ʤ륤�٥��: -.Pp -.Bl -tag -width USERSUSPENDREQ -compact -offset indent -.It STANDBYREQ -.It USERSTANDBYREQ -.It SUSPENDREQ -���ޥ�ɥꥹ�Ȥ� sync ��ޤ�뤳�Ȥò¤ª¤ï¿½ï¿½ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ -.It USERSUSPENDREQ -���ޥ�ɥꥹ�Ȥ� sync ��ޤ�뤳�Ȥò¤ª¤ï¿½ï¿½ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ -.It BATTERYLOW -���ޥ�ɥꥹ�Ȥ� zzz �Τߤò¤ª¤ï¿½ï¿½ï¿½ï¿½á¤·ï¿½Þ¤ï¿½ -.El -.It -- �����ͥ�ν�����λ��� -.Nm -�����Τ���륤�٥��: -.Pp -.Bl -tag -width USERSUSPENDREQ -compact -offset indent -.It NORMRESUME -.It CRITRESUME -.It STANDBYRESUME -.It POWERSTATECHANGE -.It UPDATETIME -.It CAPABILITIESCHANGE -.El -.Pp -�åµï¿½Ê³ï¿½ï¿½Î¥ï¿½ï¿½Ù¥ï¿½È¤ï¿½ -.Nm -�����Τ���ޤ��� -.El -.Ed -.It -���ޥ�ɥ饤��ʸˡ -.Bd -ragged -offset indent -���Ҥ���Ǥϡ� -.Ql exec -����Ϥޤ� 3 �Ԥϥ��٥�Ȥ��Ф��륳�ޥ�ɤǤ��� -���줾��ιԤϥ��ߥ�����ǽ�λ���Ƥ���ɬ�פ�����ޤ��� -���٥�Ȥ��Ф��륳�ޥ�ɥꥹ�Ȥ� -.Ql { -�� -.Ql } -�ǰϤߤޤ��� -.Nm -�ϥ��֥륯�����ơ������ǰϤޤ줿���ޥ�ɤμ¹Ԥ� -.Xr system 3 -��Ʊ�ͤ� -.Pa /bin/sh -����Ѥ��ޤ����ƥ��ޥ�ɤϥ��ޥ�ɥꥹ�ȤκǸ����ã���뤫 0 �ʳ��� -��λ�����ɤǽ����ޤǽ��֤˼¹Ԥ���ޤ��� -.Nm -�ϡ����Ԥ������ޥ�ɤν�λ�����ɤ� -.Xr syslog 3 -��ͳ����𤷤ޤ��� -��� APM BIOS ������׵ᥤ�٥�Ȥ���ä��ޤ��� -.Ed -.It -�Ȥ߹��ߴؿ� -.Bd -ragged -offset indent -���ޥ�ɹԤ����� -.Nm -���Ȥ߹��ߴؿ������Ǥ��ޤ����Ȥ߹��ߴؿ��ϥ��ޥ�ɹԤ�Ʊ�ͤ� -���ߥ�����ǽ�λ���ޤ��������Ȥ߹��ߴؿ������ߥ��ݡ��Ȥ���Ƥ��ޤ��� -.Bl -item -.It -- reject: -.Bd -ragged -offset indent -APM BIOS �����ľ�����׵����ݤ��ޤ����ǥ����ץ쥤���Ĥ�������ȯ���� -�� SUSPEND �׵����ݤ��ơ����� STANDBY ���֤ˤ��������ʤɤ˻��Ѥ� -�ޤ��� -.Ed -.El -.Ed -.El -.Sh ������ -����ե�����Υ���ץ�ˤϡ��ʲ��Τ�Τ��ޤޤ�Ƥ��ޤ��� -.Bd -literal -apm_event SUSPENDREQ { - exec "/etc/rc.suspend"; -} - -apm_event USERSUSPENDREQ { - exec "sync && sync && sync"; - exec "sleep 1"; - exec "apm -z"; -} - -apm_event NORMRESUME, STANDBYRESUME { - exec "/etc/rc.resume"; -} - -# resume event configuration for serial mouse users by -# reinitializing a moused(8) connected to a serial port. -# -#apm_event NORMRESUME { -# exec "kill -HUP `cat /var/run/moused.pid`"; -#} - -# suspend request event configuration for ATA HDD users: -# execute standby instead of suspend. -# -#apm_event SUSPENDREQ { -# reject; -# exec "sync && sync && sync"; -# exec "sleep 1"; -# exec "apm -Z"; -#} -.Ed -.Sh ��Ϣ�ե����� -.Bl -tag -width /etc/apmd.conf -compact -.It Pa /etc/apmd.conf -.It Pa /dev/apmctl -.It Pa /var/run/apmd.pid -.El -.Sh ��Ϣ���� -.Xr apm 4 , -.Xr apm 8 -.Sh ��� -.An Mitsuru IWASAKI Aq iwasaki@FreeBSD.org -.An KOIE Hidetaka Aq koie@suri.co.jp -.Pp -�ޤ��� -.An Warner Losh Aq imp@FreeBSD.org , -.An Hiroshi Yamashita Aq bluemoon@msj.biglobe.ne.jp , -.An Yoshihiko SARUMARU Aq mistral@imasy.or.jp , -.An Norihiro Kumagai Aq kuma@nk.rim.or.jp , -.An NAKAGAWA Yoshihisa Aq nakagawa@jp.FreeBSD.org , -.An Nick Hilliard Aq nick@foobar.org -�ˤ��׸�������ޤ����� -.Sh ��� -.Nm -���ޥ�ɤ� -.Fx 3.3 -�����о줷�ޤ����� diff --git a/share/sgml/freebsd.ent b/share/sgml/freebsd.ent index c2a05a037f..9e5c2fc87f 100644 --- a/share/sgml/freebsd.ent +++ b/share/sgml/freebsd.ent @@ -18,8 +18,8 @@ <!-- The currently released version of FreeBSD. This value is used to create some links on web sites and such, so do NOT change it until it's really release time --> -<!ENTITY rel.current CDATA "4.6.2"> -<!ENTITY rel.current.date CDATA "August, 2002"> +<!ENTITY rel.current CDATA "4.7"> +<!ENTITY rel.current.date CDATA "October, 2002"> <!ENTITY rel.current.notes 'http://www.FreeBSD.org/releases/&rel.current;R/notes.html'> <!ENTITY rel.current.hardware 'http://www.FreeBSD.org/releases/&rel.current;R/hardware.html'> <!ENTITY rel.current.errata 'http://www.FreeBSD.org/releases/&rel.current;R/errata.html'> @@ -28,7 +28,7 @@ <!ENTITY % not.published "IGNORE"> <!-- Number of ports in the ports tree --> -<!ENTITY os.numports "7,000"> +<!ENTITY os.numports "7,600"> <!-- GUI-buttons --> <!ENTITY gui.ok "<guibutton>[ OK ]</guibutton>"> diff --git a/zh/FAQ/FAQ.sgml b/zh/FAQ/FAQ.sgml deleted file mode 100644 index 9bf088483a..0000000000 --- a/zh/FAQ/FAQ.sgml +++ /dev/null @@ -1,70 +0,0 @@ -<!-- $Id: FAQ.sgml,v 1.8 1999-11-12 08:34:11 vanilla Exp $ --> -<!-- The FreeBSD Documentation Project --> -<!-- Translate into Chinese by ijliao@dragon2.net --> -<!-- English Version: 1.103 --> - -<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [ -<!ENTITY % includes SYSTEM "includes.sgml"> %includes; -<!ENTITY preface SYSTEM "preface.sgml"> -<!ENTITY install SYSTEM "install.sgml"> -<!ENTITY hardware SYSTEM "hardware.sgml"> -<!ENTITY troubleshoot SYSTEM "troubleshoot.sgml"> -<!ENTITY commercial SYSTEM "commercial.sgml"> -<!ENTITY applications SYSTEM "applications.sgml"> -<!ENTITY kernelconfig SYSTEM "kernelconfig.sgml"> -<!ENTITY admin SYSTEM "admin.sgml"> -<!ENTITY x SYSTEM "x.sgml"> -<!ENTITY network SYSTEM "network.sgml"> -<!ENTITY serial SYSTEM "serial.sgml"> -<!ENTITY misc SYSTEM "misc.sgml"> -<!ENTITY hackers SYSTEM "hackers.sgml"> -<!ENTITY acknowledgments SYSTEM "acknowledgments.sgml"> -]> - -<article> - - <title>FreeBSD 2.X �`���ݵ���</title> - <author> - <name>FreeBSD ���p�e</name> - </author> - - <date>$Date: 1999-11-12 08:34:11 $</date> - - <abstract> - �o�����O FreeBSD 2.X ���`���ݵ����C���D���S�O�[���A�_�h�o�DZ��س��A - �Ω� FreeBSD 2.0.5 �ΥH�᪺�����C�p�G���ؤ��e���� <XXX> �h�O�|�� - �����������C�p�G�z���U���p�e���i�榳���쪺�ܡA�бH�@�ʹq�l�l��� - FreeBSD ���p�e�� mailing list <htmlurl - url="mailto:freebsd-doc@FreeBSD.org" name="<freebsd-doc@FreeBSD.org>">�C - �z�i�H�q <url url="http://www.FreeBSD.org/" - name="FreeBSD World Wide Web server"> ����o����󪺳̷s�����C�z�]�i�H - �Q�� HTTP �ӤU������� <url url="FAQ.latin1" name="�¤�r��">�A - <url url="FAQ.ps" name="postscript ��">�A - <url url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/FAQ.pdf" name="PDF ��">�A - �άO <url url="FAQ-html.tar.gz" name="HTML ��">�A�άO�g�� - <url url="ftp://ftp.FreeBSD.org/pub/FreeBSD/docs" name="FreeBSD FTP ��"> - �ӤU�� gzip'd �������C�z�γ\�]�Q - <url url="http://www.FreeBSD.org/search/search.html" - name="�b�`���ݵ������j�M���">�C - - </abstract> - - <toc> - -&preface; -&install; -&hardware; -&troubleshoot; -&commercial; -&applications; -&kernelconfig; -&admin; -&x; -&network; -&serial; -&misc; -&hackers; -&acknowledgments; - -</article> - |
