Commit yaboot 1.3.0
authorEthan Benson <erbenson@alaska.net>
Mon, 25 Mar 2002 07:43:37 +0000 (07:43 +0000)
committerEthan Benson <erbenson@alaska.net>
Mon, 25 Mar 2002 07:43:37 +0000 (07:43 +0000)
Commit yaboot 1.3.0.
git-archimport-id: erbenson@alaska.net--public/yaboot--devel--1.3--patch-1

101 files changed:
BUGS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog
INSTALL [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
README.man.patch [new file with mode: 0644]
THANKS [new file with mode: 0644]
TODO [new file with mode: 0644]
changelog [new file with mode: 0644]
doc/README.ofboot [new file with mode: 0644]
doc/README.ofpath [new file with mode: 0644]
doc/README.rs6000 [new file with mode: 0644]
doc/examples/README.dualboot.chrp [new file with mode: 0644]
doc/examples/README.mbicons [new file with mode: 0644]
doc/examples/README.simpleboot.chrp [new file with mode: 0644]
doc/examples/dualboot.chrp [new file with mode: 0644]
doc/examples/large-penguin.mbicon [new file with mode: 0644]
doc/examples/simpleboot.chrp [new file with mode: 0644]
doc/examples/yaboot.conf.multi-boot [new file with mode: 0644]
doc/examples/yaboot.conf.rs6k [new file with mode: 0644]
etc/yaboot.conf [new file with mode: 0644]
first/ofboot [new file with mode: 0644]
include/asm/elf.h [new file with mode: 0644]
include/asm/ppc_asm.tmpl [new file with mode: 0644]
include/asm/processor.h [new file with mode: 0644]
include/bootinfo.h [new file with mode: 0644]
include/byteorder.h [new file with mode: 0644]
include/cfg.h [new file with mode: 0644]
include/cmdline.h [new file with mode: 0644]
include/ctype.h [new file with mode: 0644]
include/et/com_err.c [new file with mode: 0644]
include/et/com_err.h [new file with mode: 0644]
include/ext2fs/bitops.h [new file with mode: 0644]
include/ext2fs/ext2_err.h [new file with mode: 0644]
include/ext2fs/ext2_io.h [new file with mode: 0644]
include/ext2fs/ext2fs.h [new file with mode: 0644]
include/fdisk-part.h [new file with mode: 0644]
include/file.h [new file with mode: 0644]
include/fs.h [new file with mode: 0644]
include/gui.h [new file with mode: 0644]
include/linux/elf.h [new file with mode: 0644]
include/linux/ext2_fs.h [new file with mode: 0644]
include/linux/iso_fs.h [new file with mode: 0644]
include/linux/stat.h [new file with mode: 0644]
include/linux/types.h [new file with mode: 0644]
include/mac-part.h [new file with mode: 0644]
include/md5.h [new file with mode: 0644]
include/partition.h [new file with mode: 0644]
include/prom.h [new file with mode: 0644]
include/reiserfs/reiserfs.h [new file with mode: 0644]
include/setjm2.h [new file with mode: 0644]
include/setjmp.h [new file with mode: 0644]
include/stdlib.h [new file with mode: 0644]
include/string.h [new file with mode: 0644]
include/swab.h [new file with mode: 0644]
include/types.h [new file with mode: 0644]
include/video.h [new file with mode: 0644]
include/yaboot.h [new file with mode: 0644]
lib/ctype.c [new file with mode: 0644]
lib/libext2fs.a [new file with mode: 0644]
lib/malloc.c [new file with mode: 0644]
lib/nosys.c [new file with mode: 0644]
lib/string.S [new file with mode: 0644]
lib/strstr.c [new file with mode: 0644]
lib/strtol.c [new file with mode: 0644]
lib/vsprintf.c [new file with mode: 0644]
man.patch [new file with mode: 0644]
man/bootstrap.8 [new file with mode: 0644]
man/mkofboot.8 [new file with mode: 0644]
man/ofpath.8 [new file with mode: 0644]
man/yaboot.8 [new file with mode: 0644]
man/yaboot.conf.5 [new file with mode: 0644]
man/yabootconfig.8 [new file with mode: 0644]
man/ybin.8 [new file with mode: 0644]
second/cache.S [new file with mode: 0644]
second/cfg.c [new file with mode: 0644]
second/cmdline.c [new file with mode: 0644]
second/crt0.S [new file with mode: 0644]
second/file.c [new file with mode: 0644]
second/fs.c [new file with mode: 0644]
second/fs_ext2.c [new file with mode: 0644]
second/fs_iso.c [new file with mode: 0644]
second/fs_of.c [new file with mode: 0644]
second/fs_reiserfs.c [new file with mode: 0644]
second/gui/colormap.c [new file with mode: 0644]
second/gui/effects.c [new file with mode: 0644]
second/gui/pcx.c [new file with mode: 0644]
second/gui/video.c [new file with mode: 0644]
second/iso_util.c [new file with mode: 0644]
second/md5.c [new file with mode: 0644]
second/partition.c [new file with mode: 0644]
second/prom.c [new file with mode: 0644]
second/setjmp.S [new file with mode: 0644]
second/yaboot.c [new file with mode: 0644]
util/addnote.c [new file with mode: 0644]
util/elfextract.c [new file with mode: 0644]
ybin/mkofboot [new symlink]
ybin/ofpath [new file with mode: 0755]
ybin/yabootconfig [new file with mode: 0755]
ybin/ybin [new file with mode: 0755]

diff --git a/BUGS b/BUGS
new file mode 100644 (file)
index 0000000..b33068d
--- /dev/null
+++ b/BUGS
@@ -0,0 +1 @@
+Bugs? what bugs? if you find one let me know. send to: erbenson@alaska.net
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
index 50a963859dc109eef1d0b6b3201426318d78780f..f096b152f0e6a384e2974fd0a7c02feaafec3216 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,3 +2,144 @@
 # tag: automatic-ChangeLog--erbenson@alaska.net--public/yaboot--devel--1.3
 #
 
 # tag: automatic-ChangeLog--erbenson@alaska.net--public/yaboot--devel--1.3
 #
 
+2002-03-25 07:43:37 GMT        Ethan Benson <erbenson@alaska.net>      patch-1
+
+    Summary:
+      Commit yaboot 1.3.0
+    Revision:
+      yaboot--devel--1.3--patch-1
+
+    Commit yaboot 1.3.0.
+
+    new files:
+     .arch-ids/BUGS.id .arch-ids/COPYING.id .arch-ids/INSTALL.id
+     .arch-ids/Makefile.id .arch-ids/README.id
+     .arch-ids/README.man.patch.id .arch-ids/THANKS.id
+     .arch-ids/TODO.id .arch-ids/changelog.id doc/.arch-ids/=id
+     doc/.arch-ids/README.ofboot.id doc/.arch-ids/README.ofpath.id
+     doc/.arch-ids/README.rs6000.id doc/examples/.arch-ids/=id
+     doc/examples/.arch-ids/README.dualboot.chrp.id
+     doc/examples/.arch-ids/README.mbicons.id
+     doc/examples/.arch-ids/README.simpleboot.chrp.id
+     doc/examples/.arch-ids/dualboot.chrp.id
+     doc/examples/.arch-ids/large-penguin.mbicon.id
+     doc/examples/.arch-ids/simpleboot.chrp.id
+     doc/examples/.arch-ids/yaboot.conf.multi-boot.id
+     doc/examples/.arch-ids/yaboot.conf.rs6k.id etc/.arch-ids/=id
+     etc/.arch-ids/yaboot.conf.id first/.arch-ids/=id
+     first/.arch-ids/ofboot.id include/.arch-ids/=id
+     include/asm/.arch-ids/=id include/asm/.arch-ids/elf.h.id
+     include/asm/.arch-ids/ppc_asm.tmpl.id
+     include/asm/.arch-ids/processor.h.id
+     include/.arch-ids/bootinfo.h.id
+     include/.arch-ids/byteorder.h.id include/.arch-ids/cfg.h.id
+     include/.arch-ids/cmdline.h.id include/.arch-ids/ctype.h.id
+     include/et/.arch-ids/=id include/et/.arch-ids/com_err.c.id
+     include/et/.arch-ids/com_err.h.id include/ext2fs/.arch-ids/=id
+     include/ext2fs/.arch-ids/bitops.h.id
+     include/ext2fs/.arch-ids/ext2_err.h.id
+     include/ext2fs/.arch-ids/ext2_io.h.id
+     include/ext2fs/.arch-ids/ext2fs.h.id
+     include/.arch-ids/fdisk-part.h.id include/.arch-ids/file.h.id
+     include/.arch-ids/fs.h.id include/.arch-ids/gui.h.id
+     include/linux/.arch-ids/=id include/linux/.arch-ids/elf.h.id
+     include/linux/.arch-ids/ext2_fs.h.id
+     include/linux/.arch-ids/iso_fs.h.id
+     include/linux/.arch-ids/stat.h.id
+     include/linux/.arch-ids/types.h.id
+     include/.arch-ids/mac-part.h.id include/.arch-ids/md5.h.id
+     include/.arch-ids/partition.h.id include/.arch-ids/prom.h.id
+     include/reiserfs/.arch-ids/=id
+     include/reiserfs/.arch-ids/reiserfs.h.id
+     include/.arch-ids/setjm2.h.id include/.arch-ids/setjmp.h.id
+     include/.arch-ids/stdlib.h.id include/.arch-ids/string.h.id
+     include/.arch-ids/swab.h.id include/.arch-ids/types.h.id
+     include/.arch-ids/video.h.id include/.arch-ids/yaboot.h.id
+     lib/.arch-ids/=id lib/.arch-ids/ctype.c.id
+     lib/.arch-ids/libext2fs.a.id lib/.arch-ids/malloc.c.id
+     lib/.arch-ids/nosys.c.id lib/.arch-ids/string.S.id
+     lib/.arch-ids/strstr.c.id lib/.arch-ids/strtol.c.id
+     lib/.arch-ids/vsprintf.c.id man/.arch-ids/=id
+     man/.arch-ids/bootstrap.8.id man/.arch-ids/mkofboot.8.id
+     man/.arch-ids/ofpath.8.id man/.arch-ids/yaboot.8.id
+     man/.arch-ids/yaboot.conf.5.id man/.arch-ids/yabootconfig.8.id
+     man/.arch-ids/ybin.8.id .arch-ids/man.patch.id
+     second/.arch-ids/=id second/.arch-ids/cache.S.id
+     second/.arch-ids/cfg.c.id second/.arch-ids/cmdline.c.id
+     second/.arch-ids/crt0.S.id second/.arch-ids/file.c.id
+     second/.arch-ids/fs.c.id second/.arch-ids/fs_ext2.c.id
+     second/.arch-ids/fs_iso.c.id second/.arch-ids/fs_of.c.id
+     second/.arch-ids/fs_reiserfs.c.id second/gui/.arch-ids/=id
+     second/gui/.arch-ids/colormap.c.id
+     second/gui/.arch-ids/effects.c.id
+     second/gui/.arch-ids/pcx.c.id second/gui/.arch-ids/video.c.id
+     second/.arch-ids/iso_util.c.id second/.arch-ids/md5.c.id
+     second/.arch-ids/partition.c.id second/.arch-ids/prom.c.id
+     second/.arch-ids/setjmp.S.id second/.arch-ids/yaboot.c.id
+     util/.arch-ids/=id util/.arch-ids/addnote.c.id
+     util/.arch-ids/elfextract.c.id ybin/.arch-ids/=id
+     ybin/.arch-ids/mkofboot.id ybin/.arch-ids/ofpath.id
+     ybin/.arch-ids/yabootconfig.id ybin/.arch-ids/ybin.id BUGS
+     COPYING INSTALL Makefile README README.man.patch THANKS TODO
+     changelog doc/README.ofboot doc/README.ofpath
+     doc/README.rs6000 doc/examples/README.dualboot.chrp
+     doc/examples/README.mbicons
+     doc/examples/README.simpleboot.chrp doc/examples/dualboot.chrp
+     doc/examples/large-penguin.mbicon doc/examples/simpleboot.chrp
+     doc/examples/yaboot.conf.multi-boot
+     doc/examples/yaboot.conf.rs6k etc/yaboot.conf first/ofboot
+     include/asm/elf.h include/asm/ppc_asm.tmpl
+     include/asm/processor.h include/bootinfo.h include/byteorder.h
+     include/cfg.h include/cmdline.h include/ctype.h
+     include/et/com_err.c include/et/com_err.h
+     include/ext2fs/bitops.h include/ext2fs/ext2_err.h
+     include/ext2fs/ext2_io.h include/ext2fs/ext2fs.h
+     include/fdisk-part.h include/file.h include/fs.h include/gui.h
+     include/linux/elf.h include/linux/ext2_fs.h
+     include/linux/iso_fs.h include/linux/stat.h
+     include/linux/types.h include/mac-part.h include/md5.h
+     include/partition.h include/prom.h include/reiserfs/reiserfs.h
+     include/setjm2.h include/setjmp.h include/stdlib.h
+     include/string.h include/swab.h include/types.h
+     include/video.h include/yaboot.h lib/ctype.c lib/libext2fs.a
+     lib/malloc.c lib/nosys.c lib/string.S lib/strstr.c
+     lib/strtol.c lib/vsprintf.c man/bootstrap.8 man/mkofboot.8
+     man/ofpath.8 man/yaboot.8 man/yaboot.conf.5 man/yabootconfig.8
+     man/ybin.8 man.patch second/cache.S second/cfg.c
+     second/cmdline.c second/crt0.S second/file.c second/fs.c
+     second/fs_ext2.c second/fs_iso.c second/fs_of.c
+     second/fs_reiserfs.c second/gui/colormap.c
+     second/gui/effects.c second/gui/pcx.c second/gui/video.c
+     second/iso_util.c second/md5.c second/partition.c
+     second/prom.c second/setjmp.S second/yaboot.c util/addnote.c
+     util/elfextract.c ybin/mkofboot ybin/ofpath ybin/yabootconfig
+     ybin/ybin
+
+    modified files:
+     ChangeLog
+
+    new directories:
+     doc/.arch-ids doc/examples/.arch-ids etc/.arch-ids
+     first/.arch-ids include/.arch-ids include/asm/.arch-ids
+     include/et/.arch-ids include/ext2fs/.arch-ids
+     include/linux/.arch-ids include/reiserfs/.arch-ids
+     lib/.arch-ids man/.arch-ids second/.arch-ids
+     second/gui/.arch-ids util/.arch-ids ybin/.arch-ids doc
+     doc/examples etc first include include/asm include/et
+     include/ext2fs include/linux include/reiserfs lib man second
+     second/gui util ybin
+
+
+2002-03-25 03:28:42 GMT        Ethan Benson <erbenson@alaska.net>      base-0
+
+    Summary:
+      Create yaboot arch repo
+    Revision:
+      yaboot--devel--1.3--base-0
+
+    Create yaboot arch repo.
+
+    new files:
+     ./.arch-ids/ChangeLog.id ./ChangeLog
+
+
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..87d8a3b
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,23 @@
+
+The fastest way to install ybin and yaboot is to run `make install'.
+
+This will install the man pages in /usr/local/man by default and
+ybin/mkofboot in /usr/local/sbin.  yaboot and ofboot will be
+installed in /usr/local/lib/yaboot/.
+
+you may change the install paths by setting variables ROOT, PREFIX and
+MANDIR to make.  ie make ROOT=/ PREFIX=/usr MANDIR=/share/man (this is only
+intended for package maintainers.)
+
+yaboot can be installed where you like but
+/usr/local/lib/yaboot/yaboot is the first default location ybin will
+look, followed by /usr/lib/yaboot/yaboot.
+
+ybin needs hfsutils version 3.2.6 or later.
+
+The man pages should be installed in /usr/local/man/man?/.  The *.8.gz
+pages should be in /usr/local/man/man8/ and the *.5.gz page should be
+in /usr/local/man/man5/.
+
+If you need to remove ybin (say if your installing a debian package or
+.rpm) you can do so by issuing the command `make deinstall'.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..94ce349
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,199 @@
+## Configuration section
+
+VERSION = 1.3
+# Debug mode (verbose)
+DEBUG = 0
+ROOT =
+PREFIX = usr/local
+MANDIR = man
+GETROOT = fakeroot
+
+# Enable text colors
+CONFIG_COLOR_TEXT = y
+# Enable colormap setup
+CONFIG_SET_COLORMAP = y
+# Enable splash screen
+CONFIG_SPLASH_SCREEN = n
+# Enable md5 passwords
+USE_MD5_PASSWORDS = y
+
+# We use fixed addresses to avoid overlap when relocating
+# and other trouble with initrd
+
+# Load the bootstrap at 2Mb
+TEXTADDR       = 0x200000
+# Malloc block at 3Mb -> 4Mb
+MALLOCADDR     = 0x300000
+MALLOCSIZE     = 0x100000
+# Load kernel at 20Mb and ramdisk just after
+KERNELADDR     = 0x01400000
+
+# Set this to the prefix of your cross-compiler, if you have one.
+# Else leave it empty.
+#
+CROSS = 
+
+# The flags for the target compiler.
+#
+CFLAGS = -Os -nostdinc -Wall -isystem `gcc -print-file-name=include` -fsigned-char
+CFLAGS += -DVERSION=\"${VERSION}\"     #"
+CFLAGS += -DTEXTADDR=$(TEXTADDR) -DDEBUG=$(DEBUG)
+CFLAGS += -DMALLOCADDR=$(MALLOCADDR) -DMALLOCSIZE=$(MALLOCSIZE)
+CFLAGS += -DKERNELADDR=$(KERNELADDR)
+CFLAGS += -I ./include
+
+ifeq ($(CONFIG_COLOR_TEXT),y)
+CFLAGS += -DCONFIG_COLOR_TEXT
+endif
+
+ifeq ($(CONFIG_SET_COLORMAP),y)
+CFLAGS += -DCONFIG_SET_COLORMAP
+endif
+
+ifeq ($(CONFIG_SPLASH_SCREEN),y)
+CFLAGS += -DCONFIG_SPLASH_SCREEN
+endif
+
+ifeq ($(USE_MD5_PASSWORDS),y)
+CFLAGS += -DUSE_MD5_PASSWORDS
+endif
+
+# Link flags
+#
+LFLAGS = -Ttext $(TEXTADDR) -Bstatic 
+
+# Libraries
+#
+LLIBS = lib/libext2fs.a
+#LLIBS = -l ext2fs
+
+# For compiling build-tools that run on the host.
+#
+HOSTCC = gcc
+HOSTCFLAGS = -I/usr/include $(CFLAGS)
+
+## End of configuration section
+
+OBJS = second/crt0.o second/yaboot.o second/cache.o second/prom.o second/file.o \
+       second/partition.o second/fs.o second/cfg.o second/setjmp.o second/cmdline.o \
+       second/fs_of.o second/fs_ext2.o second/fs_reiserfs.o second/fs_iso.o second/iso_util.o \
+       lib/nosys.o lib/string.o lib/strtol.o lib/vsprintf.o lib/ctype.o lib/malloc.o lib/strstr.o
+
+ifeq ($(CONFIG_SPLASH_SCREEN),y)
+OBJS += second/gui/effects.o second/gui/colormap.o second/gui/video.o second/gui/pcx.o
+endif
+
+ifeq ($(USE_MD5_PASSWORDS),y)
+OBJS += second/md5.o
+endif
+
+CC = $(CROSS)gcc
+LD = $(CROSS)ld
+AS = $(CROSS)as
+OBJCOPY = $(CROSS)objcopy
+
+all: yaboot addnote mkofboot
+
+lgcc = `$(CC) -print-libgcc-file-name`
+
+yaboot: $(OBJS)
+       $(LD) $(LFLAGS) $(OBJS) $(LLIBS) $(lgcc) -o second/$@
+       chmod -x second/yaboot
+
+addnote:
+       $(HOSTCC) $(HOSTCFLAGS) -o util/addnote util/addnote.c
+
+elfextract:
+       $(HOSTCC) $(HOSTCFLAGS) -o util/elfextract util/elfextract.c
+
+mkofboot:
+       ln -sf ybin ybin/mkofboot
+
+%.o: %.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+%.o: %.S
+       $(CC) $(CFLAGS) -D__ASSEMBLY__  -c -o $@ $<
+
+dep:
+       makedepend -Iinclude *.c lib/*.c util/*.c gui/*.c
+
+bindist: all
+       mkdir ../yaboot-binary-${VERSION}
+       ${GETROOT} make ROOT=../yaboot-binary-${VERSION} install
+       mkdir -p -m 755 ../yaboot-binary-${VERSION}/usr/local/share/doc/yaboot
+       cp -a COPYING ../yaboot-binary-${VERSION}/usr/local/share/doc/yaboot/COPYING
+       cp -a README ../yaboot-binary-${VERSION}/usr/local/share/doc/yaboot/README
+       ${GETROOT} tar -C ../yaboot-binary-${VERSION} -zcvpf ../yaboot-binary-${VERSION}.tar.gz .
+       rm -rf ../yaboot-binary-${VERSION}
+
+clean:
+       rm -f second/yaboot util/addnote util/elfextract $(OBJS)
+       find . -name '#*' | xargs rm -f
+       find . -name '.#*' | xargs rm -f
+       find . -name '*~' | xargs rm -f
+       rm -rf man.deb
+       chmod 755 ybin/ybin ybin/ofpath ybin/yabootconfig
+       chmod -R u+rwX,go=rX .
+       chmod a-w COPYING
+
+install: all
+       @strip second/yaboot
+       @strip --remove-section=.comment second/yaboot
+       @strip util/addnote
+       @strip --remove-section=.comment --remove-section=.note util/addnote
+       install -d -o root -g root -m 0755 ${ROOT}/etc/
+       install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/sbin/
+       install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/lib
+       install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/lib/yaboot
+       install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man5/
+       install -d -o root -g root -m 0755 ${ROOT}/${PREFIX}/${MANDIR}/man8/
+       install -o root -g root -m 0644 second/yaboot ${ROOT}/$(PREFIX)/lib/yaboot
+       install -o root -g root -m 0755 util/addnote ${ROOT}/${PREFIX}/lib/yaboot/addnote
+       install -o root -g root -m 0644 first/ofboot ${ROOT}/${PREFIX}/lib/yaboot/ofboot
+       install -o root -g root -m 0755 ybin/ofpath ${ROOT}/${PREFIX}/sbin/ofpath
+       install -o root -g root -m 0755 ybin/ybin ${ROOT}/${PREFIX}/sbin/ybin
+       install -o root -g root -m 0755 ybin/yabootconfig ${ROOT}/${PREFIX}/sbin/yabootconfig
+       rm -f ${ROOT}/${PREFIX}/sbin/mkofboot
+       ln -s ybin ${ROOT}/${PREFIX}/sbin/mkofboot
+       @gzip -9 man/*.[58]
+       install -o root -g root -m 0644 man/bootstrap.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/bootstrap.8.gz
+       install -o root -g root -m 0644 man/mkofboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/mkofboot.8.gz
+       install -o root -g root -m 0644 man/ofpath.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ofpath.8.gz
+       install -o root -g root -m 0644 man/yaboot.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yaboot.8.gz
+       install -o root -g root -m 0644 man/yabootconfig.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/yabootconfig.8.gz
+       install -o root -g root -m 0644 man/ybin.8.gz ${ROOT}/${PREFIX}/${MANDIR}/man8/ybin.8.gz
+       install -o root -g root -m 0644 man/yaboot.conf.5.gz ${ROOT}/${PREFIX}/${MANDIR}/man5/yaboot.conf.5.gz
+       @gunzip man/*.gz
+       @[ ! -e ${ROOT}/etc/yaboot.conf ] && install -o root -g root -m 0644 etc/yaboot.conf ${ROOT}/etc/yaboot.conf
+       @echo
+       @echo "Installation successful."
+       @echo
+       @echo "An example /etc/yaboot.conf has been installed (unless /etc/yaboot.conf already existed"
+       @echo "You may either alter that file to match your system, or alternatively run yabootconfig"
+       @echo "yabootconfig will generate a simple and valid /etc/yaboot.conf for your system"
+       @echo
+
+deinstall:
+       rm -f ${ROOT}/${PREFIX}/sbin/ofpath
+       rm -f ${ROOT}/${PREFIX}/sbin/ybin
+       rm -f ${ROOT}/${PREFIX}/sbin/yabootconfig
+       rm -f ${ROOT}/${PREFIX}/sbin/mkofboot
+       rm -f ${ROOT}/${PREFIX}/lib/yaboot/yaboot
+       rm -f ${ROOT}/${PREFIX}/lib/yaboot/ofboot
+       rm -f ${ROOT}/${PREFIX}/lib/yaboot/addnote
+       @rmdir ${ROOT}/${PREFIX}/lib/yaboot || true
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/bootstrap.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/mkofboot.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/ofpath.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/yaboot.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/yabootconfig.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man8/ybin.8.gz
+       rm -f ${ROOT}/${PREFIX}/${MANDIR}/man5/yaboot.conf.5.gz
+       @if [ -L ${ROOT}/boot/yaboot -a ! -e ${ROOT}/boot/yaboot ] ; then rm -f ${ROOT}/boot/yaboot ; fi
+       @if [ -L ${ROOT}/boot/ofboot.b -a ! -e ${ROOT}/boot/ofboot.b ] ; then rm -f ${ROOT}/boot/ofboot.b ; fi
+       @echo
+       @echo "Deinstall successful."
+       @echo "${ROOT}/etc/yaboot.conf has not been removed, you may remove it yourself if you wish."
+
+uninstall: deinstall
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..01bcd36
--- /dev/null
+++ b/README
@@ -0,0 +1,421 @@
+Yaboot  -- PowerPC GNU/Linux OpenFirmware bootloader
+--------------------------------------------
+
+Please read the "COPYING" file for licence informations.
+
+   Copyright (C) 2000 Benjamin Herrenschmidt
+
+   portions based on "poof"
+
+   Copyright (C) 1999 Marius Vollmer
+
+   portions based on "quik"
+   
+   Copyright (C) 1996 Paul Mackerras.
+
+   PPC64 support & Misc fixes by Peter Bergner, David Engebretsen
+   
+
+--------------------------------------------
+
+Yaboot is an OpenFirmware bootloader for Open Firmware based
+machines. It is known to work on "NewWorld" class powermacs
+(iMac and all machines released after it), RS/6000, and possibly
+other OF based CHRP machines.
+"OldWorld" PowerMacs (with the old MacOS ROM buit-in) are not
+supported.
+
+ybin Written by Ethan Benson <erbenson@alaska.net>
+
+ybin (YaBoot INstaller) was created so that there could be a lilo/quik
+style bootloader installer for PowerPC based machines which require
+bootstrap partitions rather then a traditional bootblock (ie all
+`NewWorld' Macintoshes).  It is designed to install yaboot, an
+OpenFirmware bootloader for GNU/Linux written by Benjamin
+Herrenschmidt.  When ybin is configured correctly you can simply type
+ybin, and the bootloader and its configuration file will be
+installed/updated on the bootstrap partition without any further user
+intervention.
+
+ybin also supports IBM PowerPC hardware which requires a slightly
+different bootstrap partition setup, yaboot is directly dded to the
+partition instead of copied to a filesystem on the partition.  For
+these machines add fstype=raw to your /etc/yaboot.conf.  See
+examples/yaboot.conf.rs6k for an example configuration.
+
+Both ybin and mkofboot are shell scripts (compatible with ash, sh,
+bash).  These are the first real scripts that I have written with any
+sort of complexity, so don't be too brutal if they are ugly and
+inefficient. ;-) Suggestions on how to do things better are welcome.
+
+ybin can update a bootstrap filesystem either on a block device or a
+ordinary file (as in a image of a filesystem.) 
+
+Unless you use the usemount (or --mount) option it does not
+necessarily need to be run as root, but it probably will, unless you
+changed device permissions or are only updating an image.
+
+mkofboot is a companion script (actually a symlink to ybin) to
+initialise the bootstrap partition and then run ybin to install the
+bootloader on it.  It uses the same configuration file as ybin to find
+the device to use. It will validate the configuration file before
+actually creating the filesystem. It will also confirm you want to
+continue before proceeding unless called with the -f or --force
+switch.
+
+(>= 0.18): ofpath utility now included which can usually find the
+OpenFirmware device path that corresponds with a unix device node in
+/dev/.  Ybin will use this utility automatically to find the path to
+the bootstrap partition and to any defined macos/macosx partitions.
+NOTE: ofpath may not work with all SCSI cards/drivers. 
+IMPORTANT: ofpath will NOT work if you boot your machine with BootX.
+
+ofpath is based on the utility `show_of_path.sh' written by Olaf
+Hering. 
+
+(>= 0.20): ybin will now check for the new nvsetenv that is
+compatible with Newworld PowerMacs, and if found it will automatically
+update the boot-device variable in nvram to that of the bootstrap
+partition.  This feature can be disabled by passing the --nonvram
+switch to ybin or by adding `nonvram' to /etc/yaboot.conf.  This
+feature works in both the userland and `usemount' modes.  In userland
+mode ybin sets the boot-device variable to <path>,\\:tbxi, for example
+if your bootstrap partition is /dev/hda2 boot-device will be set to
+hd:2,\\:tbxi, in `usemount' mode it would be set to hd:2,ofboot (or
+hd:2,yaboot if you don't have magicboot= set.)
+
+NEW (>= 0.31): The ofboot script now has configurable colors, you can
+change the foreground (text) and background colors it will use with
+the fgcolor= and bgcolor= options in yaboot.conf, see below for
+details.  Yaboot 1.0 and later also supports these options. 
+
+IMPORTANT: The bootstrap partition should never be mounted anywhere on
+your filesystem, ybin and mkofboot will check if it is and refuse to
+operate on it if its mounted.  It is not necessary to keep anything
+but the boot loader on the bootstrap partition, yaboot will load the
+kernel from your ext2fs root partition so do not mount the bootstrap
+partition on top of /boot.
+
+ybin now fully supports command line switches, see ybin --help for
+information on these.
+
+NEW: ybin can now generate a basic yaboot.conf on the fly that you may
+customise with command line options:
+
+      --device               yaboot auto configuration: sets the OF boot device
+                               default: hd:
+      --partition            yaboot auto configuration: sets the partition 
+                               number of the root partition. default: 3
+      --timeout              yaboot auto configuration: sets the time yaboot
+                               will wait for user input before booting default
+                               image default: 20 (2 seconds)
+      --image                yaboot auto configuration: sets the path to the 
+                               kernel image. default: /vmlinux
+      --label                yaboot auto configuration: sets the image label
+                               default: Linux
+      --root                 yaboot auto configuration: sets the root device
+                               default: /dev/hda3
+
+This is experimental but appears to work ok. 
+
+A much better method of generating an /etc/yaboot.conf is to run
+yabootconfig however.
+
+NOTE: You must have a secure mktemp program otherwise ybin will be
+vulnerable to race conditions.  Debian's mktemp qualifies I don't know
+about the other distributions, you have been warned. The temp file is
+created in /tmp by default but ybin will respect the $TMPDIR
+environment variable. 
+
+Configuration file documentation:
+
+ybin will verify the configuration file is sane and valid
+before proceeding.
+
+IMPORTANT: The configuration file format as of version 0.12 has
+changed, see below for the current format, note some options have been
+removed. as with version 0.11 ybin allows you to put spaces around the
+= eg: boot = /dev/hda3 (however this prevents spaces from being
+embedded in the options themselves) As of version 0.12 the separate
+ybin.conf file is deprecated, instead ybin's options should be placed
+in /etc/yaboot.conf, you must have yaboot 0.6 or later for this to
+work.  Ybin will no longer use the obsolete /etc/ybin.conf.
+
+The kludge, and kludgedir options have been removed. The bootconf
+option has been deprecated since yaboot and ybin both use
+/etc/yaboot.conf (or whatever config file is specified to the -C
+switch).
+
+boot= (same as -b or --boot)
+
+This option defines what device the bootstrap partition is.  It also
+be a regular file if you are creating a filesystem image for some
+reason. It is safe to specify a MacOS boot partition as long as you DO
+NOT use mkofboot.  ybin is non destructive except that is overwrites
+any existing yaboot files (yaboot and yaboot.conf) at the root level
+of the bootstrap filesystem. The default config file has this set to
+"unconfigured which will cause ybin to complain about you not reading
+the docs, it is the only option you should need to change for ybin to
+work. Example boot=/dev/hda2
+
+ofboot= (same as -o or --ofboot) 
+
+This option defines the OpenFirmware device path to the bootstrap
+partition.  This is needed so the first stage ofboot loader can be
+configured properly.  It should include the OpenFirmware path
+including the partition number (but not a filename). Example: if your
+bootstrap partition is /dev/hda2 the OF path will likely be hd:2.
+As of ybin 0.18 you no longer are required to specify this option, if
+left undefined ybin will attempt to figure out the OpenFirmware path
+automatically using the ofpath utility.  You should only need to
+define this option if ofpath fails.
+
+install= (same as -i or --install)
+
+The full pathname to the yaboot OpenFirmware executable file.  This
+file will be copied to the root level of the bootstrap partition, its
+filename will not be changed. The default is
+/usr/local/lib/yaboot/yaboot, or if that does not exist
+/usr/lib/yaboot/yaboot.
+
+magicboot= (same as -m or --magicboot)
+
+The full pathname to any OF CHRP script file. If this is defined then
+it will be given the HFS filetype defined below and the bootfile will
+be given type "boot" instead, if we set two files to `tbxi' we may get
+unpredictable results from OF.  A wrapper file would generally only be
+needed if you have a OF script that creates a nice boot menu or
+possibly adds a option to the newer ibook boot screens. IMPORTANT: it
+appears that OF will only load `tbxi' files if they have a CHRP script
+embedded, so this option is now on by default and will install the
+included basic script that just loads the yaboot executable. (at least
+until/if yaboot gets a embedded script) If you later change your mind
+about using an OF wrapper you will have to delete it manually from the
+bootstrap partition, ybin will not and cannot do it for you. If the
+partition is a dedicated bootstrap partition you can run mkofboot to
+remove it (and anything else).  This should be set to
+/usr/local/lib/yaboot/ofboot which is the new first stage loader
+configured automatically by ybin from options in /etc/yaboot.conf.
+
+bsd= 
+
+The OpenFirmware or unix device path to a NetBSD or OpenBSD bootstrap
+partition, this partition must already have the BSD ofwboot.elf
+bootloader installed in the root directory.  When you define this
+option you will be presented with a simple menu at bootup allowing you
+to hit L to boot GNU/Linux or B to boot BSD (along with other choices
+if configured).  This will only work if you are using the new
+/usr/local/lib/yaboot/ofboot script.  When this is set to a unix
+device node (ie /dev/hda11) then ybin will use the ofpath utility to
+determine the OpenFirmware device path.
+
+macos= 
+
+The OpenFirmware or unix device path to a MacOS 8.* or 9.* boot
+partition.  When you define this option you will be presented with a
+simple menu at bootup allowing you to hit L to boot GNU/Linux or M to
+boot MacOS (along with other choices if configured).  This will only
+work if you are using the new /usr/local/lib/yaboot/ofboot script.
+When this is set to a unix device node (ie /dev/hda11) then ybin will
+use the ofpath utility to determine the OpenFirmware device path.
+
+macosx= 
+
+The OpenFirmware or unix device path to a MacOS X boot partition.
+When you define this option you will be presented with a simple menu
+at bootup allowing you to hit L to boot GNU/Linux or X to boot MacOSX
+(along with other choices if configured).  This will only work if you
+are using the new /usr/local/lib/yaboot/ofboot script.  
+When this is set to a unix device node (ie /dev/hda11) then ybin will
+use the ofpath utility to determine the OpenFirmware device path.
+
+brokenosx
+
+This option causes the menu entry for MacOSX to execute
+\System\Library\CoreServices\BootX from the macosx=device instead of
+the usual \\:tbxi.  This is necessary if OSX is installed onto an HFS+
+filesystem instead of UFS. When OSX is installed on an HFS+ filesystem
+MacOS will mount and debless the OSX partition.  Add this option if
+the OSX menu entry breaks after booting MacOS.  You should not use
+this option if OSX is installed on a UFS filesystem, for UFS installs
+you specify the OSX bootstrap partition which is protected against
+MacOS.
+
+darwin=
+
+The OpenFirmware or unix device path to a Darwin boot partition.  When
+you define this option you will be presented with a simple menu at
+bootup allowing you to hit L to boot GNU/Linux or D to boot Darwin
+(along with other choices if configured).  This will only work if you
+are using the new /usr/local/lib/yaboot/ofboot script.  When this is
+set to a unix device node (ie /dev/hda11) then ybin will use the
+ofpath utility to determine the OpenFirmware device path.
+
+enablecdboot
+
+This option adds an entry to the multiboot menu to boot from the CDROM
+drive.
+
+enablenetboot
+
+This option adds an entry to the mulitboot menu to boot from the
+network.
+
+enableofboot
+
+This option adds an entry to the multiboot menu to boot into an
+OpenFirmware prompt.
+
+defaultos= 
+
+The name of the default OS to load.  This can be linux, bsd, macos or
+macosx. This option controls what the first stage ofboot loader will
+boot by default after the delay elapses.  This is only relevant if you
+are using the new /usr/local/lib/yaboot/ofboot script and you have
+defined bsd= and/or macos= and/or macosx= in /etc/yaboot.conf.
+
+delay= 
+
+The time in seconds that the first stage ofboot loader will wait for
+you to choose L for GNU/Linux,M for MacOS, or X for MacOSX before
+booting the default OS defined in defaultos=.  If not set the value of
+timeout= (converted to seconds) will be used.
+
+usemount (same as -M or --mount)
+
+Whether or not to use the standard mount and umount utilities (and
+thus kernel space filesystem drivers instead of userspace utilities
+that manipulate the partition directly (through the device file). If
+this option is present ybin will insist that you be root. Note that
+using this option will prevent ybin from setting HFS attributes on the
+boot files (such as type and creator).  This option is here mainly to
+allow ybin's use even if you do not have hfsutils. Default: no
+IMPORTANT: It is not possible to bless the filesystem when mounted
+this way, you will thus have to manually configure OF to make your
+system bootable.
+
+mntpoint= 
+
+Requires `usemount' this works exactly like usemount does except it
+does not mount the bootstrap partition but rather installs the
+bootloader into the directory defined as the mountpoint.  The pathname
+MUST be clean, ie no embedded spaces or metacharacters.  The directory
+may not be more then one subdirectory deep from the root of the
+partition (not necessarily the unix /).  You must not have a trailing
+/ either.  This option is NOT recommended since it has the same
+limitations as usemount, your system will not be bootable by
+OpenFirmware, it will only be manually bootable or bootable if you
+change the boot-device variable to the direct pathname to the
+bootloader (which ybin will attempt to do). 
+
+fstype= (same as --filesystem)
+
+This defines what kind of filesystem exists (or created by mkofboot)
+on the bootstrap partition.  Possible options are hfs and msdos (if
+anyone can figure out how to get OF to execute a file on a ISO
+filesystem I will add that too) Note that if you use msdos filesystem
+you must have a DOS style partition table and not a Apple partition
+map. (it also requires that usemount be yes) yaboot may not yet
+support this configuration.  The "raw" type causes ybin or mkofboot to
+copy the bootloader (value of install=) to the bootstrap without any
+filesystem. CAUTION: this will destroy any data or filesystem on the
+bootstrap partition (value of boot=) if you specify something like
+boot=/dev/sda you will destroy the partition table and lose ALL data
+on the disk.  Default: hfs
+
+hfstype=
+
+This defines the 4 character code that should be given to the bootfile
+(the bootconf file will always be given type "conf") The main purpose
+of this is to make OF think its loading a MacOSROM image file and boot
+the system into GNU/Linux from the bootstrap partition as
+automatically as it would MacOS.  In order for this to work you should
+set this to `tbxi' (the default in the included config file). If you
+have specified a OF wrapper (see above) then it will be given this
+filetype and the bootfile will be given type "boot" instead.  NOTE:
+This appears to not work unless the bootfile has a CHRP boot script
+embedded in the header, at the moment yaboot lacks this script, see
+README.ofboot for more details. Default: tbxi
+
+hfscreator=
+
+This defines the 4 character creator code that should be given to both
+the bootfile and the bootconf files. This is largely pointless but if
+you use MacOS you could configure it so you have a pretty icon on the
+bootloader files. Default: UNIX
+
+nobless (same as --nobless)
+
+This prevents ybin from "blessing" the root directory of the bootstrap
+partition.  This is Macspeak for "bootable directory" on the MacOS the
+System Folder is "blessed".  Blessing the root directory will allow OF
+to find the bootstrap partition and load the bootloader automatically
+without reconfiguration (assuming the bootstrap partition is on the
+default disk (internal IDE in most cases). You should probably only
+set this if you are keeping the bootloader on a MacOS boot partition.
+
+protect (same as --protect)
+
+This defines whether the read-only bit should be set on the boot
+files, this is mostly pointless but slightly discourages
+tampering/deleting of the bootloader files if the bootstrap partition
+is mounted by MacOS.  (hide below really would do a better job of
+that) This option will work with both msdos and hfs filesystems.  It
+also works whether you have the usemount option set or not. 
+
+hide (same as --hide)
+
+This defines whether or not the HFS invisible bit should be set on the
+boot files. This is a stronger way to make sure nobody fscks up your
+bootloader on the MacOS side of things.  (A better option is a
+dedicated bootstrap partition with its partition type set to
+Apple_Bootstrap which is acceptable to OF but MacOS will refuse to mount
+it.) This option is ignored for msdos filesystems and will only work
+if usemount is not set.
+
+nonvram (same as --nonvram)
+
+This option prevents ybin from using nvsetenv to set the OpenFirmware
+boot-device variable in nvram.  This is currently required for IBM
+machines.  NOTE: you should not use this option when dual booting
+MacOS, it will cause the MacOS boot menu entries to fail on some
+machines.
+
+fgcolor=string
+
+Specifies the foreground (text) color used by yaboot(8) and the
+multiboot menu.  Available colors are: black, blue, light-blue, green,
+light-green, cyan, light-cyan, red, light-red, purple, light- purple,
+brown, light-gray, dark-gray, yellow, and white.  The default is
+white.
+
+bgcolor=string
+
+Specifies the background color used by yaboot(8) and the mulitboot
+menu.  Available colors are: black, blue, light-blue, green,
+light-green, cyan, light-cyan, red, light-red, purple, light-purple,
+brown, light-gray, dark-gray, yellow, and white.  The default is
+black.
+
+ybin does not make any validations of the yaboot specific options,
+that is up to you to make sure yaboot is configured correctly.
+
+===========================================================================
+
+Copyright (C) 2001 Ethan Benson
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+===========================================================================
diff --git a/README.man.patch b/README.man.patch
new file mode 100644 (file)
index 0000000..445ae22
--- /dev/null
@@ -0,0 +1,4 @@
+This patch is only meant to be used by package maintainers (debian or
+redhat), it changes references to /usr/local/lib/yaboot to
+/usr/lib/yaboot in the man pages.  This way the man pages will better
+reflect the real locations for packaged version of yaboot/ybin.
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..630a169
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,17 @@
+In no particular order:
+
+ * Daniel Jacobowitz <dan@debian.org> for Debian packaging, advice and busybox help.
+ * Benjamin Herrenschmidt <benh@kernel.crashing.org> for yaboot and great work on the kernel.
+ * Charles Stevenson <csteven@newhope.terraplex.com> for adding color config support to yaboot.
+ * Chris Emerson <cemerson@chiark.greenend.org.uk> for the Forth code in ofboot.
+ * iNOUE Koich! <inoue@ma.ns.musashi-tech.ac.jp> for advice and help [re]writing ofboot's Forth code.
+ * Segher Boessenkool <segher@chello.nl> for help with ofboot's Forth code, and the new penguin icon.
+ * Tom Rini <trini@kernel.crashing.org> for adding devfs support to ofpath.
+ * Eric Peden <ericpeden@homemail.com> for writing the yaboot FAQ.
+ * Nicholas Humfrey <njh399@ecs.soton.ac.uk> for the badge icons in ofboot.
+ * Hollis Blanchard <hollis+@andrew.cmu.edu> YellowDog/RPM packaging.
+ * Brad Midgley <brad@turbolinux.com> for Turbolinux/RPM packaging.
+ * Olaf Hering <olh@suse.de> for figuring out how to map SCSI /dev nodes to OF paths. 
+ * Josh Huber <huber@mclinux.com> for PowerBook1998 ofpath support.
+ * Ian the T <ian@iantheterrible.com> for donating shell access to add 8600 support to ofpath. 
+ * anyone i left out!
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..c2d7f5a
--- /dev/null
+++ b/TODO
@@ -0,0 +1,13 @@
+
+* Add nvram updating support for IBM hardware.  This requires ofpath
+   to support these machines.  It also requires a compatible nvsetenv
+   or equivilent. 
+
+* Validate yaboot options before proceeding. (need better config parsing)
+
+* Password protection for insecure menu options (MacOS).
+
+* Figure out all the crap with CHRP netbooting, probably have to remove
+  hard-coding of ":0" after a net devuce path
+
+* Support for compressed images
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..7eb52a6
--- /dev/null
+++ b/changelog
@@ -0,0 +1,621 @@
+2001-09-20  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.3
+
+       * Merging of ybin and yaboot source trees, this is now the
+         official upstream yaboot/ybin source tree.
+
+       * yaboot:
+         - Various ppc64 & chrp fixes by Peter Bergner, fix fdisk partition
+           handling.
+         - Fix netboot (was broken by reiserfs patch)
+       
+2001-08-26  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.6
+
+       * ofpath became broken on non-scsi systems due to quoting fix.
+       
+2001-08-20  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.5
+
+       * Fix broken quoting uncovered by debian's current /bin/ash.
+
+2001-08-06  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.4
+
+       * ofboot: remove <OS-VOLUME-NAME> tag as it was causing the
+         OpenFirmware multibooter to crash.
+
+       * mkofboot: zero first 800K of bootstrap partition before creating
+         filesystem.
+
+       * yaboot:
+         - Version 1.2.3
+         - Supports using an md5 hash as well as plaintext password. (me)
+         - Fix again system.map loading. That also fix an old pending bug
+           we had where yaboot could pass random values for system.map,
+           causing the kernel to mark random pages reserved. (BenH)
+         - IBM CHRP fixes. (Peter Bergner)
+         - Add reiserfs support (Jeff Mahoney)
+
+2001-06-30  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.3
+
+       * ofpath:
+         - Version 1.0
+         - Add support for IBM CHRP, thanks to Marco d'Itri for testing.
+         - Use real wc if available, this speeds up ofpath slightly for scsi.
+         - Make variables local to their function unless they need to be global.
+
+       * ybin:
+         - If installing on IBM CHRP run addnote on yaboot binary before installing.
+         - Reword some error/verbose messages
+         - Make variables local to their function unless they need to be global.
+
+2001-06-24  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.2
+
+       * yabootconfig:
+         - Now works with braindamaged versions of pdisk.
+         - Add --kernel-args switch which allows boot-floppies to easily
+           add an append= line if needed.
+
+2001-06-01  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2.1
+
+       * Fix test for strict posix/SUS echo behavior.
+
+       * Check for printf built into the shell.
+
+       * yabootconfig: check for and attempt to deal with cross device symlinks.
+
+2001-05-28  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.2
+
+       * Added yabootconfig, a script to build a valid /etc/yaboot.conf
+
+       * ybin:
+         - Detect IBM CHRP hardware and disable nvram update automatically
+         - Automatically run yabootconfig if /etc/yaboot.conf is missing
+         - Check for PATH_PREFIX environment variable and add all bin and
+           sbin directories from under it to PATH.  This is for boot-floppies.
+         - Add bsd= to list of multiboot options.
+
+       * ofboot: bump maximum number of OSes to 8.
+
+       * ofpath:
+         - No longer report bogus paths for non-existent scsi devices.
+         - Fix bug where garbage characters were mixed with the
+           OpenFirmware device path.
+         - Fix broken Wallstreet PowerBook support.
+         - Add support for silly devfs naming convention, Thanks to Tom Rini.
+
+2001-05-06  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.1.1
+
+       * ofboot: 
+         - Hopefully fix random and rare booting problem when chainloading
+           other OSes.  Thanks to Segher Boessenkool for the fix.
+         - Add volume name which shows up in the OpenFirmware multiboot
+           screen.
+         - It is now possible to replace the badge icon for the multiboot
+           screen, see examples/README.mbicon.
+
+       * yaboot: 
+         - Version 1.2.1
+         - Includes my previous 1.1.1-eb3 patches for password protection and single-key.
+
+       * Various spelling errors and clarifications to man pages.  Thanks to sword.
+
+2001-04-26  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.1
+
+       * ofpath:
+         - Version 0.8
+         - Add support for Performa 6400_200, PowerMac 4400, and the clones.
+         - Removed `No such file or directory' errors when system has no
+           scsi at all.
+
+       * ybin:  
+         - If delay= is not set use value of timeout= (converted to
+           seconds) instead.
+         - Removed command line options --type, --creator, and long
+           obsolete and deprecated --conffile.  The config file options
+           hfstype and hfscreator are still there.
+         - Removed long obsolete and deprecated bootconf= config option.
+         - Removed some old now unneeded debug cruft.
+
+       * yaboot:
+         - Include version 1.1.1-eb3, this includes the following changes
+         - Adds password protection capabilities.
+         - Add `single-key' option from silo.
+
+       * Documentation:
+         - Rewrote the yaboot.conf man page, now derived from silo.conf(5)
+
+2001-03-22  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 1.0
+
+       * ybin:
+         - Fix a few bugs that occured when magicboot= was not used.  
+         - Add basic support for IBM style bootstrap partitions.  These
+           partitions have yaboot dded directly to them.  See the yaboot.conf
+           man page regarding fstype for more info, also
+           examples/yaboot.conf.rs6k. 
+         - Don't require that ofpath be installed if its not needed.
+
+       * Documentation:
+         - Added examples/yaboot.conf.rs6k
+         - Man page updates for IBM support.
+
+2001-02-19  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.31
+
+       * ofpath:
+         - Quiet shell error when run on non-PowerMac (but still
+           PowerPC) hardware.
+         - Properly recognize more OldWorld PowerMac G3s. 
+         - Fix OldWorld detection for kernels < 2.2.17
+         - Require that /proc be mounted.
+
+       * ybin: 
+         - Fix OldWorld detection for kernels < 2.2.17
+         - Make the `not bootable on OldWorld' warning very loud and
+           obnoxious.  
+         - Change PATH to make /usr/local the last component instead of
+           the first.
+         - Make the text/background color in the boot menu configurable,
+           see the yaboot.conf(5) man page for details. 
+         - Change default foreground color to white per yaboot 1.0.
+         - Remove support for obsolete /etc/ybin.conf.
+
+       * Documentation: 
+         - Clarified the `partition=' variable in the yaboot.conf man page
+           and correct an error in the example in that man page.
+         - Added more comments to included yaboot.conf examples. 
+
+       * yaboot: 
+         - Include version 1.1.1
+         - Includes color support
+
+2000-11-18  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.30
+
+       * ybin: add `brokenosx' option, when used with macosx= ybin makes
+       the MacOSX menu entry execute \System\Library\CoreServices\BootX
+       directly instead of using \\:tbxi.  This is necessary for
+       people who insist on installing OSX on HFS+ instead of UFS, since
+       MacOS deblesses HFS+ OSX partitions.
+       
+2000-10-28  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.29 (the brown paper bag release)
+
+       * The yaboot.conf man page was broken.
+
+       * While were at it, include yaboot 0.9 binary (compiled -Os,
+       stripped)
+       
+2000-10-24  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.28
+
+       * ybin: Add mntpoint= option, this allows ybin to install the
+       bootstrap into an already mounted filesystem.  This is NOT
+       recommended unless you know what your doing.  
+
+       * ybin: fixed generation of ofboot.b so it will work with nobless
+       and usemount.
+       
+2000-10-20  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.27
+
+       * ofboot: fixed problem where text was not visible on some newer iMacs. 
+
+       * ybin: Now warn the user when they are using ybin on an OldWorld
+       PowerMac.  (it will still work since its possible to make newworld
+       bootable disks on an OldWorld mac)
+
+       * ofpath: Now works on oldworld macs under 2.4 kernels. 
+
+       * Added check for packaged versions of ybin to the Makefile and
+       warn user about them.
+       
+2000-09-23  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.26
+
+       * ofboot: completely rewrote the generator script, it is now more
+       extendable and supports more menu options.  More thanks to iNOUE
+       Koich! for the continuing help on OpenFirmware issues!!
+
+       * ybin: added options for mulitboot menu: now can create a menu
+       with options for GNU/Linux, MacOS, MacOSX, Darwin, and booting off
+       a CDROM, from the network, and even directly into an OpenFirmware
+       prompt. 
+
+       * ybin: some errors were sent to stdout instead of stderr, fixed.
+
+       * ofpath: refuse to run on anything but GNU/Linux.  (for now anyway)
+       
+2000-09-18  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.25
+
+       * ofboot: now changes the background color to black and the text
+       color to cyan like yaboot.  Thanks to again to iNOUE Koich!  
+
+2000-09-16  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.24
+
+       * ofboot: many bugs in the Forth code fixed. code should now be
+       compliant to the OpenFirmware spec.  Also add CD boot menu option.
+       (add enablecdboot to /etc/yaboot.conf) Thanks to iNOUE Koich! for
+       the Forth code.
+
+2000-09-13  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.23
+
+       * ybin: now hard code the target filename for ofboot, its always
+       installed as ofboot.b on the bootstrap partition.  This eliminates
+       ambiguity when someone tries a different script with different name.
+
+       * ybin: all debugging output goes to stderr now.
+
+2000-09-09  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.22
+
+       * ofboot.b renamed to ofboot.  (.b means boot block which this is not) 
+
+       * yaboot and ofboot are now installed in /usr/local/lib/yaboot/
+       instead of /boot, since these files are never directly accessed by
+       the firmware it is not really appropriate to keep them in /boot.
+       make install will create backwords compatibility symlinks when
+       installing over an older version of ybin so nothing should break.
+       IMPORTANT: you should run mkofboot on a dedicated bootstrap
+       partition to purge old filenames.
+
+       * Man pages updated to reflect new file locations.  Also include a
+       patch to change the paths to /usr/lib/yaboot for Debian and redhat
+       package maintainers.
+
+       * ybin: now checks two places for a default value for install=
+       /usr/local/lib/yaboot/yaboot, /usr/lib/yaboot/yaboot.
+       
+2000-09-02  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.21
+
+       * ybin: fixed nvram update so it uses a real filename instead of
+       \\:tbxi when nobless is set in /etc/yaboot.conf.  (\\: means find
+       file in blessed directory).
+
+       * ofpath: more oldworld machines supported.  Now supports 7200,
+       7300, 8600, 9500, Gossamer G3, PowerBook 1998, PowerBook 3400 (and
+       possibly 2400).
+       
+2000-08-31  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.20
+
+       * ybin: check for Newworld compatible nvsetenv and if found will
+       automatically update the OpenFirmware boot-device variable in
+       nvram.
+
+       * ofpath: support some oldworld machines. (this does not mean
+       ybin/yaboot supports oldworld).  Also silence a harmless error on
+       machines lacking a CDROM.
+
+       * ofboot.b: added more machines to <COMPATIBLE>
+       
+2000-08-25  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.19
+
+       * Added PowerMac3,2 and PowerMac3,3 to ofboot.b scripts.  Fixes
+       Debian bug #69870
+
+2000-08-22  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.18
+
+       * ofboot.b: changed the yaboot boot commands to boot yaboot by
+       filename rather then file type. Booting by file type did not work
+       reliably on all machines.
+
+       * ybin: hard code the target filename for yaboot, regardless of
+       the source filename (from install=) the target filename on the
+       bootstrap partition will always be "yaboot.b".
+
+       * Added ofpath utility, this is a rewrite of the show_of_path.sh
+       utility written by Olaf Hering.  Ofpath works with /bin/ash and on
+       stripped down systems such as the Debian boot floppies.  Also
+       wrote a small man page for this utility.
+
+       * ybin: automatically use ofpath to find the OpenFirmware device
+       path when ofpath= is not defined in /etc/yaboot.conf.  Ybin will
+       also use ofpath when macos= or macosx= are set to unix device
+       nodes (ie /dev/hda11), these options can still be set to
+       OpenFirmware paths as well. 
+
+       * Makefile: minor cleanup, added installation of ofpath
+       utility/man page as well as a deinstall rule.
+
+2000-08-13  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.17
+
+       * Yaboot 0.7 binary included.
+
+       * ybin: fix bug where ybin would fail if the bootstrap files
+       included an "_" in the filename.  (actually its a workaround for
+       hfsutils brain-damage)
+
+       * ofboot.b: completely rewritten.  Now includes shell script code
+       to allow ybin to configure it based on config options in
+       /etc/yaboot.conf instead of requiring the user to edit it
+       themselves.  Additionally this new script will display a REAL boot
+       menu when dual booting is configured.  It is capable of dual or
+       tri booting GNU/Linux (yaboot), MacOS 8.*/9.* and MacOSX.  This
+       new ofboot.b script should *NOT* be edited by the user, and thus
+       should NOT be marked as a conffile in Debian and redhat packages.
+       These packages should now install ofboot.b in /boot instead of
+       /etc since it is no longer a config file.  WARNING: The Forth code
+       in this script has not been tested on all machines and may not be
+       universally compatible.  Thanks to Chris Emerson for writing the
+       Forth code.
+
+       * yaboot.conf: new options: ofboot= macos= macosx= delay=
+       defaultos=.  See the yaboot.conf man page for details. 
+
+       * Now include a Makefile to handle installation, only make install
+       is defined.  Removed install-sh. 
+
+       * mkofboot is now distributed and installed as a symlink instead
+       of a hardlink.
+       
+       * Man page updates.
+       
+2000-04-25  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.16
+
+       * menu_ofboot.b: fixed bug where the yaboot line was missing the
+       boot command, this prevented it from booting yaboot.
+
+2000-04-25  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.15
+
+       * Merge quik's bootstrap(8) man page with ybin's ofboot(8) man
+       page and rename it back to bootstrap(8).  This also solves the
+       conflict with quik.  In a more useful way IMO.
+
+2000-04-24  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.14
+
+       * Ship man pages uncompressed, gzip them in install-sh instead,
+       this allows for easier patching by debian maintainers if need be.
+
+       * Rename bootstrap(8) man page to ofboot(8) so ybin does not
+       conflict with quik.
+       
+2000-04-23  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.13
+
+       * Rewrote the config file parsing yet again to remove dependencies
+       on tr, and awk.  This allows ybin to function on minimal systems
+       such as boot/rescue floppies.  This also pretty much solves the
+       slowness problem.  Thanks to Daniel Jacobwitz for the help.
+
+       * Made changes to remove dependencies on basename and wc.  Again
+       this is to allow ybin to work on boot floppies.
+
+       * Changed all calls to grep to stop using GNU extensions, this is
+       so ybin will work properly with the minimal version of grep
+       included in busybox.
+
+       * Added signal handling so ybin/mkofboot will cleanup after
+       themselves if killed with signals 1 2 3 or 15.
+       
+       * Added OS Badge icons to the ofboot.b scripts.  On G4 machines
+       you can hold down the option key and get a graphical boot selector
+       with one button for each bootable partition, the button with the
+       penguin icon is the bootstrap partition.  Thanks to Nicholas
+       Humfrey for creating the Badge icon.
+
+       * Minor updates to the man pages.
+       
+2000-04-19  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.12
+
+       * Now include yaboot binary in ybin distribution.
+
+       * Include a install-sh script to install everything.
+
+       * Use of the separate ybin.conf file is deprecated.  Use
+       /etc/yaboot.conf instead.
+
+       * Removed the so called kludge options, without being able to
+       bless the root directory they were just useless bloat.
+
+       * Removed useless --readonly option, it was already default (as it
+       should be)
+
+       * Deprecated bootconf options since the yaboot.conf is the same
+       config ybin uses.  (it is still there and works but that may change)
+
+       * Changed configuration file format to be more like quik/lilo:
+       bootfile= is now install= (--bootfile is now --install), wrapper=
+       is now magicboot=, usemount, protect, and hide are now just a
+       keyword options, if they are present in the configuration file
+       they are turned on, if they are not present they are turned off.
+       bless= is now the nobless keyword option, since bless is default
+       this one changed names.
+
+       * ybin: no longer need to specify -C /dev/null if you don't have a
+       configuration file in /etc/.  If this is the case ybin will generate
+       a generic yaboot.conf to install on the bootstrap partition.  
+
+       * More changes to the configuration parsing to improve speed, the
+       format change also helped the speed problem.
+
+       * Added man pages for ybin, mkofboot, yaboot, yaboot.conf and
+       bootstrap. 
+
+       * More general fixes/cleanup/tweaks.
+       
+2000-03-13  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.11
+
+       * Added command line options to both scripts, try --help. This
+       makes the ybin.conf file optional if you wish (-C /dev/null)
+
+       * Changed the way the config file is parsed, no longer source it
+       with the shell, this allows ybin.conf to be merged with
+       yaboot.conf at which point yaboot can live with unknown options in
+       its config file. 
+
+       * Use /etc/ybin.conf if it exists, if not use /etc/yaboot.conf for
+       ybin configuration.
+
+       * Merged ybin and mkofboot into one script, mkofboot shared 90% of
+       of its code with ybin anyway and this will make them much easier
+       to maintain. mkofboot is now a hard link to ybin (or a symlink if
+       you prefer, both will work)
+
+       * Added an experimental feature to generate a yaboot.conf on the
+       fly based on command line options.  The defaults should be
+       workable on a Debian system with an internal ATA disk, with the
+       root partition being the 3rd on the disk. Depends on mktemp for
+       creating the temporary file, Debian's mktemp is secure against
+       race conditions, use with caution if your distribution lacks a
+       secure mktemp utility. This option is activated with -c auto.
+
+       * No longer depends on bash. Works with Debian's
+       /bin/ash. Interpreter is now set to /bin/sh.
+
+       * Assorted cleanup, minor bug fixes.
+
+       * Added example yaboot.conf.
+       
+2000-02-04  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.10
+
+       * Added a simple multi-boot menu written by Benjamin Herrenschmidt.
+
+2000-01-17  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.9
+
+       * mkofboot was still broken. :-(
+
+
+2000-01-14  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.8
+
+       * Added a basic CHRP script ofboot.b to work around the problem of
+       OF refusing to load `tbxi' files unless they contain a CHRP boot
+       header. See README.ofboot.b for details.
+
+       * Updated default ybin.conf to install ofboot.b by default.
+       
+2000-01-13  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.7
+
+       * mkofboot: Check for hformat was broken. 
+
+2000-01-12  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.6
+
+       * mkofboot: Fixed problem where it was insisting that mkdosfs be
+       present even when using hfs filesystems if usemount=yes.
+
+       * mkofboot: Added proper checks for hformat or mkdosfs.
+       
+2000-01-09  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.5
+
+       * First public release.
+       
+       * Add TODO and BUGS files.
+
+       * mkofboot: Check to see if usemount=yes, and if so make sure we
+       are root before proceeding to erase the partition.
+
+       * ybin: Removed useless echo line. 
+       
+2000-01-05  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.4
+
+       * ybin (util_install): Fully support OF `wrappers' now: if a
+       wrapper is defined in the configuration file then the wrapper is
+       given the HFS file type specified instead of the bootfile, the
+       bootfile's type is set to "boot".  
+
+       * ybin: New configuration option `bless' when yes and are using
+       hfsutils we will `bless' the root directory of the bootstrap
+       filesystem so OF should be able to find and boot the system
+       without reconfiguration.
+
+       * mkofboot/ybin (checkconf): Add validation for the new `bless'
+       option. Also add check that the wrapper, if defined, exists and we
+       have permission to it.
+       
+2000-01-04  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.3.
+       
+       * ybin (util_install): Quote the filetype/creator arguments to
+       hattrib to prevent the shell from interpreting any meta-characters
+       in some cases. Also no longer try and set metadata on wrapper if
+       there is no wrapper.
+
+       * mkofboot: When creating hfs or dos filesystems give them volume
+       label of "bootstrap".
+       
+2000-01-03  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.2.
+
+       * mkofboot: added -w switch to grep when checking if a filesystem
+       is already mounted to prevent erroneous positive matches.
+
+       * ybin (util_install): Add check to make sure that the target
+       device is not mounted as a filesystem before mucking with it.
+
+       * Added changelog.
+       
+2000-01-01  Ethan Benson  <erbenson@alaska.net>
+
+       * Version 0.1.
+       
+       * first version.
+
+End:
diff --git a/doc/README.ofboot b/doc/README.ofboot
new file mode 100644 (file)
index 0000000..5d7bb33
--- /dev/null
@@ -0,0 +1,47 @@
+This is a new OpenFirmware CHRP script designed to be automatically
+configured by ybin.  It is more robust then previous CHRP scripts, it
+includes the following capabilities:
+
+* Multibooting GNU/Linux, MacOS 8.* or 9.* MacOSX, Darwin, direct from
+* CDROM, Network and into an OpenFirmware prompt.
+
+* Presenting a real menu of OS choices.
+
+* Automatic configuration by ybin.  This script should NOT be edited
+  by the user.  It should also not be used without ybin, its not
+  directly useable by OpenFirmware. 
+
+* Configurable colors.  (see the yaboot.conf(5) man page).
+
+The multiboot menu is only presented when an extra OS is defined in
+/etc/yaboot.conf, otherwise this script loads yaboot without any user
+interaction. 
+
+To enable a multi boot menu add bsd=ofpath and/or macos=ofpath and/or
+macosx=ofpath, and/or darwin=ofpath where ofpath is the OpenFirmware
+device path to the MacOS or MacOSX boot partition.  Example:
+macos=hd:10 you can also specify a unix device node, ie: /dev/hda5,
+and ybin will translate it automatically using ofpath.
+
+This script when presenting a dual boot menu will wait for a defined
+number of seconds before automatically booting the default OS.  Both
+this delay and the default OS can be configured in /etc/yaboot.conf.
+
+The delay is configured by adding delay=seconds.  Unlike timeout this
+is in seconds rather then 10ths of seconds.  This option has no effect
+on the yaboot boot: prompt timeout.  If delay= is not set, ybin will
+translate the value of timeout= to seconds and use that.
+
+The default OS is configured by adding defaultos=macos.  There is only
+four values that are acceptable: linux, bsd, macos, macosx and darwin.  The
+default is linux.  This should not be confused with yaboot's
+`default=' variable.
+
+The name and letter used to load MacOS or MacOSX (M and X
+respectively) cannot be be configured.  (others are D for Darwin, C
+for CDROM, N for network, and O for OpenFirmware)
+
+The Forth code in this script was written by Chris Emerson and iNOUE Koich!.  
+
+This script has only been formally tested on a Rev 1 Blue G3, a G4,
+and an ibook, please report any incompatibilities.
diff --git a/doc/README.ofpath b/doc/README.ofpath
new file mode 100644 (file)
index 0000000..2d5b9f8
--- /dev/null
@@ -0,0 +1,25 @@
+This utility is used to find the OpenFirmware device path to a unix
+device node (ie /dev/hda2).  
+
+Ofpath will work on Newworld PowerMacs only if yaboot is used as the
+bootloader, it will not work on newworld macs booted with BootX.
+
+Ofpath will also work on most Oldworld PowerMacs, unlike Newworld, it
+will work on BootX booted Oldworld machines. Note that oldworld
+support is not well tested and may not give accurate results.
+
+ofpath supports the following command line switches:
+
+      --debug                print boring junk only useful for debugging
+  -h, --help                 display this help and exit
+  -V, --version              output version information and exit
+
+Ybin will use this utility automatically to find the OpenFirmware
+device path when macos=, macosx= are set to unix device nodes in
+/etc/yaboot.conf, and/or if ofboot= is not defined.
+
+ofpath is based on show_of_path.sh written by Olaf Hering, this
+version unlike show_of_path.sh works with /bin/ash and is fully
+functional on stripped down systems such as boot or rescue floppies.
+It has been tested on the Debian GNU/Linux 2.2 (potato) boot
+floppies. 
diff --git a/doc/README.rs6000 b/doc/README.rs6000
new file mode 100644 (file)
index 0000000..67dd904
--- /dev/null
@@ -0,0 +1,80 @@
+RS/6000 yaboot Notes
+---------------------
+
+A. System Partitioning:
+   1. Only FDISK partitioning has been tested on the RS/6000.
+      However, yaboot does support mac partitions on a mac, so they should
+      work on an RS/6000 if you really want to go that route.
+   2. Extended FDISK partitions have not been tested and are not expected to
+      work at this time.
+   3. yaboot must be installed by itself in a bootable partition of type 0x41.
+      This partition must be less than 10MB.
+
+   Recommended partition configuration:
+      /dev/sda1 : PREP Boot.    Type 0x41. Size = 4 MB
+      /dev/sda2 : Linux swap.   Type 0x82. Size = 128 MB
+      /dev/sda3 : Linux native. Type 0x83.
+
+B. Building & Installation:
+   1. See the partitioning section for notes & examples on how to configure
+      your system partitions when installing Linux.
+   2. Build yaboot by doing:
+       make clean; make
+   3. Install yaboot by doing (as root):
+      dd if=yaboot of=/dev/sdax
+      where x is the boot partition; for example: dd if=yaboot of=/dev/sda1
+   4. Make a yaboot.conf file in /etc/yaboot.conf
+
+C. Configuration File (/etc/yaboot.conf):
+   1. See the ybin documentation for the full range of options.
+   2. Options tested on an RS/6000 include:
+      timeout = <time in tenths of a second>
+      default = <default label>
+      root= <device containing the root filesystem>
+      image = <path to vmlinux kernel file>
+      label = <short name for this image>
+
+   3. Examples:
+
+      ## example /etc/yaboot.conf for RS/6000
+      ## Timeout value is in tenths of a second
+      timeout=200
+      default=linux
+
+      image=/boot/vmlinux
+      label=linux
+      root=/dev/sda3
+
+      image=/boot/vmlinux.new
+      label=new
+      root=/dev/sda3
+
+
+D. Tested Configurations:
+   1. RS/6000 Model 150 (PPC 604e; CHRP IBM,7043-150)
+
+      fdisk -l /dev/sda
+
+      Disk /dev/sda: 64 heads, 32 sectors, 8678 cylinders
+      Units = cylinders of 2048 * 512 bytes
+
+         Device Boot    Start       End    Blocks   Id  System
+      /dev/sda1   *         1         9      9200   41  PPC PReP Boot
+      /dev/sda2            10      2010   2049024   83  Linux
+      /dev/sda3          2011      2139    132096   82  Linux swap
+
+   2. RS/6000 Model 260 (PPC 630; CHRP IBM,7043-260)
+
+      * Set "CONFIG_PPC64BRIDGE = y" in the Makefile!
+
+   3. RS/6000 Model F50 (PPC 630; CHRP IBM,7025-F50)
+
+
+E. Other Documentation:
+   1. The ybin distribution includes addition README files and
+      man pages.
+
+F. Questions & comments can be directed to:
+   engebret@us.ibm.com or
+   bergner@us.ibm.com
+
diff --git a/doc/examples/README.dualboot.chrp b/doc/examples/README.dualboot.chrp
new file mode 100644 (file)
index 0000000..a49d39b
--- /dev/null
@@ -0,0 +1,26 @@
+This script is deprecated in favor of a much nicer and more robust
+script ofboot, see README.ofboot for more information. 
+
+This script was written by Benjamin Herrenschmidt, I added a X to the
+OpenFirmware pathnames, you should replace that X with the proper
+partition number. for the MacOS line add the partition number of your
+MacOS partition, for the yaboot line add the partition number of your
+bootstrap partition, which should be the same partition you configure
+ybin to install on.
+
+Remember that the Mac partition table is considered a partition in and
+of itself, so partition number 1 is always the partition table. If the
+disk is shared with MacOS it needs to have a MacOS disk driver
+partition in which case the first `real' partition will probably be
+number 4.
+
+Edit this script before running ybin or mkofboot.
+
+If you have G4 hardware then your OpenFirmware may already have a
+graphical boot selector built in, this selector can be accessed by
+holding down the option key when booting the machine.  You should see
+a screen with buttons for each bootable partition.  This version of
+ofboot.b includes a badge icon, the button with a penguin icon is your
+bootstrap partition.  If you decide to use this built in selector you
+really do not need to use dualboot.chrp.  Thanks to Nicholas Humfrey
+for creating the Badge icon.
diff --git a/doc/examples/README.mbicons b/doc/examples/README.mbicons
new file mode 100644 (file)
index 0000000..677373f
--- /dev/null
@@ -0,0 +1,9 @@
+The file `large-penguin.mbicon' (mbicon == MultiBoot Icon) is an icon
+that will replace the disk-icon-with-small-penguin-badge in the
+OpenFirmware multi-boot screen (hold down option on AGP G4s and
+iBooks).  In order to use this copy an uncompressed copy somewhere,
+and add `icon=/path/to/large-penguin.mbicon' or whatever to
+/etc/yaboot.conf and run ybin.  You can add other types of icons so
+long as you put the proper bootinfo tags around them.
+
+This is unsupported and you are on your own.
diff --git a/doc/examples/README.simpleboot.chrp b/doc/examples/README.simpleboot.chrp
new file mode 100644 (file)
index 0000000..3413c71
--- /dev/null
@@ -0,0 +1,37 @@
+This is the old basic ofboot.b wrapper, it has been replaced by a more
+robust CHRP script that is able to dual or tri-boot GNU/Linux, MacOS,
+and MacOS X.  See README.ofboot.b for more information.
+
+OpenFirmware on newworld macs by default searches for HFS partitions
+with a `blessed' directory, and then checks for a file with an HFS
+filetype of `tbxi' if found it loads this file. Unfortunately OF is
+being far to picky about the format of this file, while it will load a
+ELF executable just fine when directed to, if the tbxi file it finds
+is just a plain ELF executable, as yaboot is, then it refuses to load
+it.  
+
+The best longterm solution is to embed a small CHRP boot script to the
+head of of the yaboot executable, but until we can find the right way
+to do that we can use a small wrapper instead. The file included
+called simple_ofboot.b does nothing more then run the OF command "boot
+hd:,\\yaboot" which should load the yaboot executable on most machines
+if you use the stock internal hard disk.  You might have to change
+that device path (hd:) to match the device path to your bootstrap
+partition, such as hd:2,\\yaboot.  Or you can dispense with the
+wrapper altogether and reset the boot-device variable in OF to point
+directly at the yaboot executable and that will work too.  This
+wrapper just allows for most (hopefully) machines to boot
+transparently without any OF reconfiguration.
+
+If you have G4 hardware then your OpenFirmware may already have a
+graphical boot selector built in, this selector can be accessed by
+holding down the option key when booting the machine.  You should see
+a screen with buttons for each bootable partition.  This version of
+ofboot.b includes a badge icon, the button with a penguin icon is your
+bootstrap partition.  If you decide to use this built in selector you
+really do not need to use the menu_ofboot.b script provided in this
+package. Thanks to Nicholas Humfrey for creating the Badge icon.
+
+Hopefully soon these problems will have better solutions at some
+point. If you happen to know OF well and have any suggestions they are
+most welcome!
diff --git a/doc/examples/dualboot.chrp b/doc/examples/dualboot.chrp
new file mode 100644 (file)
index 0000000..3cfbb23
--- /dev/null
@@ -0,0 +1,68 @@
+<CHRP-BOOT>
+<COMPATIBLE>
+MacRISC
+</COMPATIBLE>
+<DESCRIPTION>
+GNU/Linux PowerPC Boot chooser
+</DESCRIPTION>
+<BOOT-SCRIPT>
+" get-key-map" " keyboard" open-dev $call-method
+dup 20 dump
+5 + c@ 08 = if
+" Booting MacOS ..." cr " boot hd:X,\\:tbxi" eval
+else
+" Booting Yaboot ..." cr " boot hd:X,yaboot" eval
+then
+</BOOT-SCRIPT>
+<OS-BADGE-ICONS>
+1010
+000000000000F8FEACF6000000000000
+0000000000F5FFFFFEFEF50000000000
+00000000002BFAFEFAFCF70000000000
+0000000000F65D5857812B0000000000
+0000000000F5350B2F88560000000000
+0000000000F6335708F8FE0000000000
+00000000005600F600F5FD8100000000
+00000000F9F8000000F5FAFFF8000000
+000000008100F5F50000F6FEFE000000
+000000F8F700F500F50000FCFFF70000
+00000088F70000F50000F5FCFF2B0000
+0000002F582A00F5000008ADE02C0000
+00090B0A35A62B0000002D3B350A0000
+000A0A0B0B3BF60000505E0B0A0B0A00
+002E350B0B2F87FAFCF45F0B2E090000
+00000007335FF82BF72B575907000000
+000000000000ACFFFF81000000000000
+000000000081FFFFFFFF810000000000
+0000000000FBFFFFFFFFAC0000000000
+000000000081DFDFDFFFFB0000000000
+000000000081DD5F83FFFD0000000000
+000000000081DDDF5EACFF0000000000
+0000000000FDF981F981FFFF00000000
+00000000FFACF9F9F981FFFFAC000000
+00000000FFF98181F9F981FFFF000000
+000000ACACF981F981F9F9FFFFAC0000
+000000FFACF9F981F9F981FFFFFB0000
+00000083DFFBF981F9F95EFFFFFC0000
+005F5F5FDDFFFBF9F9F983DDDD5F0000
+005F5F5F5FDD81F9F9E7DF5F5F5F5F00
+0083DD5F5F83FFFFFFFFDF5F835F0000
+000000FBDDDFACFBACFBDFDFFB000000
+000000000000FFFFFFFF000000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFFFF00000000
+00000000FFFFFFFFFFFFFFFFFF000000
+00000000FFFFFFFFFFFFFFFFFF000000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFF000000
+</OS-BADGE-ICONS>
+</CHRP-BOOT>
diff --git a/doc/examples/large-penguin.mbicon b/doc/examples/large-penguin.mbicon
new file mode 100644 (file)
index 0000000..754493a
--- /dev/null
@@ -0,0 +1,259 @@
+<OS-VOLUME-ICONS>
+00400040
+818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181FB
+812B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2BF8AC
+812B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002BFAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F8FBFEFFFFFDFB56F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFFFFFFFFFFFFFFFFFC2BF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFFFFFFFFFFFFFFACFBFEFD2BF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7FFFFFFFFFFFFFFFFFCFBFDFFFBF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F681FFFFFFFFFFFFFFFFFEFFFFFFFFF7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFFFFFFFFFFFFFFFFFFFFFFFFFF81F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FCFFFEFEFEFFFFFFFDACACFFFFFFACF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FCFEF956FDFFFFFBF8F7FAFEFFFFFDF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FCFCF82BF9FFFEF6F8F82BFDFFFFFFF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F68181FEFBF7FEACF6FFACF881FFFFFFF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F681FCACFE335F8357FFFF56FAFFFFFFF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F681FE565F0B0B2F2E595E2BFDFFFFFFF7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F9FE5F110B0B0A0A2F2F2FADFFFFFF56F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F989350B0B0B0A2F2F353589FFFFFFF9F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F9FE5F0B0B0A2F59353535FDFEFCFEACF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F8AC565F353535353533F7FAFF8181FF56F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FAACF7565F3B5F34F82BF5F6FEFEFDFFACF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7FEFCF5F7F7F8F7F7F6F50000FAFFFFFFFFF9F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6ACFEF700F6F7F72BF500000000F6FEFFFFFFFE2BF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFFFA000000F5F5F500000000000081FFFFFFFFFCF6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FFFEF6000000000000000000000000F8FFFFFFFFFF81F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7FEFFFCF6000000F5F5000000F5F5F5F6F5FEFFFFFFFFFF56F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6ACFFFFFAF7F50000F5F5000000F5F62BF72BF9FFFEFFFFFFFE2BF6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F7FFFEFE2BF5000000F5000000000000F5F52BF6FEFFFDFFFFFF81F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FAFEFEFAF500000000000000000000000000F5F6F9FFFEFEFFFFFE2BF6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FDFDFEF600000000000000000000000000000000F6FEACFDFEFFFF56F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F8FFFEFA0000000000F5F50000000000000000000000FCFEFFFDFFFFFCF6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFEFFF60000000000F500000000000000000000000081FFFFFEFFFFFE2BF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F62BE0FEAC000000000000F5000000000000000000000000FAFFFFFEFFFFFF56F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6FBFFFE81000000000000F500000000000000000000000056FFFFFEFFFFFF81F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F656FFFFFD81000000000000F500000000000000000000000056FFFFFEFFFFFFFCF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6FAFFFEACF9000000000000F5000000000000000000000000F8FFFEFFFFFFFFFBF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6FAE089FDF8000000000000F5000000000000000000000000F9FEFEFEFEFEFF81F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F62C350B59FCF60000000000F50000000000000000000001085EFFFFFFFFFDFEF9F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6340B0B0B59AC2B00000000F5000000000000000000000A0B34FFFFFFFFFE592DF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F633350B0B0B0B83FEF8000000F5000000000000000000F52E0B35E0FFFFFF830B0AF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F62C3334350B0B0B0B0B2FFEFF560000000000000000000000F52B340B355FADAD83350B0AF6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F634110B0B0B0B0B0B0B0B0B5FFFFF81F5000000000000000000F52B341135353535350B0B0B09F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6340B0B0B0B0B0B0B0B0B0B0BADFFFF56000000000000000000002B5835113535350B0B0B0B0B08F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6330B0B0B0B0B0B0B0B0B0B0B35E0FF5600000000000000000000F85F350B0B0B0B0B0B0B0B0B0B09F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F633110B0B0B0B0B0B0B0B0B0B0B582B00000000000000000000F8FE5F350B0B0B0B0B0B0B0B0B0B0B0AF6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F633110B0B0B0B0B0B0B0B0B0B0B2F2C0000000000000000F581FFE05F350B0B0B0B0B0B0B0B0B0B0B08F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F634110B0B0B0B0B0B0B0B0B0B0B355FF8F5000000F52BF9FDFFFFFE5F350B0B0B0B0B0B0B0B0B0A2CF6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6353535110B0B0B0B0B0B0B0B0B353BADFEACFCFDFFFFFFFFFFFFAD3B350B0B0B0B0B0B0B342CF6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F63335353535353535110B0B0B0B355FADFFFFFFFFFFFFFFFFFFFFAD5F35110B0B11353533F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F733585F5F3B35353535355F5FADFDFCFB818181818181FCAC5F3B353535355F32F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F62BF8575E5F5F5F5F8382F8F6F6F6F6F6F6F6F6F6F6F8895F5F3B5F5FF7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F75D83895D2BF6F6F6F6F6F6F6F6F6F6F6F6568889895DF7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B00F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F656FAAC
+812B2B5656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656FAAC
+81F8FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAAC
+FBACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC
+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFD
+FEFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFAFC
+FEFC8181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181F9F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981ACFEFFFFFEAC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFFFACFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFACFBFEFEFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFFFFFFFFFFFFFFFCFBFDFFACF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFFFFFFFFFFFFFFFFFEFFFFFFFFFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFFFEFEFEFFFFFFFDACACFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFEF956FDFFFFFBF8F7FAFEFFFFFEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFCF82BF9FFFEF6F8F82BFDFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FC81FEFBF7FEACF6FFACF881FFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFCACFE335F8357FFFF56FAFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFE565F0B0B2F2E595E2BFDFFFFFFFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBFE5F110B0B0A0A2F2F2FADFFFFFF81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FB89350B0B0B0A2F2F353589FFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBFE5F0B0B0A2F59353535FDFEFCFEFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981AC565F353535353533F7FAFF8181FFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCACF7565F3B5F34F82BF5F6FEFEFDFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFCF5F7F7F8F7F7F6F50000FAFFFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFEF700F6F7F72BF500000000F6FEFFFFFFFEFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFA000000F5F5F500000000000081FFFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981FFFEF6000000000000000000000000F8FFFFFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFEFFFCF6000000F5F5000000F5F5F5F6F5FEFFFFFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFFFFFAF7F50000F5F5000000F5F62BF72BF9FFFEFFFFFFFEFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFEFE2BF5000000F5000000000000F5F52BF6FEFFFDFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFEFEFAF500000000000000000000000000F5F6F9FFFEFEFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEFDFEF600000000000000000000000000000000F6FEACFDFEFFFF81F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981FFFEFA0000000000F5F50000000000000000000000FCFEFFFDFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFEFFF60000000000F500000000000000000000000081FFFFFEFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFEAC000000000000F5000000000000000000000000FAFFFFFEFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFE81000000000000F500000000000000000000000056FFFFFEFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F981FFFFFD81000000000000F500000000000000000000000056FFFFFEFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9FCFFFEACF9000000000000F5000000000000000000000000F8FFFEFFFFFFFFACF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9FCE089FDF8000000000000F5000000000000000000000000F9FEFEFEFEFEFFFCF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F957350B59FCF60000000000F50000000000000000000001085EFFFFFFFFFDFEFBF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9340B0B0B59AC2B00000000F5000000000000000000000A0B34FFFFFFFFFE592EF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F958350B0B0B0B83FEF8000000F5000000000000000000F52E0B35E0FFFFFF830B2EF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9573434350B0B0B0B0B2FFEFF560000000000000000000000F52B340B355FADAD83350B0BF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F934110B0B0B0B0B0B0B0B0B5FFFFF81F5000000000000000000F52B341135353535350B0B0B34F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9340B0B0B0B0B0B0B0B0B0B0BADFFFF56000000000000000000002B5835113535350B0B0B0B0B33F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9340B0B0B0B0B0B0B0B0B0B0B35E0FF5600000000000000000000F85F350B0B0B0B0B0B0B0B0B0B34F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F934110B0B0B0B0B0B0B0B0B0B0B582B00000000000000000000F8FE5F350B0B0B0B0B0B0B0B0B0B0B2EF9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F934110B0B0B0B0B0B0B0B0B0B0B2F2C0000000000000000F581FFE05F350B0B0B0B0B0B0B0B0B0B0B33F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F934110B0B0B0B0B0B0B0B0B0B0B355FF8F5000000F52BF9FDFFFFFE5F350B0B0B0B0B0B0B0B0B3457F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9353535110B0B0B0B0B0B0B0B0B353BADFEACFCFDFFFFFFFFFFFFAD3B350B0B0B0B0B0B0B3457F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9585F353535353535110B0B0B0B355FADFFFFFFFFFFFFFFFFFFFFAD5F35110B0B1135355EF9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9FA5D5E5F5F3B35353535355F5FADFEFDACFCFCFCFCFCFCACAD5F3B353535355F5DF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9FA82825F5F5F5F838981F9F9F9F9F9F9F9F9F9F981895F5F3B5F5FFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FA82898982FAF9F9F9F9F9F9F9F9F9F9F9F98189898982FAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFCF95656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656F7FC
+FEFAF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FC
+FDFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC
+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFD
+FEFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFAFC
+FEFC8181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181F9F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981ACFEFFFFFEAC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFFFACFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFFDACFEFEFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFFFFFFFFFFFFFFFDACFEFFACF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFFFFFFFFFFFFFFFFFEFFFFFFFFFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFFFFFEFEFFFFFFFEFDFDFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFEFBFBFEFFFFAC81FAFCFFFFFFFEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDAC81FAFBFFFEF98181FAFEFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFCFEACFAFEFDF9FFFD81FCFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFDFDFE8289AD82FFFFFBFCFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFF81895F5F5F5F8388FAFEFFFFFFFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBE0895F5F5F5E5E5F5F5FADFFFFFF81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBAD835F5F5F5E5F5F8383ADFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FBE0895F5F5F8383835F83FEF4ACFEFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981FDFB89838383838382FAFCFFACACFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFDFAFB8989898281FAF9F9FEFFFEFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFDF9FA818181FAF9565656FCFFFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFEFA56F9FAFAFAF956565656F9FEFFFFFFFFFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFC565656F9F956565656565656ACFFFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981FFFEF956565656565656565656565681FFFFFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFEFFFDF9565656F9F956565656F9F9F9F9FEFFFFFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FDFFFFFCFAF95656F956565656F9F9FAFAFAFBFFFEFFFFFFFEFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFEFEFA565656565656565656565656F9FAF9FEFFFEFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FCFFFEFC565656565656565656565656565656F9FBFFFEFEFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEFEFEF956565656565656565656565656565656F9FEFDFEFFFFFF81F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F981FFFEFC565656565656565656565656565656565656FDFFFFFEFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFEFFF95656565656F9565656565656565656565656ACFFFFFEFFFFFFF9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFFFEFD565656565656F9565656565656565656565656FCFFFFFEFFFFFFFBF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9ACFFFEFC565656565656F9565656565656565656565656FBFFFFFEFFFFFFFCF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F981FFFFFEFC565656565656F9565656565656565656565656FBFFFFFEFFFFFFFDF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9FCFFFFFDFB565656565656F956565656565656565656565681FFFEFFFFFFFFACF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9FCE0ADFE81565656565656F9565656565656565656565656FBFFFEFFFEFEFFFCF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9815F5F83ACF95656565656F956565656565656565656F95788FFFFFFFFFEFEFBF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F95F5F5F5F83FDFA56565656F9565656565656565656565E5F83FFFFFFFFE0835EF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9825F5F5F5F5FADFE8156565656565656565656565656565E5F83FFFFFFFFAD5F5FF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F95D5E835F5F5F5F5F5F5FE0FFFB565656565656565656565656FA5E5F8389DFDFAD5F5F5FF9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9825F5F5F5F5F5F5F5F5F5F89FFFFACF956565656565656565656FA825F5F8383835F5F5F5F5EF9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9825F5F5F5F5F5F5F5F5F5F5FADFFFFFB56565656565656565656FA825F5F5F5F5F5F5F5F5F5F5DF9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F95E5F5F5F5F5F5F5F5F5F5F5F83E0FFFB5656565656565656565681895F5F5F5F5F5F5F5F5F5F5F5EF9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9825F5F5F5F5F5F5F5F5F5F5F5F83FA5656565656565656565681E0895F5F5F5F5F5F5F5F5F5F5F5F5EF9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F95E5F5F5F5F5F5F5F5F5F5F5F5F5F815656565656565656F9FCFFE0895F5F5F5F5F5F5F5F5F5F5F5F5DF9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F95E5F5F5F5F5F5F5F5F5F5F5F5F5F89815656565656FAFBFEFFFFE0895F5F5F5F5F5F5F5F5F5F5FFAF9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F95F5F5F5F5F5F5F5F5F5F5F5F5F5F89E0FEFDFDFEFFFFFFFFFFFFDF895F5F5F5F5F5F5F5F5F5DF9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F98283838383835F5F5F5F5F5F5F8389DFFFFFFFFFFFFFFFFFFFFFDF89835F5F5F5F5F8382F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9FA828289898983835F5F838989E0FEFDACFCFCFCFCFCFCACFD8989838383838981F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F981828889898989ADAD81F9F9F9F9F9F9F9F9F9F981AD8989898989FAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FAFCADADFCFAF9F9F9F9F9F9F9F9F9F9F9F9FBADADADFCFAF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFC81F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F956F7FC
+FEFCF95656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656F7FC
+FEFAF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7FC
+FDFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+</OS-VOLUME-ICONS>
diff --git a/doc/examples/simpleboot.chrp b/doc/examples/simpleboot.chrp
new file mode 100644 (file)
index 0000000..af176e8
--- /dev/null
@@ -0,0 +1,62 @@
+<CHRP-BOOT>
+<COMPATIBLE>
+MacRISC
+</COMPATIBLE>
+<DESCRIPTION>
+GNU/Linux PPC bootloader
+</DESCRIPTION>
+<BOOT-SCRIPT>
+boot hd:,\\yaboot
+</BOOT-SCRIPT>
+<OS-BADGE-ICONS>
+1010
+000000000000F8FEACF6000000000000
+0000000000F5FFFFFEFEF50000000000
+00000000002BFAFEFAFCF70000000000
+0000000000F65D5857812B0000000000
+0000000000F5350B2F88560000000000
+0000000000F6335708F8FE0000000000
+00000000005600F600F5FD8100000000
+00000000F9F8000000F5FAFFF8000000
+000000008100F5F50000F6FEFE000000
+000000F8F700F500F50000FCFFF70000
+00000088F70000F50000F5FCFF2B0000
+0000002F582A00F5000008ADE02C0000
+00090B0A35A62B0000002D3B350A0000
+000A0A0B0B3BF60000505E0B0A0B0A00
+002E350B0B2F87FAFCF45F0B2E090000
+00000007335FF82BF72B575907000000
+000000000000ACFFFF81000000000000
+000000000081FFFFFFFF810000000000
+0000000000FBFFFFFFFFAC0000000000
+000000000081DFDFDFFFFB0000000000
+000000000081DD5F83FFFD0000000000
+000000000081DDDF5EACFF0000000000
+0000000000FDF981F981FFFF00000000
+00000000FFACF9F9F981FFFFAC000000
+00000000FFF98181F9F981FFFF000000
+000000ACACF981F981F9F9FFFFAC0000
+000000FFACF9F981F9F981FFFFFB0000
+00000083DFFBF981F9F95EFFFFFC0000
+005F5F5FDDFFFBF9F9F983DDDD5F0000
+005F5F5F5FDD81F9F9E7DF5F5F5F5F00
+0083DD5F5F83FFFFFFFFDF5F835F0000
+000000FBDDDFACFBACFBDFDFFB000000
+000000000000FFFFFFFF000000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFFFF00000000
+00000000FFFFFFFFFFFFFFFFFF000000
+00000000FFFFFFFFFFFFFFFFFF000000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFF000000
+</OS-BADGE-ICONS>
+</CHRP-BOOT>
diff --git a/doc/examples/yaboot.conf.multi-boot b/doc/examples/yaboot.conf.multi-boot
new file mode 100644 (file)
index 0000000..0bbeaeb
--- /dev/null
@@ -0,0 +1,112 @@
+## Example yaboot.conf for ybin and yaboot >= 0.6
+## see man yaboot.conf for more details.
+
+## This example shows how to multi boot GNU/Linux, MacOS, MacOSX, and
+## Darwin with SCSI disks.  This example also creates menu items for
+## booting from the CDROM, the Network and into an OpenFirmware
+## prompt.
+
+## Change to your bootstrap partition ie: /dev/sda2
+boot=unconfigured
+
+## device is the OpenFirmware device path to the disk containing
+## kernel images.  if your disk is /dev/hda you can find the
+## OpenFirmware path by running the command:  ofpath /dev/hda
+
+device=/pci@80000000/pci-bridge@d/ADPT,2930CU@2/@1:
+
+## partition is the partition number where the kernel images are
+## located.  The kernel images should be on your root filesystem, so
+## this is usually the same partition number as your root filesystem.
+## so if root = /dev/hda3 (the 3rd partition) then you should have
+## partition=3  This *MUST* be set correct or yaboot won't boot!  This
+## option can be either set globally as shown here, or per image in
+## the image= sections.
+
+partition=3
+
+## delay is the amount of time in seconds the dual boot menu (if one
+## is configured, by the presense of macos, macosx, etc options here)
+## will wait before choosing the default OS (GNU/Linux or the value of
+## defaultos=).  If you omit this then the value of timeout=
+## (converted to seconds) will be used.
+
+delay=10
+
+## timeout is the amount of time in tenths of a second that yaboot
+## will wait before booting the default kernel image (the first image=
+## section in this config file or the value of default=).  
+
+timeout=20
+install=/usr/local/lib/yaboot/yaboot
+magicboot=/usr/local/lib/yaboot/ofboot
+
+## Change the default colors, fgcolor is the text color, bgcolor is
+## the screen background color. (default: fgcolor=white, bgcolor=black)
+fgcolor=black
+bgcolor=green
+
+## Password supplied in plaintext, required for yaboot to boot, unless
+## restricted is also present (see below).  Be sure to
+## chmod 600 /etc/yaboot.conf if you set this!
+
+#password=secret
+
+## Password supplied as an md5 hash, see above
+
+#password=$1$saltstri$WHZcnT3IOdSrMvizOq7Ht1
+
+## A password is only required to boot an image specified here if
+## parameters are specified on the command line or if the user enters
+## an image is not specified in the configuration file at all (ie.
+## arbitrary file load).  restricted can also be placed in an image
+## section in that case any image not including the restricted keyword
+## will be fully password protected.
+
+#restricted
+
+## image is the kernel itself, commonly kept in / but also commonly
+## found in /boot.  Note that /boot should generally not be its own
+## partition on powerpcs, its not necessary and complicates things.
+## Make sure /boot is on the partition specified by partition= see
+## above. /boot should never be an HFS filesystem.  You may point
+## image= to a symbolic link so long as the symlink does not cross
+## partition boundries.
+
+image=/vmlinux
+       label=Linux
+       root=/dev/sda3
+       read-only
+
+image=/vmlinux.old
+       label=Linux.old
+       root=/dev/sda3
+       read-only
+
+## The {macos,macosx,darwin} variables can be either a unix /dev node or an
+## OpenFirmware path, as shown here:
+
+## if you have the bsd bootloader installed on ybin bootstrap
+## partition as ofwboot.elf
+bsd=/dev/sda2
+
+## unix node
+macos=/dev/sda8
+
+## OpenFirmware path, this would likely be /dev/sda9 if you used a
+## unix node instead.
+macosx=/pci@80000000/pci-bridge@d/ADPT,2930CU@2/@1:9
+
+darwin=/pci@80000000/pci-bridge@d/ADPT,2930CU@2/@1:10
+
+## Add a menu entry to boot from the CDROM:
+
+enablecdboot
+
+## Add a menu entry to boot from the Network:
+
+enablenetboot
+
+## Add a menu entry to boot into an OpenFirmware prompt:
+
+enableofboot
diff --git a/doc/examples/yaboot.conf.rs6k b/doc/examples/yaboot.conf.rs6k
new file mode 100644 (file)
index 0000000..b9f9a44
--- /dev/null
@@ -0,0 +1,72 @@
+## Example yaboot.conf for ybin and yaboot >= 0.6
+## see man yaboot.conf for more details.
+
+## Change `unconfigured' to your bootstrap partition ie: /dev/hda2
+boot=unconfigured
+
+## fstype=raw is what makes ybin dd yaboot to the bootstrap partition
+## instead of using a filesystem. 
+
+fstype=raw
+
+## device is the OpenFirmware device path to the disk containing
+## kernel images.  if your disk is /dev/hda you can find the
+## OpenFirmware path by running the command: ofpath /dev/hda DO NOT
+## specify a partition number for this!  This is generally not
+## necessary for IBM hardware
+
+#device=hd:
+
+## partition is the partition number where the kernel images are
+## located.  The kernel images should be on your root filesystem, so
+## this is usually the same partition number as your root filesystem.
+## so if root = /dev/hda3 (the 3rd partition) then you should have
+## partition=3  This *MUST* be set correct or yaboot won't boot!  This
+## option can be either set globally as shown here, or per image in
+## the image= sections
+
+partition=3
+
+## timeout is the amount of time in tenths of a second that yaboot
+## will wait before booting the default kernel image (the first image=
+## section in this config file or the value of default=).  
+
+timeout=20
+install=/usr/local/lib/yaboot/yaboot
+
+## nonvram is required for IBM hardware currently since ofpath does
+## not support them, it is also probably not necessary.
+
+nonvram
+
+## Password supplied in plaintext, required for yaboot to boot, unless
+## restricted is also present (see below).  Be sure to
+## chmod 600 /etc/yaboot.conf if you set this!
+
+#password=secret
+
+## Password supplied as an md5 hash, see above
+
+#password=$1$saltstri$WHZcnT3IOdSrMvizOq7Ht1
+
+## A password is only required to boot an image specified here if
+## parameters are specified on the command line or if the user enters
+## an image is not specified in the configuration file at all (ie.
+## arbitrary file load).  restricted can also be placed in an image
+## section in that case any image not including the restricted keyword
+## will be fully password protected.
+
+#restricted
+
+## image is the kernel itself, commonly kept in / but also commonly
+## found in /boot.  Note that /boot should generally not be its own
+## partition on powerpcs, its not necessary and complicates things.
+## Make sure /boot is on the partition specified by partition= see
+## above.  /boot should never be an HFS filesystem.  You may point
+## image= to a symbolic link so long as the symlink does not cross
+## partition boundries.
+
+image=/vmlinux
+       label=Linux
+       root=/dev/sda3
+       read-only
diff --git a/etc/yaboot.conf b/etc/yaboot.conf
new file mode 100644 (file)
index 0000000..5d19f94
--- /dev/null
@@ -0,0 +1,81 @@
+## Example yaboot.conf for ybin and yaboot >= 0.6
+## see man yaboot.conf for more details.
+
+## Change `unconfigured' to your bootstrap partition eg: /dev/hda2
+boot=unconfigured
+
+## device is the OpenFirmware device path to the disk containing
+## kernel images.  if your disk is /dev/hda you can find the
+## OpenFirmware path by running the command: ofpath /dev/hda DO NOT
+## specify a partition number for this!  On IBM hardware you can
+## generally comment this out.
+
+device=hd:
+
+## partition is the partition number where the kernel images are
+## located.  The kernel images should be on your root filesystem, so
+## this is usually the same partition number as your root filesystem.
+## so if root = /dev/hda3 (the 3rd partition) then you should have
+## partition=3  This *MUST* be set correct or yaboot won't boot!  This
+## option can be either set globally as shown here, or per image in
+## the image= sections
+
+partition=3
+
+## delay is the amount of time in seconds the dual boot menu (if one
+## is configured, by the presense of macos, macosx, etc options here)
+## will wait before choosing the default OS (GNU/Linux or the value of
+## defaultos=).  If you omit this then the value of timeout=
+## (converted to seconds) will be used.
+
+delay=10
+
+## timeout is the amount of time in tenths of a second that yaboot
+## will wait before booting the default kernel image (the first image=
+## section in this config file or the value of default=).  
+
+timeout=40
+install=/usr/local/lib/yaboot/yaboot
+magicboot=/usr/local/lib/yaboot/ofboot
+
+## Change the default colors, fgcolor is the text color, bgcolor is
+## the screen background color. (default: fgcolor=white, bgcolor=black)
+#fgcolor=black
+#bgcolor=green
+
+## Password supplied in plaintext, required for yaboot to boot, unless
+## restricted is also present (see below). Be sure to
+## chmod 600 /etc/yaboot.conf if you set this!
+
+#password=secret
+
+## Password supplied as an md5 hash, see above
+
+#password=$1$saltstri$WHZcnT3IOdSrMvizOq7Ht1
+
+## A password is only required to boot an image specified here if
+## parameters are specified on the command line or if the user enters
+## an image is not specified in the configuration file at all (ie.
+## arbitrary file load).  restricted can also be placed in an image
+## section in that case any image not including the restricted keyword
+## will be fully password protected.
+
+#restricted
+
+## image is the kernel itself, commonly kept in / but also commonly
+## found in /boot.  Note that /boot should generally not be its own
+## partition on powerpcs, its not necessary and complicates things.
+## Make sure /boot is on the partition specified by partition= see
+## above.  /boot should never be an HFS filesystem.  You may point
+## image= to a symbolic link so long as the symlink does not cross
+## partition boundries.
+
+image=/vmlinux
+       label=Linux
+       root=/dev/hda3
+       read-only
+
+image=/vmlinux.old
+       label=Linux.old
+       root=/dev/hda3
+       read-only
diff --git a/first/ofboot b/first/ofboot
new file mode 100644 (file)
index 0000000..fc6b08a
--- /dev/null
@@ -0,0 +1,345 @@
+#%ybinscript-1.1
+
+## THIS IS NOT A CONFFILE DO NOT EDIT !!!
+
+###############################################################################
+##
+## ofboot first stage autoconfiguring bootloader for yaboot and ybin
+## Copyright (C) 2000, 2001 Ethan Benson
+##
+## Forth code written by Chris Emerson
+##
+## Copyright (C) 2000, 2001 Chris Emerson
+##
+## Portions of Forth code also written by iNOUE Koich!
+##
+## Copyright (C) 2000, 2001 iNOUE Koich!
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License
+## as published by the Free Software Foundation; either version 2
+## of the License, or (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+##
+###############################################################################
+
+## THIS IS NOT A CONFFILE DO NOT EDIT !!!
+##
+## This script is not meant to be called directly, only by ybin.
+##
+## Usage: OS-count defaultos timeout fgc bgc osname oslabel oskey osdev osfile ...
+
+DEBUG=0
+PRG=ofboot
+
+## make sure we are called at least somewhat sanely.
+if [ $# = 0 ] ; then
+    echo 1>&2 "$PRG: Need arguments"
+    exit 1
+fi
+
+if [ $# != "$(($1 * 5 + 5))" ] ; then
+    echo 1>&2 "$PRG: Invalid argument count: $# should be $(($1 * 5 + 5))"
+    exit 1
+fi
+
+if [ "$1" -gt 8 ] ; then
+    echo 1>&2 "$PRG: Maximum number of OSes is currently 8"
+    exit 1
+fi
+
+## we need printf so \n works, but echo -e -n will sometimes do.
+if [ "$(printf printf_test 2>/dev/null)" = printf_test ] ; then
+    PRINTF=printf
+else
+    PRINTF="echo -e -n"
+fi
+
+## make sure echo is not lame if we must use it.
+if [ "$PRINTF" != printf ] ; then
+    if [ "$(echo -e -n echo_test)" != echo_test ] ; then
+       echo 1>&2 "$PRG: printf unavailable and echo is broken, sorry."
+       exit 1
+    fi
+fi
+
+## get first 5 args which are global and dispose of them.
+OSNUM="$1"
+DEFAULTOS="$2"
+TIMEOUT="$3"
+FGCOLOR="$4"
+BGCOLOR="$5"
+shift 5
+
+## is a boot menu actually needed?
+if [ "$OSNUM" = 1 ] ; then
+    MENU=0
+else
+    MENU=1
+fi
+
+## create the variables.
+##
+## OSNAME="$1"
+## OSLABEL="$2"
+## OSKEY="$3"
+## OSDEV="$4"
+## OSFILE="$5"
+
+COUNT=1
+while [ "$COUNT" -le "$OSNUM" ] ; do
+    case "$COUNT" in
+       1)
+       OSNAME1="$1"
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file1: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       BTYA=": boot$1 \" Loading second stage bootstrap...\" .printf 100 ms load-base release-load-area \" ${4}${5}\" \$boot ;"
+       MENUYA="\" Press $3 for GNU/Linux${c-,}\"(0d 0a)\" .printf"
+       GETYA="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       2)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file2: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT2=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU2="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET2="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       3)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file3: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT3=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU3="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET3="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       4)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file4: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT4=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU4="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET4="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       5)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file5: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT5=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU5="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET5="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       6)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file6: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT6=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU6="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET6="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       7)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file7: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT7=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU7="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET7="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+       8)
+       [ "$DEBUG" = 1 ] && $PRINTF 1>&2 "$PRG: DEBUG: file8: $5\n"
+       [ "$COUNT" = "$OSNUM" ] && c="."
+       [ "$4" = "quit" ] && BOOT=quit || BOOT="load-base release-load-area \" ${4}${5}\" \$boot"
+       BT8=": boot$1 \" Booting $2...\" .printf 100 ms $BOOT ;"
+       MENU8="\"       $3 for $2${c-,}\"(0d 0a)\" .printf"
+       GET8="      ascii $3 of \" $3 \"(0d 0a)\" .printf boot$1 endof"
+       shift 5
+       COUNT="$(($COUNT + 1))"
+       ;;
+    esac
+done
+
+## first OS is reserved.
+if [ "$OSNAME1" != yaboot ] ; then
+    echo 1>&2 "ofboot: first OS must be yaboot"
+    exit 1
+fi
+
+## concatenate the variables together.
+case "$OSNUM" in
+    1)
+    BOOTVARS="${BTYA}"
+    MENUOPTS="${MENUYA}"
+    GETOS="${GETYA}"
+    ;;
+    2)
+    BOOTVARS="${BTYA}\n${BT2}"
+    MENUOPTS="${MENUYA}\n${MENU2}"
+    GETOS="${GETYA}\n${GET2}"
+    ;;
+    3)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}"
+    ;;
+    4)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}\n${BT4}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}\n${MENU4}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}\n${GET4}"
+    ;;
+    5)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}\n${BT4}\n${BT5}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}\n${MENU4}\n${MENU5}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}\n${GET4}\n${GET5}"
+    ;;
+    6)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}\n${BT4}\n${BT5}\n${BT6}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}\n${MENU4}\n${MENU5}\n${MENU6}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}\n${GET4}\n${GET5}\n${GET6}"
+    ;;
+    7)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}\n${BT4}\n${BT5}\n${BT6}\n${BT7}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}\n${MENU4}\n${MENU5}\n${MENU6}\n${MENU7}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}\n${GET4}\n${GET5}\n${GET6}\n${GET7}"
+    ;;
+    8)
+    BOOTVARS="${BTYA}\n${BT2}\n${BT3}\n${BT4}\n${BT5}\n${BT6}\n${BT7}\n${BT8}"
+    MENUOPTS="${MENUYA}\n${MENU2}\n${MENU3}\n${MENU4}\n${MENU5}\n${MENU6}\n${MENU7}\n${MENU8}"
+    GETOS="${GETYA}\n${GET2}\n${GET3}\n${GET4}\n${GET5}\n${GET6}\n${GET7}\n${GET8}"
+    ;;
+esac
+
+if [ -n "$YBINOFICON" -a -f "$YBINOFICON" -a -r "$YBINOFICON" ] ; then
+    OFBOOTICON="$(cat "$YBINOFICON")"
+else
+    OFBOOTICON="<OS-BADGE-ICONS>
+1010
+000000000000F8FEACF6000000000000
+0000000000F5FFFFFEFEF50000000000
+00000000002BFAFEFAFCF70000000000
+0000000000F65D5857812B0000000000
+0000000000F5350B2F88560000000000
+0000000000F6335708F8FE0000000000
+00000000005600F600F5FD8100000000
+00000000F9F8000000F5FAFFF8000000
+000000008100F5F50000F6FEFE000000
+000000F8F700F500F50000FCFFF70000
+00000088F70000F50000F5FCFF2B0000
+0000002F582A00F5000008ADE02C0000
+00090B0A35A62B0000002D3B350A0000
+000A0A0B0B3BF60000505E0B0A0B0A00
+002E350B0B2F87FAFCF45F0B2E090000
+00000007335FF82BF72B575907000000
+000000000000ACFFFF81000000000000
+000000000081FFFFFFFF810000000000
+0000000000FBFFFFFFFFAC0000000000
+000000000081DFDFDFFFFB0000000000
+000000000081DD5F83FFFD0000000000
+000000000081DDDF5EACFF0000000000
+0000000000FDF981F981FFFF00000000
+00000000FFACF9F9F981FFFFAC000000
+00000000FFF98181F9F981FFFF000000
+000000ACACF981F981F9F9FFFFAC0000
+000000FFACF9F981F9F981FFFFFB0000
+00000083DFFBF981F9F95EFFFFFC0000
+005F5F5FDDFFFBF9F9F983DDDD5F0000
+005F5F5F5FDD81F9F9E7DF5F5F5F5F00
+0083DD5F5F83FFFFFFFFDF5F835F0000
+000000FBDDDFACFBACFBDFDFFB000000
+000000000000FFFFFFFF000000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFF0000000000
+0000000000FFFFFFFFFFFFFF00000000
+00000000FFFFFFFFFFFFFFFFFF000000
+00000000FFFFFFFFFFFFFFFFFF000000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+00FFFFFFFFFFFFFFFFFFFFFFFFFF0000
+000000FFFFFFFFFFFFFFFFFFFF000000
+</OS-BADGE-ICONS>"
+fi
+
+## create tmp files safely.
+TMP="${TMPDIR:-/tmp}"
+TMPBOOT=`mktemp -q "$TMP/ofboot.XXXXXX"`
+    if [ $? != 0 ] ; then
+        echo 1>&2 "Cannot create temp file, aborting."
+        exit 1
+    fi
+
+## create the real script
+$PRINTF \
+"<CHRP-BOOT>
+<COMPATIBLE>
+MacRISC
+</COMPATIBLE>
+<DESCRIPTION>
+PowerPC GNU/Linux First Stage Bootstrap
+</DESCRIPTION>
+<BOOT-SCRIPT>
+: .printf fb8-write drop ;
+$BOOTVARS
+\" screen\" output
+variable interactive
+$MENU interactive !
+
+0 interactive @ = if
+  bootyaboot
+then
+
+dev screen
+\" \"(0000000000aa00aa0000aaaaaa0000aa00aaaa5500aaaaaa)\" drop 0 7 set-colors
+\" \"(5555555555ff55ff5555ffffff5555ff55ffffff55ffffff)\" drop 8 15 set-colors
+device-end
+$FGCOLOR to foreground-color
+$BGCOLOR to background-color
+\" \"(0C)\" .printf
+
+\" First Stage GNU/Linux Bootstrap\"(0d 0a)\" .printf
+\"  \"(0d 0a)\" .printf
+$MENUOPTS
+\"  \"(0d 0a)\" .printf
+\" Boot: \" .printf
+get-msecs d# $TIMEOUT 3E8 * +
+begin
+  key? if
+    key case
+$GETOS
+    endcase
+  then
+  dup get-msecs &lt;
+until
+drop
+\"  \"(0d 0a)\" .printf $DEFAULTOS
+</BOOT-SCRIPT>
+$OFBOOTICON
+</CHRP-BOOT>\n" > "$TMPBOOT"
+
+echo "$TMPBOOT"
diff --git a/include/asm/elf.h b/include/asm/elf.h
new file mode 100644 (file)
index 0000000..fc3c015
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef __PPC_ELF_H
+#define __PPC_ELF_H
+
+#define ELF_NGREG      48      /* includes nip, msr, lr, etc. */
+#define ELF_NFPREG     33      /* includes fpscr */
+
+/*
+ * This is used to ensure we don't load something for the wrong architecture.
+ */
+#define elf_check_arch(x) ((x) == EM_PPC)
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_ARCH       EM_PPC
+#define ELF_CLASS      ELFCLASS32
+#define ELF_DATA       ELFDATA2MSB
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE      4096
+
+/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
+   use of this is to invoke "./ld.so someprog" to test out a new version of
+   the loader.  We need to make sure that it is out of the way of the program
+   that it will "exec", and that there is sufficient room for the brk.  */
+
+#define ELF_ET_DYN_BASE         (0x08000000)
+
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef double elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+#define ELF_CORE_COPY_REGS(gregs, regs) \
+       memcpy(gregs, regs, \
+              sizeof(struct pt_regs) < sizeof(elf_gregset_t)? \
+              sizeof(struct pt_regs): sizeof(elf_gregset_t));
+
+
+/* This yields a mask that user programs can use to figure out what
+   instruction set this cpu supports.  This could be done in userspace,
+   but it's not easy, and we've already done it here.  */
+
+#define ELF_HWCAP      (0)
+
+/* This yields a string that ld.so will use to load implementation
+   specific libraries for optimization.  This is more specific in
+   intent than poking at uname or /proc/cpuinfo.
+
+   For the moment, we have only optimizations for the Intel generations,
+   but that could change... */
+
+#define ELF_PLATFORM   (NULL)
+
+
+#endif
diff --git a/include/asm/ppc_asm.tmpl b/include/asm/ppc_asm.tmpl
new file mode 100644 (file)
index 0000000..e3004c8
--- /dev/null
@@ -0,0 +1,66 @@
+/* Register names */
+#define        r0      0
+#define        r1      1
+#define        r2      2
+#define        r3      3
+#define        r4      4
+#define        r5      5
+#define        r6      6
+#define        r7      7
+#define        r8      8
+#define        r9      9
+#define        r10     10
+#define        r11     11
+#define        r12     12
+#define        r13     13
+#define        r14     14
+#define        r15     15
+#define        r16     16
+#define        r17     17
+#define        r18     18
+#define        r19     19
+#define        r20     20
+#define        r21     21
+#define        r22     22
+#define        r23     23
+#define        r24     24
+#define        r25     25
+#define        r26     26
+#define        r27     27
+#define        r28     28
+#define        r29     29
+#define        r30     30
+#define        r31     31
+
+#define        fr0     0
+#define        fr1     1
+#define        fr2     2
+#define        fr3     3
+#define        fr4     4
+#define        fr5     5
+#define        fr6     6
+#define        fr7     7
+#define        fr8     8
+#define        fr9     9
+#define        fr10    10
+#define        fr11    11
+#define        fr12    12
+#define        fr13    13
+#define        fr14    14
+#define        fr15    15
+#define        fr16    16
+#define        fr17    17
+#define        fr18    18
+#define        fr19    19
+#define        fr20    20
+#define        fr21    21
+#define        fr22    22
+#define        fr23    23
+#define        fr24    24
+#define        fr25    25
+#define        fr26    26
+#define        fr27    27
+#define        fr28    28
+#define        fr29    29
+#define        fr30    30
+#define        fr31    31
diff --git a/include/asm/processor.h b/include/asm/processor.h
new file mode 100644 (file)
index 0000000..902facc
--- /dev/null
@@ -0,0 +1,142 @@
+#ifndef __ASM_PPC_PROCESSOR_H
+#define __ASM_PPC_PROCESSOR_H
+
+/* Bit encodings for Machine State Register (MSR) */
+#define MSR_POW                (1<<18)         /* Enable Power Management */
+#define MSR_TGPR       (1<<17)         /* TLB Update registers in use */
+#define MSR_ILE                (1<<16)         /* Interrupt Little-Endian enable */
+#define MSR_EE         (1<<15)         /* External Interrupt enable */
+#define MSR_PR         (1<<14)         /* Supervisor/User privilege */
+#define MSR_FP         (1<<13)         /* Floating Point enable */
+#define MSR_ME         (1<<12)         /* Machine Check enable */
+#define MSR_FE0                (1<<11)         /* Floating Exception mode 0 */
+#define MSR_SE         (1<<10)         /* Single Step */
+#define MSR_BE         (1<<9)          /* Branch Trace */
+#define MSR_FE1                (1<<8)          /* Floating Exception mode 1 */
+#define MSR_IP         (1<<6)          /* Exception prefix 0x000/0xFFF */
+#define MSR_IR         (1<<5)          /* Instruction MMU enable */
+#define MSR_DR         (1<<4)          /* Data MMU enable */
+#define MSR_RI         (1<<1)          /* Recoverable Exception */
+#define MSR_LE         (1<<0)          /* Little-Endian enable */
+
+/* Bit encodings for Hardware Implementation Register (HID0)
+   on PowerPC 603, 604, etc. processors (not 601). */
+#define HID0_EMCP      (1<<31)         /* Enable Machine Check pin */
+#define HID0_EBA       (1<<29)         /* Enable Bus Address Parity */
+#define HID0_EBD       (1<<28)         /* Enable Bus Data Parity */
+#define HID0_SBCLK     (1<<27)
+#define HID0_EICE      (1<<26)
+#define HID0_ECLK      (1<<25)
+#define HID0_PAR       (1<<24)
+#define HID0_DOZE      (1<<23)
+#define HID0_NAP       (1<<22)
+#define HID0_SLEEP     (1<<21)
+#define HID0_DPM       (1<<20)
+#define HID0_ICE       (1<<15)         /* Instruction Cache Enable */
+#define HID0_DCE       (1<<14)         /* Data Cache Enable */
+#define HID0_ILOCK     (1<<13)         /* Instruction Cache Lock */
+#define HID0_DLOCK     (1<<12)         /* Data Cache Lock */
+#define HID0_ICFI      (1<<11)         /* Instruction Cache Flash Invalidate */
+#define HID0_DCI       (1<<10)         /* Data Cache Invalidate */
+#define HID0_SPD       (1<<9)          /* Speculative disable */
+#define HID0_SIED      (1<<7)          /* Serial Instruction Execution [Disable] */
+#define HID0_BHTE      (1<<2)          /* Branch History Table Enable */
+#define HID0_BTCD      (1<<1)          /* Branch target cache disable */
+
+/* fpscr settings */
+#define FPSCR_FX        (1<<31)
+#define FPSCR_FEX       (1<<30)
+
+#define _GLOBAL(n)\
+       .globl n;\
+n:
+
+#define        TBRU    269     /* Time base Upper/Lower (Reading) */
+#define        TBRL    268
+#define TBWU   284     /* Time base Upper/Lower (Writing) */
+#define TBWL   285
+#define        XER     1
+#define LR     8
+#define CTR    9
+#define HID0   1008    /* Hardware Implementation */
+#define PVR    287     /* Processor Version */
+#define IBAT0U 528     /* Instruction BAT #0 Upper/Lower */
+#define IBAT0L 529
+#define IBAT1U 530     /* Instruction BAT #1 Upper/Lower */
+#define IBAT1L 531
+#define IBAT2U 532     /* Instruction BAT #2 Upper/Lower */
+#define IBAT2L 533
+#define IBAT3U 534     /* Instruction BAT #3 Upper/Lower */
+#define IBAT3L 535
+#define DBAT0U 536     /* Data BAT #0 Upper/Lower */
+#define DBAT0L 537
+#define DBAT1U 538     /* Data BAT #1 Upper/Lower */
+#define DBAT1L 539
+#define DBAT2U 540     /* Data BAT #2 Upper/Lower */
+#define DBAT2L 541
+#define DBAT3U 542     /* Data BAT #3 Upper/Lower */
+#define DBAT3L 543
+#define DMISS  976     /* TLB Lookup/Refresh registers */
+#define DCMP   977
+#define HASH1  978
+#define HASH2  979
+#define IMISS  980
+#define ICMP   981
+#define RPA    982
+#define SDR1   25      /* MMU hash base register */
+#define DAR    19      /* Data Address Register */
+#define SPR0   272     /* Supervisor Private Registers */
+#define SPRG0   272
+#define SPR1   273
+#define SPRG1   273
+#define SPR2   274
+#define SPRG2   274
+#define SPR3   275
+#define SPRG3   275
+#define DSISR  18
+#define SRR0   26      /* Saved Registers (exception) */
+#define SRR1   27
+#define IABR   1010    /* Instruction Address Breakpoint */
+#define DEC    22      /* Decrementer */
+#define EAR    282     /* External Address Register */
+#define L2CR   1017    /* PPC 750 L2 control register */
+
+#define THRM1  1020
+#define THRM2  1021
+#define THRM3  1022
+#define THRM1_TIN 0x1
+#define THRM1_TIV 0x2
+#define THRM1_THRES (0x7f<<2)
+#define THRM1_TID (1<<29)
+#define THRM1_TIE (1<<30)
+#define THRM1_V   (1<<31)
+#define THRM3_E   (1<<31)
+
+/* Segment Registers */
+#define SR0    0
+#define SR1    1
+#define SR2    2
+#define SR3    3
+#define SR4    4
+#define SR5    5
+#define SR6    6
+#define SR7    7
+#define SR8    8
+#define SR9    9
+#define SR10   10
+#define SR11   11
+#define SR12   12
+#define SR13   13
+#define SR14   14
+#define SR15   15
+
+#ifndef __ASSEMBLY__
+static __inline__ unsigned long mfmsr(void)
+{
+       unsigned long msr;
+       __asm__ __volatile__("mfmsr %0" : "=r" (msr));
+       return msr;
+}
+#endif
+  
+#endif /* __ASM_PPC_PROCESSOR_H */
diff --git a/include/bootinfo.h b/include/bootinfo.h
new file mode 100644 (file)
index 0000000..b5b5a04
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Non-machine dependent bootinfo structure.  Basic idea
+ * borrowed from the m68k.
+ *
+ * Copyright (C) 1999 Cort Dougan <cort@ppc.kernel.org>
+ */
+
+
+#ifndef _PPC_BOOTINFO_H
+#define _PPC_BOOTINFO_H
+
+#define _MACH_prep     0x00000001
+#define _MACH_Pmac     0x00000002      /* pmac or pmac clone (non-chrp) */
+#define _MACH_chrp     0x00000004      /* chrp machine */
+#define _MACH_mbx      0x00000008      /* Motorola MBX board */
+#define _MACH_apus     0x00000010      /* amiga with phase5 powerup */
+#define _MACH_fads     0x00000020      /* Motorola FADS board */
+#define _MACH_rpxlite  0x00000040      /* RPCG RPX-Lite 8xx board */
+#define _MACH_bseip    0x00000080      /* Bright Star Engineering ip-Engine */
+#define _MACH_yk       0x00000100      /* Motorola Yellowknife */
+#define _MACH_gemini   0x00000200      /* Synergy Microsystems gemini board */
+#define _MACH_classic  0x00000400      /* RPCG RPX-Classic 8xx board */
+#define _MACH_oak      0x00000800      /* IBM "Oak" 403 eval. board */
+#define _MACH_walnut   0x00001000      /* IBM "Walnut" 405GP eval. board */
+
+struct bi_record {
+    unsigned long tag;                 /* tag ID */
+    unsigned long size;                        /* size of record (in bytes) */
+    unsigned long data[0];             /* data */
+};
+
+#define BI_FIRST               0x1010  /* first record - marker */
+#define BI_LAST                        0x1011  /* last record - marker */
+#define BI_CMD_LINE            0x1012
+#define BI_BOOTLOADER_ID       0x1013
+#define BI_INITRD              0x1014
+#define BI_SYSMAP              0x1015
+#define BI_MACHTYPE            0x1016
+
+#endif /* _PPC_BOOTINFO_H */
+
diff --git a/include/byteorder.h b/include/byteorder.h
new file mode 100644 (file)
index 0000000..2403afe
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _BYTEORDER_H_
+#define _BYTEORDER_H_
+
+#include "swab.h"
+
+# define le64_to_cpu(x)  swab64((x))
+# define cpu_to_le64(x)  swab64((x))
+# define le32_to_cpu(x)  swab32((x))
+# define cpu_to_le32(x)  swab32((x))
+# define le16_to_cpu(x)  swab16((x))
+# define cpu_to_le16(x)  swab16((x))
+
+#endif /* _BYTEORDER_H_ */
diff --git a/include/cfg.h b/include/cfg.h
new file mode 100644 (file)
index 0000000..2cbdaf3
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    Config definitions
+
+    Copyright (C) 1999 Benjamin Herrenschmidt
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef CFG_H
+#define CFG_H
+
+#include "types.h"
+
+extern int     cfg_parse(char *cfg_file, char *buff, int len);
+extern char*   cfg_get_strg(char *image, char *item);
+extern int     cfg_get_flag(char *image, char *item);
+extern void    cfg_print_images(void);
+extern char*   cfg_get_default(void);
+
+#endif
diff --git a/include/cmdline.h b/include/cmdline.h
new file mode 100644 (file)
index 0000000..e2baa61
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+    Interface to command line
+
+    Copyright (C) 1999 Benjamin Herrenschmidt
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef CMDLINE_H
+#define CMDLINE_H
+
+#include "types.h"
+
+extern void    cmdinit();
+extern void    cmdedit(void (*tabfunc) (void), int password);
+
+extern char    cbuff[];
+extern char    passwdbuff[];
+#endif
diff --git a/include/ctype.h b/include/ctype.h
new file mode 100644 (file)
index 0000000..afa3639
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef _LINUX_CTYPE_H
+#define _LINUX_CTYPE_H
+
+/*
+ * NOTE! This ctype does not handle EOF like the standard C
+ * library is required to.
+ */
+
+#define _U     0x01    /* upper */
+#define _L     0x02    /* lower */
+#define _D     0x04    /* digit */
+#define _C     0x08    /* cntrl */
+#define _P     0x10    /* punct */
+#define _S     0x20    /* white space (space/lf/tab) */
+#define _X     0x40    /* hex digit */
+#define _SP    0x80    /* hard space (0x20) */
+
+extern unsigned char _ctype[];
+
+#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
+
+#define isalnum(c)     ((__ismask(c)&(_U|_L|_D)) != 0)
+#define isalpha(c)     ((__ismask(c)&(_U|_L)) != 0)
+#define iscntrl(c)     ((__ismask(c)&(_C)) != 0)
+#define isdigit(c)     ((__ismask(c)&(_D)) != 0)
+#define isgraph(c)     ((__ismask(c)&(_P|_U|_L|_D)) != 0)
+#define islower(c)     ((__ismask(c)&(_L)) != 0)
+#define isprint(c)     ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
+#define ispunct(c)     ((__ismask(c)&(_P)) != 0)
+#define isspace(c)     ((__ismask(c)&(_S)) != 0)
+#define isupper(c)     ((__ismask(c)&(_U)) != 0)
+#define isxdigit(c)    ((__ismask(c)&(_D|_X)) != 0)
+
+#define isascii(c) (((unsigned char)(c))<=0x7f)
+#define toascii(c) (((unsigned char)(c))&0x7f)
+
+static inline unsigned char __tolower(unsigned char c)
+{
+       if (isupper(c))
+               c -= 'A'-'a';
+       return c;
+}
+
+static inline unsigned char __toupper(unsigned char c)
+{
+       if (islower(c))
+               c -= 'a'-'A';
+       return c;
+}
+
+#define tolower(c) __tolower(c)
+#define toupper(c) __toupper(c)
+
+#endif
diff --git a/include/et/com_err.c b/include/et/com_err.c
new file mode 100644 (file)
index 0000000..81a70cf
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright 1987, 1988 by MIT Student Information Processing Board.
+ * 
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose is hereby granted, provided that
+ * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in
+ * advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.  M.I.T. and the
+ * M.I.T. S.I.P.B. make no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#include <stdio.h>
+#include "com_err.h"
+#include "error_table.h"
+#include "internal.h"
+
+#if !defined(__STDC__) && !defined(STDARG_PROTOTYPES)
+#include <varargs.h>
+#define VARARGS
+#endif
+
+static void
+#ifdef __STDC__
+    default_com_err_proc (const char *whoami, errcode_t code, const
+                         char *fmt, va_list args)
+#else
+    default_com_err_proc (whoami, code, fmt, args)
+    const char *whoami;
+    errcode_t code;
+    const char *fmt;
+    va_list args;
+#endif
+{
+    if (whoami) {
+       fputs(whoami, stderr);
+       fputs(": ", stderr);
+    }
+    if (code) {
+       fputs(error_message(code), stderr);
+       fputs(" ", stderr);
+    }
+    if (fmt) {
+        vfprintf (stderr, fmt, args);
+    }
+    /* should do this only on a tty in raw mode */
+    putc('\r', stderr);
+    putc('\n', stderr);
+    fflush(stderr);
+}
+
+#ifdef __STDC__
+typedef void (*errf) (const char *, errcode_t, const char *, va_list);
+#else
+typedef void (*errf) ();
+#endif
+
+errf com_err_hook = default_com_err_proc;
+
+#ifdef __STDC__
+void com_err_va (const char *whoami, errcode_t code, const char *fmt,
+                va_list args)
+#else
+void com_err_va (whoami, code, fmt, args)
+    const char *whoami;
+    errcode_t code;
+    const char *fmt;
+    va_list args;
+#endif
+{
+    (*com_err_hook) (whoami, code, fmt, args);
+}
+
+#ifndef VARARGS
+void com_err (const char *whoami,
+             errcode_t code,
+             const char *fmt, ...)
+{
+#else
+void com_err (va_alist)
+    va_dcl
+{
+    const char *whoami, *fmt;
+    errcode_t code;
+#endif
+    va_list pvar;
+
+    if (!com_err_hook)
+       com_err_hook = default_com_err_proc;
+#ifdef VARARGS
+    va_start (pvar);
+    whoami = va_arg (pvar, const char *);
+    code = va_arg (pvar, errcode_t);
+    fmt = va_arg (pvar, const char *);
+#else
+    va_start(pvar, fmt);
+#endif
+    com_err_va (whoami, code, fmt, pvar);
+    va_end(pvar);
+}
+
+errf set_com_err_hook (new_proc)
+    errf new_proc;
+{
+    errf x = com_err_hook;
+
+    if (new_proc)
+       com_err_hook = new_proc;
+    else
+       com_err_hook = default_com_err_proc;
+
+    return x;
+}
+
+errf reset_com_err_hook () {
+    errf x = com_err_hook;
+    com_err_hook = default_com_err_proc;
+    return x;
+}
diff --git a/include/et/com_err.h b/include/et/com_err.h
new file mode 100644 (file)
index 0000000..f28dce8
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Header file for common error description library.
+ *
+ * Copyright 1988, Student Information Processing Board of the
+ * Massachusetts Institute of Technology.
+ *
+ * For copyright and distribution info, see the documentation supplied
+ * with this package.
+ */
+
+#ifndef __COM_ERR_H
+
+typedef long errcode_t;
+
+#ifdef __STDC__
+#include <stdarg.h>
+
+/* ANSI C -- use prototypes etc */
+void com_err (const char *, long, const char *, ...);
+void com_err_va (const char *whoami, errcode_t code, const char *fmt,
+                va_list args);
+char const *error_message (long);
+extern void (*com_err_hook) (const char *, long, const char *, va_list);
+void (*set_com_err_hook (void (*) (const char *, long, const char *, va_list)))
+    (const char *, long, const char *, va_list);
+void (*reset_com_err_hook (void)) (const char *, long, const char *, va_list);
+int init_error_table(const char * const *msgs, int base, int count);
+#else
+/* no prototypes */
+void com_err ();
+void com_err_va ();
+char *error_message ();
+extern void (*com_err_hook) ();
+void (*set_com_err_hook ()) ();
+void (*reset_com_err_hook ()) ();
+int init_error_table();
+#endif
+
+#define __COM_ERR_H
+#endif /* ! defined(__COM_ERR_H) */
diff --git a/include/ext2fs/bitops.h b/include/ext2fs/bitops.h
new file mode 100644 (file)
index 0000000..0361d9b
--- /dev/null
@@ -0,0 +1,603 @@
+/*
+ * bitops.h --- Bitmap frobbing code.  The byte swapping routines are
+ *     also included here.
+ * 
+ * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ * %End-Header%
+ * 
+ * i386 bitops operations taken from <asm/bitops.h>, Copyright 1992,
+ * Linus Torvalds.
+ */
+
+
+extern int ext2fs_set_bit(int nr,void * addr);
+extern int ext2fs_clear_bit(int nr, void * addr);
+extern int ext2fs_test_bit(int nr, const void * addr);
+extern __u16 ext2fs_swab16(__u16 val);
+extern __u32 ext2fs_swab32(__u32 val);
+
+/*
+ * EXT2FS bitmap manipulation routines.
+ */
+
+/* Support for sending warning messages from the inline subroutines */
+extern const char *ext2fs_block_string;
+extern const char *ext2fs_inode_string;
+extern const char *ext2fs_mark_string;
+extern const char *ext2fs_unmark_string;
+extern const char *ext2fs_test_string;
+extern void ext2fs_warn_bitmap(errcode_t errcode, unsigned long arg,
+                              const char *description);
+extern void ext2fs_warn_bitmap2(ext2fs_generic_bitmap bitmap,
+                               int code, unsigned long arg);
+
+extern void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
+extern void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                      blk_t block);
+extern int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap, blk_t block);
+
+extern void ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode);
+extern void ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                      ino_t inode);
+extern int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap, ino_t inode);
+
+extern void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                         blk_t block);
+extern void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                           blk_t block);
+extern int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
+                                        blk_t block);
+
+extern void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                         ino_t inode);
+extern void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                           ino_t inode);
+extern int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                        ino_t inode);
+extern blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap);
+extern ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap);
+extern blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap);
+extern ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap);
+
+extern void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                          blk_t block, int num);
+extern void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                            blk_t block, int num);
+extern int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                         blk_t block, int num);
+extern void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                               blk_t block, int num);
+extern void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                                 blk_t block, int num);
+extern int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                              blk_t block, int num);
+extern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map);
+
+/*
+ * The inline routines themselves...
+ * 
+ * If NO_INLINE_FUNCS is defined, then we won't try to do inline
+ * functions at all; they will be included as normal functions in
+ * inline.c
+ */
+#ifdef NO_INLINE_FUNCS
+#if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \
+                          defined(__i586__) || defined(__mc68000__) || \
+                          defined(__sparc__)))
+       /* This prevents bitops.c from trying to include the C */
+       /* function version of these functions */
+#define _EXT2_HAVE_ASM_BITOPS_
+#endif
+#endif /* NO_INLINE_FUNCS */
+
+#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
+#ifdef INCLUDE_INLINE_FUNCS
+#define _INLINE_ extern
+#else
+#ifdef __GNUC__
+#define _INLINE_ extern __inline__
+#else                          /* For Watcom C */
+#define _INLINE_ extern inline
+#endif
+#endif
+
+#if ((defined __GNUC__) && (defined(__i386__) || defined(__i486__) || \
+                           defined(__i586__)))
+
+#define _EXT2_HAVE_ASM_BITOPS_
+       
+/*
+ * These are done by inline assembly for speed reasons.....
+ *
+ * All bitoperations return 0 if the bit was cleared before the
+ * operation and != 0 if it was not.  Bit 0 is the LSB of addr; bit 32
+ * is the LSB of (addr+1).
+ */
+
+/*
+ * Some hacks to defeat gcc over-optimizations..
+ */
+struct __dummy_h { unsigned long a[100]; };
+#define EXT2FS_ADDR (*(struct __dummy_h *) addr)
+#define EXT2FS_CONST_ADDR (*(const struct __dummy_h *) addr)   
+
+_INLINE_ int ext2fs_set_bit(int nr, void * addr)
+{
+       int oldbit;
+
+       __asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit),"=m" (EXT2FS_ADDR)
+               :"r" (nr));
+       return oldbit;
+}
+
+_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
+{
+       int oldbit;
+
+       __asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit),"=m" (EXT2FS_ADDR)
+               :"r" (nr));
+       return oldbit;
+}
+
+_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
+{
+       int oldbit;
+
+       __asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0"
+               :"=r" (oldbit)
+               :"m" (EXT2FS_CONST_ADDR),"r" (nr));
+       return oldbit;
+}
+
+#undef EXT2FS_ADDR
+
+#endif /* i386 */
+
+#ifdef __mc68000__
+
+#define _EXT2_HAVE_ASM_BITOPS_
+
+_INLINE_ int ext2fs_set_bit(int nr,void * addr)
+{
+       char retval;
+
+       __asm__ __volatile__ ("bfset %2@{%1:#1}; sne %0"
+            : "=d" (retval) : "d" (nr^7), "a" (addr));
+
+       return retval;
+}
+
+_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
+{
+       char retval;
+
+       __asm__ __volatile__ ("bfclr %2@{%1:#1}; sne %0"
+            : "=d" (retval) : "d" (nr^7), "a" (addr));
+
+       return retval;
+}
+
+_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
+{
+       char retval;
+
+       __asm__ __volatile__ ("bftst %2@{%1:#1}; sne %0"
+            : "=d" (retval) : "d" (nr^7), "a" (addr));
+
+       return retval;
+}
+
+#endif /* __mc68000__ */
+
+#ifdef __sparc__
+
+#define _EXT2_HAVE_ASM_BITOPS_
+
+#ifndef EXT2_OLD_BITOPS
+
+/*
+ * Do the bitops so that we are compatible with the standard i386
+ * convention.
+ */
+
+_INLINE_ int ext2fs_set_bit(int nr,void * addr)
+{
+#if 1
+       int             mask;
+       unsigned char   *ADDR = (unsigned char *) addr;
+
+       ADDR += nr >> 3;
+       mask = 1 << (nr & 0x07);
+       __asm__ __volatile__("ldub      [%0], %%g6\n\t"
+                            "or        %%g6, %2, %%g5\n\t"
+                            "stb       %%g5, [%0]\n\t"
+                            "and       %%g6, %2, %0\n"
+       : "=&r" (ADDR)
+       : "0" (ADDR), "r" (mask)
+       : "g5", "g6");
+       return (int) ADDR;
+#else
+       int             mask, retval;
+       unsigned char   *ADDR = (unsigned char *) addr;
+
+       ADDR += nr >> 3;
+       mask = 1 << (nr & 0x07);
+       retval = (mask & *ADDR) != 0;
+       *ADDR |= mask;
+       return retval;
+#endif
+}
+
+_INLINE_ int ext2fs_clear_bit(int nr, void * addr)
+{
+#if 1
+       int             mask;
+       unsigned char   *ADDR = (unsigned char *) addr;
+
+       ADDR += nr >> 3;
+       mask = 1 << (nr & 0x07);
+       __asm__ __volatile__("ldub      [%0], %%g6\n\t"
+                            "andn      %%g6, %2, %%g5\n\t"
+                            "stb       %%g5, [%0]\n\t"
+                            "and       %%g6, %2, %0\n"
+       : "=&r" (ADDR)
+       : "0" (ADDR), "r" (mask)
+       : "g5", "g6");
+       return (int) ADDR;
+       
+#else
+       int             mask, retval;
+       unsigned char   *ADDR = (unsigned char *) addr;
+
+       ADDR += nr >> 3;
+       mask = 1 << (nr & 0x07);
+       retval = (mask & *ADDR) != 0;
+       *ADDR &= ~mask;
+       return retval;
+#endif
+}
+
+_INLINE_ int ext2fs_test_bit(int nr, const void * addr)
+{
+       int                     mask;
+       const unsigned char     *ADDR = (const unsigned char *) addr;
+
+       ADDR += nr >> 3;
+       mask = 1 << (nr & 0x07);
+       return ((mask & *ADDR) != 0);
+}
+
+#else
+
+/* Do things the old, unplesant way. */
+
+_INLINE_ int ext2fs_set_bit(int nr, void *addr)
+{
+       int             mask, retval;
+       unsigned long   *ADDR = (unsigned long *) addr;
+
+       ADDR += nr >> 5;
+       mask = 1 << (nr & 31);
+       retval = ((mask & *ADDR) != 0);
+       *ADDR |= mask;
+       return retval;
+}
+
+_INLINE_ int ext2fs_clear_bit(int nr, void *addr)
+{
+       int             mask, retval;
+       unsigned long   *ADDR = (unsigned long *) addr;
+
+       ADDR += nr >> 5;
+       mask = 1 << (nr & 31);
+       retval = ((mask & *ADDR) != 0);
+       *ADDR &= ~mask;
+       return retval;
+}
+
+_INLINE_ int ext2fs_test_bit(int nr, const void *addr)
+{
+       int                     mask;
+       const unsigned long     *ADDR = (const unsigned long *) addr;
+
+       ADDR += nr >> 5;
+       mask = 1 << (nr & 31);
+       return ((mask & *ADDR) != 0);
+}
+#endif
+
+#endif /* __sparc__ */
+
+#ifndef _EXT2_HAVE_ASM_SWAB
+
+_INLINE_ __u16 ext2fs_swab16(__u16 val)
+{
+       return (val >> 8) | (val << 8);
+}
+
+_INLINE_ __u32 ext2fs_swab32(__u32 val)
+{
+       return ((val>>24) | ((val>>8)&0xFF00) |
+               ((val<<8)&0xFF0000) | (val<<24));
+}
+
+#endif /* !_EXT2_HAVE_ASM_SWAB */
+
+_INLINE_ void ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                        __u32 bitno);
+_INLINE_ void ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                          blk_t bitno);
+_INLINE_ int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                       blk_t bitno);
+
+_INLINE_ void ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                        __u32 bitno)
+{
+       if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
+               ext2fs_warn_bitmap2(bitmap, EXT2FS_MARK_ERROR, bitno);
+               return;
+       }
+       ext2fs_set_bit(bitno - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                          blk_t bitno)
+{
+       if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
+               ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno);
+               return;
+       }
+       ext2fs_clear_bit(bitno - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
+                                       blk_t bitno)
+{
+       if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
+               ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, bitno);
+               return 0;
+       }
+       return ext2fs_test_bit(bitno - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                      blk_t block)
+{
+       ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block);
+}
+
+_INLINE_ void ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                        blk_t block)
+{
+       ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, block);
+}
+
+_INLINE_ int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
+                                      blk_t block)
+{
+       return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, 
+                                         block);
+}
+
+_INLINE_ void ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                      ino_t inode)
+{
+       ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode);
+}
+
+_INLINE_ void ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                        ino_t inode)
+{
+       ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap, inode);
+}
+
+_INLINE_ int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                      ino_t inode)
+{
+       return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap, 
+                                         inode);
+}
+
+_INLINE_ void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                           blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
+                                  bitmap->description);
+               return;
+       }
+#endif 
+       ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
+                                             blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK,
+                                  block, bitmap->description);
+               return;
+       }
+#endif
+       ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
+                                           blk_t block)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
+                                  block, bitmap->description);
+               return 0;
+       }
+#endif
+       return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                           ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((inode < bitmap->start) || (inode > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_MARK,
+                                  inode, bitmap->description);
+               return;
+       }
+#endif
+       ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                             ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((inode < bitmap->start) || (inode > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_UNMARK,
+                                  inode, bitmap->description);
+               return;
+       }
+#endif
+       ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
+                                          ino_t inode)
+{
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((inode < bitmap->start) || (inode > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
+                                  inode, bitmap->description);
+               return 0;
+       }
+#endif
+       return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
+{
+       return bitmap->start;
+}
+
+_INLINE_ ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
+{
+       return bitmap->start;
+}
+
+_INLINE_ blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
+{
+       return bitmap->end;
+}
+
+_INLINE_ ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
+{
+       return bitmap->end;
+}
+
+_INLINE_ int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                           blk_t block, int num)
+{
+       int     i;
+
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
+                                  block, bitmap->description);
+               return 0;
+       }
+       for (i=0; i < num; i++) {
+               if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
+                       return 0;
+       }
+       return 1;
+}
+
+_INLINE_ int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                                blk_t block, int num)
+{
+       int     i;
+
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
+                                  block, bitmap->description);
+               return 0;
+       }
+#endif
+       for (i=0; i < num; i++) {
+               if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
+                       return 0;
+       }
+       return 1;
+}
+
+_INLINE_ void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                            blk_t block, int num)
+{
+       int     i;
+       
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
+                                  bitmap->description);
+               return;
+       }
+       for (i=0; i < num; i++)
+               ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                                 blk_t block, int num)
+{
+       int     i;
+       
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
+                                  bitmap->description);
+               return;
+       }
+#endif 
+       for (i=0; i < num; i++)
+               ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                              blk_t block, int num)
+{
+       int     i;
+       
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
+                                  bitmap->description);
+               return;
+       }
+       for (i=0; i < num; i++)
+               ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
+}
+
+_INLINE_ void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
+                                                   blk_t block, int num)
+{
+       int     i;
+       
+#ifdef EXT2FS_DEBUG_FAST_OPS
+       if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
+               ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
+                                  bitmap->description);
+               return;
+       }
+#endif 
+       for (i=0; i < num; i++)
+               ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
+}
+
+#undef _INLINE_
+#endif
+
diff --git a/include/ext2fs/ext2_err.h b/include/ext2fs/ext2_err.h
new file mode 100644 (file)
index 0000000..e986a5c
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * ext2_err.h:
+ * This file is automatically generated; please do not edit it.
+ */
+
+#define EXT2_ET_BASE                             (2133571328L)
+#define EXT2_ET_MAGIC_EXT2FS_FILSYS              (2133571329L)
+#define EXT2_ET_MAGIC_BADBLOCKS_LIST             (2133571330L)
+#define EXT2_ET_MAGIC_BADBLOCKS_ITERATE          (2133571331L)
+#define EXT2_ET_MAGIC_INODE_SCAN                 (2133571332L)
+#define EXT2_ET_MAGIC_IO_CHANNEL                 (2133571333L)
+#define EXT2_ET_MAGIC_UNIX_IO_CHANNEL            (2133571334L)
+#define EXT2_ET_MAGIC_IO_MANAGER                 (2133571335L)
+#define EXT2_ET_MAGIC_BLOCK_BITMAP               (2133571336L)
+#define EXT2_ET_MAGIC_INODE_BITMAP               (2133571337L)
+#define EXT2_ET_MAGIC_GENERIC_BITMAP             (2133571338L)
+#define EXT2_ET_MAGIC_TEST_IO_CHANNEL            (2133571339L)
+#define EXT2_ET_MAGIC_DBLIST                     (2133571340L)
+#define EXT2_ET_MAGIC_ICOUNT                     (2133571341L)
+#define EXT2_ET_MAGIC_PQ_IO_CHANNEL              (2133571342L)
+#define EXT2_ET_MAGIC_EXT2_FILE                  (2133571343L)
+#define EXT2_ET_MAGIC_RESERVED_7                 (2133571344L)
+#define EXT2_ET_MAGIC_RESERVED_8                 (2133571345L)
+#define EXT2_ET_MAGIC_RESERVED_9                 (2133571346L)
+#define EXT2_ET_BAD_MAGIC                        (2133571347L)
+#define EXT2_ET_REV_TOO_HIGH                     (2133571348L)
+#define EXT2_ET_RO_FILSYS                        (2133571349L)
+#define EXT2_ET_GDESC_READ                       (2133571350L)
+#define EXT2_ET_GDESC_WRITE                      (2133571351L)
+#define EXT2_ET_GDESC_BAD_BLOCK_MAP              (2133571352L)
+#define EXT2_ET_GDESC_BAD_INODE_MAP              (2133571353L)
+#define EXT2_ET_GDESC_BAD_INODE_TABLE            (2133571354L)
+#define EXT2_ET_INODE_BITMAP_WRITE               (2133571355L)
+#define EXT2_ET_INODE_BITMAP_READ                (2133571356L)
+#define EXT2_ET_BLOCK_BITMAP_WRITE               (2133571357L)
+#define EXT2_ET_BLOCK_BITMAP_READ                (2133571358L)
+#define EXT2_ET_INODE_TABLE_WRITE                (2133571359L)
+#define EXT2_ET_INODE_TABLE_READ                 (2133571360L)
+#define EXT2_ET_NEXT_INODE_READ                  (2133571361L)
+#define EXT2_ET_UNEXPECTED_BLOCK_SIZE            (2133571362L)
+#define EXT2_ET_DIR_CORRUPTED                    (2133571363L)
+#define EXT2_ET_SHORT_READ                       (2133571364L)
+#define EXT2_ET_SHORT_WRITE                      (2133571365L)
+#define EXT2_ET_DIR_NO_SPACE                     (2133571366L)
+#define EXT2_ET_NO_INODE_BITMAP                  (2133571367L)
+#define EXT2_ET_NO_BLOCK_BITMAP                  (2133571368L)
+#define EXT2_ET_BAD_INODE_NUM                    (2133571369L)
+#define EXT2_ET_BAD_BLOCK_NUM                    (2133571370L)
+#define EXT2_ET_EXPAND_DIR_ERR                   (2133571371L)
+#define EXT2_ET_TOOSMALL                         (2133571372L)
+#define EXT2_ET_BAD_BLOCK_MARK                   (2133571373L)
+#define EXT2_ET_BAD_BLOCK_UNMARK                 (2133571374L)
+#define EXT2_ET_BAD_BLOCK_TEST                   (2133571375L)
+#define EXT2_ET_BAD_INODE_MARK                   (2133571376L)
+#define EXT2_ET_BAD_INODE_UNMARK                 (2133571377L)
+#define EXT2_ET_BAD_INODE_TEST                   (2133571378L)
+#define EXT2_ET_FUDGE_BLOCK_BITMAP_END           (2133571379L)
+#define EXT2_ET_FUDGE_INODE_BITMAP_END           (2133571380L)
+#define EXT2_ET_BAD_IND_BLOCK                    (2133571381L)
+#define EXT2_ET_BAD_DIND_BLOCK                   (2133571382L)
+#define EXT2_ET_BAD_TIND_BLOCK                   (2133571383L)
+#define EXT2_ET_NEQ_BLOCK_BITMAP                 (2133571384L)
+#define EXT2_ET_NEQ_INODE_BITMAP                 (2133571385L)
+#define EXT2_ET_BAD_DEVICE_NAME                  (2133571386L)
+#define EXT2_ET_MISSING_INODE_TABLE              (2133571387L)
+#define EXT2_ET_CORRUPT_SUPERBLOCK               (2133571388L)
+#define EXT2_ET_BAD_GENERIC_MARK                 (2133571389L)
+#define EXT2_ET_BAD_GENERIC_UNMARK               (2133571390L)
+#define EXT2_ET_BAD_GENERIC_TEST                 (2133571391L)
+#define EXT2_ET_SYMLINK_LOOP                     (2133571392L)
+#define EXT2_ET_CALLBACK_NOTHANDLED              (2133571393L)
+#define EXT2_ET_BAD_BLOCK_IN_INODE_TABLE         (2133571394L)
+#define EXT2_ET_UNSUPP_FEATURE                   (2133571395L)
+#define EXT2_ET_RO_UNSUPP_FEATURE                (2133571396L)
+#define EXT2_ET_LLSEEK_FAILED                    (2133571397L)
+#define EXT2_ET_NO_MEMORY                        (2133571398L)
+#define EXT2_ET_INVALID_ARGUMENT                 (2133571399L)
+#define EXT2_ET_BLOCK_ALLOC_FAIL                 (2133571400L)
+#define EXT2_ET_INODE_ALLOC_FAIL                 (2133571401L)
+#define EXT2_ET_NO_DIRECTORY                     (2133571402L)
+#define EXT2_ET_TOO_MANY_REFS                    (2133571403L)
+#define EXT2_ET_FILE_NOT_FOUND                   (2133571404L)
+#define EXT2_ET_FILE_RO                          (2133571405L)
+#define EXT2_ET_DB_NOT_FOUND                     (2133571406L)
+#define EXT2_ET_DIR_EXISTS                       (2133571407L)
+#define EXT2_ET_UNIMPLEMENTED                    (2133571408L)
+#define EXT2_ET_CANCEL_REQUESTED                 (2133571409L)
+#define EXT2_ET_FILE_TOO_BIG                     (2133571410L)
+extern void initialize_ext2_error_table(void);
+#define ERROR_TABLE_BASE_ext2 (2133571328L)
+
+/* for compatibility with older versions... */
+#define init_ext2_err_tbl initialize_ext2_error_table
+#define ext2_err_base ERROR_TABLE_BASE_ext2
diff --git a/include/ext2fs/ext2_io.h b/include/ext2fs/ext2_io.h
new file mode 100644 (file)
index 0000000..9568866
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * io.h --- the I/O manager abstraction
+ * 
+ * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ * %End-Header%
+ */
+
+#ifndef _EXT2FS_EXT2_IO_H
+#define _EXT2FS_EXT2_IO_H
+
+/*
+ * ext2_loff_t is defined here since unix_io.c needs it.
+ */
+#if defined(__GNUC__) || defined(HAS_LONG_LONG)
+typedef long long      ext2_loff_t;
+#else
+typedef long           ext2_loff_t;
+#endif
+
+/* llseek.c */
+ext2_loff_t ext2fs_llseek (int, ext2_loff_t, int);
+
+typedef struct struct_io_manager *io_manager;
+typedef struct struct_io_channel *io_channel;
+
+struct struct_io_channel {
+       errcode_t       magic;
+       io_manager      manager;
+       char            *name;
+       int             block_size;
+       errcode_t       (*read_error)(io_channel channel,
+                                     unsigned long block,
+                                     int count,
+                                     void *data,
+                                     size_t size,
+                                     int actual_bytes_read,
+                                     errcode_t error);
+       errcode_t       (*write_error)(io_channel channel,
+                                      unsigned long block,
+                                      int count,
+                                      const void *data,
+                                      size_t size,
+                                      int actual_bytes_written,
+                                      errcode_t error);
+       int             refcount;
+       int             reserved[15];
+       void            *private_data;
+       void            *app_data;
+};
+
+struct struct_io_manager {
+       errcode_t magic;
+       const char *name;
+       errcode_t (*open)(const char *name, int flags, io_channel *channel);
+       errcode_t (*close)(io_channel channel);
+       errcode_t (*set_blksize)(io_channel channel, int blksize);
+       errcode_t (*read_blk)(io_channel channel, unsigned long block,
+                             int count, void *data);
+       errcode_t (*write_blk)(io_channel channel, unsigned long block,
+                              int count, const void *data);
+       errcode_t (*flush)(io_channel channel);
+       int             reserved[16];
+};
+
+#define IO_FLAG_RW     1
+
+/*
+ * Convenience functions....
+ */
+#define io_channel_close(c)            ((c)->manager->close((c)))
+#define io_channel_set_blksize(c,s)    ((c)->manager->set_blksize((c),s))
+#define io_channel_read_blk(c,b,n,d)   ((c)->manager->read_blk((c),b,n,d))
+#define io_channel_write_blk(c,b,n,d)  ((c)->manager->write_blk((c),b,n,d))
+#define io_channel_flush(c)            ((c)->manager->flush((c)))
+#define io_channel_bumpcount(c)                ((c)->refcount++)
+       
+/* unix_io.c */
+extern io_manager unix_io_manager;
+
+/* test_io.c */
+extern io_manager test_io_manager, test_io_backing_manager;
+extern void (*test_io_cb_read_blk)
+       (unsigned long block, int count, errcode_t err);
+extern void (*test_io_cb_write_blk)
+       (unsigned long block, int count, errcode_t err);
+extern void (*test_io_cb_set_blksize)
+       (int blksize, errcode_t err);
+
+#endif /* _EXT2FS_EXT2_IO_H */
+       
diff --git a/include/ext2fs/ext2fs.h b/include/ext2fs/ext2fs.h
new file mode 100644 (file)
index 0000000..474c947
--- /dev/null
@@ -0,0 +1,989 @@
+/*
+ * ext2fs.h --- ext2fs
+ * 
+ * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ * %End-Header%
+ */
+
+#ifndef _EXT2FS_EXT2FS_H
+#define _EXT2FS_EXT2FS_H
+
+/*
+ * Non-GNU C compilers won't necessarily understand inline
+ */
+#if (!defined(__GNUC__) && !defined(__WATCOMC__))
+#define NO_INLINE_FUNCS
+#endif
+
+/*
+ * Where the master copy of the superblock is located, and how big
+ * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
+ * the size of the superblock structure is not necessarily trustworthy
+ * (some versions have the padding set up so that the superblock is
+ * 1032 bytes long).
+ */
+#define SUPERBLOCK_OFFSET      1024
+#define SUPERBLOCK_SIZE        1024
+
+/*
+ * The last ext2fs revision level that this version of the library is
+ * able to support.
+ */
+#define EXT2_LIB_CURRENT_REV   0
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <stdlib.h>
+
+#if EXT2_FLAT_INCLUDES
+#include "e2_types.h"
+#else
+#include <types.h>
+#if defined(__GNUC__) && defined(__STRICT_ANSI__) && \
+       (((~0UL) == 0xffffffff) || defined(__i386__))
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+#endif
+
+typedef __u32          blk_t;
+typedef __u32          dgrp_t;
+typedef __u32          ext2_off_t;
+typedef __s64          e2_blkcnt_t;
+
+#if EXT2_FLAT_INCLUDES
+#include "com_err.h"
+#include "ext2_io.h"
+#include "ext2_err.h"
+#else
+#include "et/com_err.h"
+#include "ext2fs/ext2_io.h"
+#include "ext2fs/ext2_err.h"
+#endif
+
+/*
+ * Portability help for Microsoft Visual C++
+ */
+#ifdef _MSC_VER
+#define EXT2_QSORT_TYPE int __cdecl
+#else
+#define EXT2_QSORT_TYPE int
+#endif
+
+typedef struct struct_ext2_filsys *ext2_filsys;
+
+struct ext2fs_struct_generic_bitmap {
+       errcode_t       magic;
+       ext2_filsys     fs;
+       __u32           start, end;
+       __u32           real_end;
+       char    *       description;
+       char    *       bitmap;
+       errcode_t       base_error_code;
+       __u32           reserved[7];
+};
+
+#define EXT2FS_MARK_ERROR      0
+#define EXT2FS_UNMARK_ERROR    1
+#define EXT2FS_TEST_ERROR      2
+
+typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
+typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
+typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
+
+#ifdef EXT2_DYNAMIC_REV
+#define EXT2_FIRST_INODE(s)    EXT2_FIRST_INO(s)
+#else
+#define EXT2_FIRST_INODE(s)    EXT2_FIRST_INO
+#define EXT2_INODE_SIZE(s)     sizeof(struct ext2_inode)
+#endif
+
+/*
+ * badblocks list definitions
+ */
+
+typedef struct ext2_struct_badblocks_list *ext2_badblocks_list;
+typedef struct ext2_struct_badblocks_iterate *ext2_badblocks_iterate;
+
+/* old */
+typedef struct ext2_struct_badblocks_list *badblocks_list;
+typedef struct ext2_struct_badblocks_iterate *badblocks_iterate;
+
+#define BADBLOCKS_FLAG_DIRTY   1
+
+/*
+ * ext2_dblist structure and abstractions (see dblist.c)
+ */
+struct ext2_db_entry {
+       ino_t   ino;
+       blk_t   blk;
+       int     blockcnt;
+};
+
+typedef struct ext2_struct_dblist *ext2_dblist;
+
+#define DBLIST_ABORT   1
+
+/*
+ * ext2_fileio definitions
+ */
+
+#define EXT2_FILE_WRITE                0x0001
+#define EXT2_FILE_CREATE       0x0002
+
+#define EXT2_FILE_MASK         0x00FF
+
+#define EXT2_FILE_BUF_DIRTY    0x4000
+#define EXT2_FILE_BUF_VALID    0x2000
+
+typedef struct ext2_file *ext2_file_t;
+
+#define EXT2_SEEK_SET  0
+#define EXT2_SEEK_CUR  1
+#define EXT2_SEEK_END  2
+
+/*
+ * Flags for the ext2_filsys structure
+ */
+
+#define EXT2_FLAG_RW                   0x01
+#define EXT2_FLAG_CHANGED              0x02
+#define EXT2_FLAG_DIRTY                        0x04
+#define EXT2_FLAG_VALID                        0x08
+#define EXT2_FLAG_IB_DIRTY             0x10
+#define EXT2_FLAG_BB_DIRTY             0x20
+#define EXT2_FLAG_SWAP_BYTES           0x40
+#define EXT2_FLAG_SWAP_BYTES_READ      0x80
+#define EXT2_FLAG_SWAP_BYTES_WRITE     0x100
+#define EXT2_FLAG_MASTER_SB_ONLY       0x200
+#define EXT2_FLAG_FORCE                        0x400
+
+/*
+ * Special flag in the ext2 inode i_flag field that means that this is
+ * a new inode.  (So that ext2_write_inode() can clear extra fields.)
+ */
+#define EXT2_NEW_INODE_FL      0x80000000
+
+struct struct_ext2_filsys {
+       errcode_t                       magic;
+       io_channel                      io;
+       int                             flags;
+       char *                          device_name;
+       struct ext2_super_block *       super;
+       int                             blocksize;
+       int                             fragsize;
+       dgrp_t                          group_desc_count;
+       unsigned long                   desc_blocks;
+       struct ext2_group_desc *        group_desc;
+       int                             inode_blocks_per_group;
+       ext2fs_inode_bitmap             inode_map;
+       ext2fs_block_bitmap             block_map;
+       errcode_t (*get_blocks)(ext2_filsys fs, ino_t ino, blk_t *blocks);
+       errcode_t (*check_directory)(ext2_filsys fs, ino_t ino);
+       errcode_t (*write_bitmaps)(ext2_filsys fs);
+       errcode_t (*read_inode)(ext2_filsys fs, ino_t ino,
+                               struct ext2_inode *inode);
+       errcode_t (*write_inode)(ext2_filsys fs, ino_t ino,
+                               struct ext2_inode *inode);
+       badblocks_list                  badblocks;
+       ext2_dblist                     dblist;
+       __u32                           stride; /* for mke2fs */
+       /*
+        * Reserved for future expansion
+        */
+       __u32                           reserved[11];
+
+       /*
+        * Reserved for the use of the calling application.
+        */
+       void *                          priv_data;
+
+       /*
+        * Inode cache
+        */
+       struct ext2_inode_cache         *icache;
+};
+
+#if EXT2_FLAT_INCLUDES
+#include "e2_bitops.h"
+#else
+#include "ext2fs/bitops.h"
+#endif
+
+/*
+ * Return flags for the block iterator functions
+ */
+#define BLOCK_CHANGED  1
+#define BLOCK_ABORT    2
+#define BLOCK_ERROR    4
+
+/*
+ * Block interate flags
+ *
+ * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
+ * function should be called on blocks where the block number is zero.
+ * This is used by ext2fs_expand_dir() to be able to add a new block
+ * to an inode.  It can also be used for programs that want to be able
+ * to deal with files that contain "holes".
+ * 
+ * BLOCK_FLAG_TRAVERSE indicates that the iterator function for the
+ * indirect, doubly indirect, etc. blocks should be called after all
+ * of the blocks containined in the indirect blocks are processed.
+ * This is useful if you are going to be deallocating blocks from an
+ * inode.
+ *
+ * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
+ * called for data blocks only.
+ *
+ * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
+ * ext2fs_block_iterate2 that large files won't be accepted.
+ */
+#define BLOCK_FLAG_APPEND      1
+#define BLOCK_FLAG_HOLE                1
+#define BLOCK_FLAG_DEPTH_TRAVERSE      2
+#define BLOCK_FLAG_DATA_ONLY   4
+
+#define BLOCK_FLAG_NO_LARGE    0x1000
+
+/*
+ * Magic "block count" return values for the block iterator function.
+ */
+#define BLOCK_COUNT_IND                (-1)
+#define BLOCK_COUNT_DIND       (-2)
+#define BLOCK_COUNT_TIND       (-3)
+#define BLOCK_COUNT_TRANSLATOR (-4)
+
+#if 0
+/*
+ * Flags for ext2fs_move_blocks
+ */
+#define EXT2_BMOVE_GET_DBLIST  0x0001  
+#define EXT2_BMOVE_DEBUG       0x0002
+#endif
+
+/*
+ * Return flags for the directory iterator functions
+ */
+#define DIRENT_CHANGED 1
+#define DIRENT_ABORT   2
+#define DIRENT_ERROR   3
+
+/*
+ * Directory iterator flags
+ */
+
+#define DIRENT_FLAG_INCLUDE_EMPTY      1
+
+
+#define DIRENT_DOT_FILE                1
+#define DIRENT_DOT_DOT_FILE    2
+#define DIRENT_OTHER_FILE      3
+
+/*
+ * Inode scan definitions
+ */
+typedef struct ext2_struct_inode_scan *ext2_inode_scan;
+
+/*
+ * ext2fs_scan flags
+ */
+#define EXT2_SF_CHK_BADBLOCKS  0x0001
+#define EXT2_SF_BAD_INODE_BLK  0x0002
+#define EXT2_SF_BAD_EXTRA_BYTES        0x0004
+#define EXT2_SF_SKIP_MISSING_ITABLE    0x0008
+
+/*
+ * ext2fs_check_if_mounted flags
+ */
+#define EXT2_MF_MOUNTED                1
+#define EXT2_MF_ISROOT         2
+#define EXT2_MF_READONLY       4
+
+/*
+ * Ext2/linux mode flags.  We define them here so that we don't need
+ * to depend on the OS's sys/stat.h, since we may be compiling on a
+ * non-Linux system.
+ */
+#define LINUX_S_IFMT  00170000
+#define LINUX_S_IFSOCK 0140000
+#define LINUX_S_IFLNK   0120000
+#define LINUX_S_IFREG  0100000
+#define LINUX_S_IFBLK  0060000
+#define LINUX_S_IFDIR  0040000
+#define LINUX_S_IFCHR  0020000
+#define LINUX_S_IFIFO  0010000
+#define LINUX_S_ISUID  0004000
+#define LINUX_S_ISGID  0002000
+#define LINUX_S_ISVTX  0001000
+
+#define LINUX_S_IRWXU 00700
+#define LINUX_S_IRUSR 00400
+#define LINUX_S_IWUSR 00200
+#define LINUX_S_IXUSR 00100
+
+#define LINUX_S_IRWXG 00070
+#define LINUX_S_IRGRP 00040
+#define LINUX_S_IWGRP 00020
+#define LINUX_S_IXGRP 00010
+
+#define LINUX_S_IRWXO 00007
+#define LINUX_S_IROTH 00004
+#define LINUX_S_IWOTH 00002
+#define LINUX_S_IXOTH 00001
+
+#define LINUX_S_ISLNK(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
+#define LINUX_S_ISREG(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
+#define LINUX_S_ISDIR(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
+#define LINUX_S_ISCHR(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
+#define LINUX_S_ISBLK(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
+#define LINUX_S_ISFIFO(m)      (((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
+#define LINUX_S_ISSOCK(m)      (((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
+
+/*
+ * ext2_icount_t abstraction
+ */
+#define EXT2_ICOUNT_OPT_INCREMENT      0x01
+
+typedef struct ext2_icount *ext2_icount_t;
+
+/*
+ * Flags for ext2fs_bmap
+ */
+#define BMAP_ALLOC     1
+
+/*
+ * For checking structure magic numbers...
+ */
+
+#define EXT2_CHECK_MAGIC(struct, code) \
+         if ((struct)->magic != (code)) return (code)
+
+
+/*
+ * The ext2fs library private definition of the ext2 superblock, so we
+ * don't have to depend on the kernel's definition of the superblock,
+ * which might not have the latest features.
+ */
+struct ext2fs_sb {
+       __u32   s_inodes_count;         /* Inodes count */
+       __u32   s_blocks_count;         /* Blocks count */
+       __u32   s_r_blocks_count;       /* Reserved blocks count */
+       __u32   s_free_blocks_count;    /* Free blocks count */
+       __u32   s_free_inodes_count;    /* Free inodes count */
+       __u32   s_first_data_block;     /* First Data Block */
+       __u32   s_log_block_size;       /* Block size */
+       __s32   s_log_frag_size;        /* Fragment size */
+       __u32   s_blocks_per_group;     /* # Blocks per group */
+       __u32   s_frags_per_group;      /* # Fragments per group */
+       __u32   s_inodes_per_group;     /* # Inodes per group */
+       __u32   s_mtime;                /* Mount time */
+       __u32   s_wtime;                /* Write time */
+       __u16   s_mnt_count;            /* Mount count */
+       __s16   s_max_mnt_count;        /* Maximal mount count */
+       __u16   s_magic;                /* Magic signature */
+       __u16   s_state;                /* File system state */
+       __u16   s_errors;               /* Behaviour when detecting errors */
+       __u16   s_minor_rev_level;      /* minor revision level */
+       __u32   s_lastcheck;            /* time of last check */
+       __u32   s_checkinterval;        /* max. time between checks */
+       __u32   s_creator_os;           /* OS */
+       __u32   s_rev_level;            /* Revision level */
+       __u16   s_def_resuid;           /* Default uid for reserved blocks */
+       __u16   s_def_resgid;           /* Default gid for reserved blocks */
+       /*
+        * These fields are for EXT2_DYNAMIC_REV superblocks only.
+        *
+        * Note: the difference between the compatible feature set and
+        * the incompatible feature set is that if there is a bit set
+        * in the incompatible feature set that the kernel doesn't
+        * know about, it should refuse to mount the filesystem.
+        * 
+        * e2fsck's requirements are more strict; if it doesn't know
+        * about a feature in either the compatible or incompatible
+        * feature set, it must abort and not try to meddle with
+        * things it doesn't understand...
+        */
+       __u32   s_first_ino;            /* First non-reserved inode */
+       __u16   s_inode_size;           /* size of inode structure */
+       __u16   s_block_group_nr;       /* block group # of this superblock */
+       __u32   s_feature_compat;       /* compatible feature set */
+       __u32   s_feature_incompat;     /* incompatible feature set */
+       __u32   s_feature_ro_compat;    /* readonly-compatible feature set */
+       __u8    s_uuid[16];             /* 128-bit uuid for volume */
+       char    s_volume_name[16];      /* volume name */
+       char    s_last_mounted[64];     /* directory where last mounted */
+       __u32   s_algorithm_usage_bitmap; /* For compression */
+       /*
+        * Performance hints.  Directory preallocation should only
+        * happen if the EXT2_COMPAT_PREALLOC flag is on.
+        */
+       __u8    s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
+       __u8    s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
+       __u16   s_padding1;
+       /* 
+        * Journaling support.
+        */
+       __u8    s_journal_uuid[16];     /* uuid of journal superblock */
+       __u32   s_journal_inum;         /* inode number of journal file */
+       
+       __u32   s_reserved[199];        /* Padding to the end of the block */
+};
+
+/*
+ * Feature set definitions (that might not be in ext2_fs.h
+ */
+
+#ifndef EXT2_FEATURE_COMPAT_DIR_PREALLOC
+#define EXT2_FEATURE_COMPAT_DIR_PREALLOC       0x0001
+#endif
+
+#ifndef EXT2_FEATURE_COMPAT_IMAGIC_INODES /* for AFS, etc. */
+#define EXT2_FEATURE_COMPAT_IMAGIC_INODES              0x0002
+#define EXT2_IMAGIC_FL         0x00002000
+#endif
+
+#ifndef EXT3_FEATURE_COMPAT_HAS_JOURNAL
+#define EXT3_FEATURE_COMPAT_HAS_JOURNAL                0x0004
+#endif
+
+#ifndef EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER    0x0001
+#endif
+
+#ifndef EXT2_FEATURE_RO_COMPAT_LARGE_FILE
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE      0x0002
+#define i_size_high i_dir_acl
+#endif
+
+#ifndef EXT2_FEATURE_RO_COMPAT_BTREE_DIR
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR       0x0004
+#endif
+
+#ifndef EXT2_FEATURE_INCOMPAT_COMPRESSION
+#define EXT2_FEATURE_INCOMPAT_COMPRESSION      0x0001
+#endif
+
+#ifndef EXT2_FEATURE_INCOMPAT_FILETYPE
+#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
+#endif
+
+#ifndef EXT3_FEATURE_INCOMPAT_RECOVER 
+#define EXT3_FEATURE_INCOMPAT_RECOVER  0x0004 /* Needs recovery */
+#endif
+
+#define EXT2_LIB_FEATURE_COMPAT_SUPP   (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
+                                        EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
+                                        EXT3_FEATURE_COMPAT_HAS_JOURNAL)
+#define EXT2_LIB_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE
+#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP        (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
+/*
+ * function prototypes
+ */
+
+/* alloc.c */
+extern errcode_t ext2fs_new_inode(ext2_filsys fs, ino_t dir, int mode,
+                                 ext2fs_inode_bitmap map, ino_t *ret);
+extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
+                                 ext2fs_block_bitmap map, blk_t *ret);
+extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
+                                       blk_t finish, int num,
+                                       ext2fs_block_bitmap map,
+                                       blk_t *ret);
+extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
+                                   char *block_buf, blk_t *ret);
+
+/* alloc_tables.c */
+extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
+extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
+                                            ext2fs_block_bitmap bmap);
+
+/* badblocks.c */
+extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
+                                           int size);
+extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
+                                          blk_t blk);
+extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
+                                   blk_t blk);
+extern errcode_t
+       ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
+                                           ext2_badblocks_iterate *ret);
+extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
+                                        blk_t *blk);
+extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
+extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
+                                      ext2_badblocks_list *dest);
+
+/* bb_compat */
+extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
+extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
+extern int badblocks_list_test(badblocks_list bb, blk_t blk);
+extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
+                                             badblocks_iterate *ret);
+extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
+extern void badblocks_list_iterate_end(badblocks_iterate iter);
+extern void badblocks_list_free(badblocks_list bb);
+
+/* bb_inode.c */
+extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
+                                       ext2_badblocks_list bb_list);
+
+/* bitmaps.c */
+extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
+extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
+extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
+extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
+extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
+                                               __u32 end,
+                                               __u32 real_end,
+                                               const char *descr,
+                                               ext2fs_generic_bitmap *ret);
+extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
+                                             const char *descr,
+                                             ext2fs_block_bitmap *ret);
+extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
+                                             const char *descr,
+                                             ext2fs_inode_bitmap *ret);
+extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
+                                              ino_t end, ino_t *oend);
+extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
+                                              blk_t end, blk_t *oend);
+extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
+extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
+extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
+extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
+
+/* block.c */
+extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
+                                     ino_t     ino,
+                                     int       flags,
+                                     char *block_buf,
+                                     int (*func)(ext2_filsys fs,
+                                                 blk_t *blocknr,
+                                                 int   blockcnt,
+                                                 void  *priv_data),
+                                     void *priv_data);
+errcode_t ext2fs_block_iterate2(ext2_filsys fs,
+                               ino_t   ino,
+                               int     flags,
+                               char *block_buf,
+                               int (*func)(ext2_filsys fs,
+                                           blk_t       *blocknr,
+                                           e2_blkcnt_t blockcnt,
+                                           blk_t       ref_blk,
+                                           int         ref_offset,
+                                           void        *priv_data),
+                               void *priv_data);
+
+/* bmap.c */
+extern errcode_t ext2fs_bmap(ext2_filsys fs, ino_t ino,
+                            struct ext2_inode *inode, 
+                            char *block_buf, int bmap_flags,
+                            blk_t block, blk_t *phys_blk);
+
+
+#if 0
+/* bmove.c */
+extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
+                                   ext2fs_block_bitmap reserve,
+                                   ext2fs_block_bitmap alloc_map,
+                                   int flags);
+#endif
+
+/* check_desc.c */
+extern errcode_t ext2fs_check_desc(ext2_filsys fs);
+
+/* closefs.c */
+extern errcode_t ext2fs_close(ext2_filsys fs);
+extern errcode_t ext2fs_flush(ext2_filsys fs);
+extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
+
+/* cmp_bitmaps.c */
+extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
+                                            ext2fs_block_bitmap bm2);
+extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
+                                            ext2fs_inode_bitmap bm2);
+
+/* dblist.c */
+
+extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ino_t *ret_num_dirs);
+extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
+extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ino_t ino,
+                                     blk_t blk, int blockcnt);
+extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
+       int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
+                   void        *priv_data),
+       void *priv_data);
+extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ino_t ino,
+                                     blk_t blk, int blockcnt);
+extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
+                                   ext2_dblist *dest);
+extern int ext2fs_dblist_count(ext2_dblist dblist);
+
+/* dblist_dir.c */
+extern errcode_t
+       ext2fs_dblist_dir_iterate(ext2_dblist dblist,
+                                 int   flags,
+                                 char  *block_buf,
+                                 int (*func)(ino_t     dir,
+                                             int               entry,
+                                             struct ext2_dir_entry *dirent,
+                                             int       offset,
+                                             int       blocksize,
+                                             char      *buf,
+                                             void      *priv_data),
+                                 void *priv_data);
+
+/* dirblock.c */
+extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
+                                      void *buf);
+extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
+                                       void *buf);
+
+/* dir_iterate.c */
+extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 
+                             ino_t dir,
+                             int flags,
+                             char *block_buf,
+                             int (*func)(struct ext2_dir_entry *dirent,
+                                         int   offset,
+                                         int   blocksize,
+                                         char  *buf,
+                                         void  *priv_data),
+                             void *priv_data);
+
+/* dupfs.c */
+extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
+
+/* expanddir.c */
+extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ino_t dir);
+
+/* fileio.c */
+extern errcode_t ext2fs_file_open(ext2_filsys fs, ino_t ino,
+                                 int flags, ext2_file_t *ret);
+extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
+extern errcode_t ext2fs_file_close(ext2_file_t file);
+extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
+                                 unsigned int wanted, unsigned int *got);
+extern errcode_t ext2fs_file_write(ext2_file_t file, void *buf,
+                                  unsigned int nbytes, unsigned int *written);
+extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
+                                  int whence, ext2_off_t *ret_pos);
+extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
+extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
+
+/* freefs.c */
+extern void ext2fs_free(ext2_filsys fs);
+extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
+extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
+extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
+extern void ext2fs_free_dblist(ext2_dblist dblist);
+extern void ext2fs_badblocks_list_free(badblocks_list bb);
+
+/* getsize.c */
+extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
+                                       blk_t *retblocks);
+
+/* initialize.c */
+extern errcode_t ext2fs_initialize(const char *name, int flags,
+                                  struct ext2_super_block *param,
+                                  io_manager manager, ext2_filsys *ret_fs);
+
+/* inode.c */
+extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
+                                 ext2_inode_scan *ret_scan);
+extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
+extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ino_t *ino,
+                              struct ext2_inode *inode);
+extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
+                                                  int  group);
+extern void ext2fs_set_inode_callback
+       (ext2_inode_scan scan,
+        errcode_t (*done_group)(ext2_filsys fs,
+                                ext2_inode_scan scan,
+                                dgrp_t group,
+                                void * priv_data),
+        void *done_group_data);
+extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
+                                  int clear_flags);
+extern errcode_t ext2fs_read_inode (ext2_filsys fs, ino_t ino,
+                           struct ext2_inode * inode);
+extern errcode_t ext2fs_write_inode(ext2_filsys fs, ino_t ino,
+                           struct ext2_inode * inode);
+extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ino_t ino, blk_t *blocks);
+extern errcode_t ext2fs_check_directory(ext2_filsys fs, ino_t ino);
+
+/* icount.c */
+extern void ext2fs_free_icount(ext2_icount_t icount);
+extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
+                                      ext2_icount_t hint, ext2_icount_t *ret);
+extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, int size,
+                                     ext2_icount_t *ret);
+extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ino_t ino,
+                                    __u16 *ret);
+extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
+                                        __u16 *ret);
+extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ino_t ino,
+                                        __u16 *ret);
+extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ino_t ino,
+                                    __u16 count);
+extern ino_t ext2fs_get_icount_size(ext2_icount_t icount);
+#if 0
+errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
+#endif
+
+/* ismounted.c */
+extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
+
+/* namei.c */
+extern errcode_t ext2fs_lookup(ext2_filsys fs, ino_t dir, const char *name,
+                        int namelen, char *buf, ino_t *inode);
+extern errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd,
+                       const char *name, ino_t *inode);
+errcode_t ext2fs_namei_follow(ext2_filsys fs, ino_t root, ino_t cwd,
+                             const char *name, ino_t *inode);
+extern errcode_t ext2fs_follow_link(ext2_filsys fs, ino_t root, ino_t cwd,
+                       ino_t inode, ino_t *res_inode);
+
+/* native.c */
+int ext2fs_native_flag(void);
+
+/* newdir.c */
+extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino,
+                               ino_t parent_ino, char **block);
+
+/* mkdir.c */
+extern errcode_t ext2fs_mkdir(ext2_filsys fs, ino_t parent, ino_t inum,
+                             const char *name);
+
+/* openfs.c */
+extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
+                            int block_size, io_manager manager,
+                            ext2_filsys *ret_fs);
+
+/* get_pathname.c */
+extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ino_t dir, ino_t ino,
+                              char **name);
+
+/* link.c */
+errcode_t ext2fs_link(ext2_filsys fs, ino_t dir, const char *name,
+                     ino_t ino, int flags);
+errcode_t ext2fs_unlink(ext2_filsys fs, ino_t dir, const char *name,
+                       ino_t ino, int flags);
+
+/* read_bb.c */
+extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
+                                     ext2_badblocks_list *bb_list);
+
+/* read_bb_file.c */
+#if 0
+extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
+                                    ext2_badblocks_list *bb_list,
+                                    void (*invalid)(ext2_filsys fs,
+                                                    blk_t blk));
+#endif
+
+/* rs_bitmap.c */
+extern errcode_t ext2fs_resize_generic_bitmap(__u32 new_end,
+                                             __u32 new_real_end,
+                                             ext2fs_generic_bitmap bmap);
+extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
+                                           ext2fs_inode_bitmap bmap);
+extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
+                                           ext2fs_block_bitmap bmap);
+extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
+                                   ext2fs_generic_bitmap *dest);
+
+/* swapfs.c */
+extern void ext2fs_swap_super(struct ext2_super_block * super);
+extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
+extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
+                             struct ext2_inode *f, int hostorder);
+
+/* valid_blk.c */
+extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
+
+/* version.c */
+extern int ext2fs_parse_version_string(const char *ver_string);
+extern int ext2fs_get_library_version(const char **ver_string,
+                                     const char **date_string);
+
+/* inline functions */
+extern errcode_t ext2fs_get_mem(unsigned long size, void **ptr);
+extern errcode_t ext2fs_free_mem(void **ptr);
+extern errcode_t ext2fs_resize_mem(unsigned long old_size,
+                                  unsigned long size, void **ptr);
+extern void ext2fs_mark_super_dirty(ext2_filsys fs);
+extern void ext2fs_mark_changed(ext2_filsys fs);
+extern int ext2fs_test_changed(ext2_filsys fs);
+extern void ext2fs_mark_valid(ext2_filsys fs);
+extern void ext2fs_unmark_valid(ext2_filsys fs);
+extern int ext2fs_test_valid(ext2_filsys fs);
+extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
+extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
+extern int ext2fs_test_ib_dirty(ext2_filsys fs);
+extern int ext2fs_test_bb_dirty(ext2_filsys fs);
+extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
+extern int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino);
+
+/*
+ * The actual inlined functions definitions themselves...
+ *
+ * If NO_INLINE_FUNCS is defined, then we won't try to do inline
+ * functions at all!
+ */
+#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
+#ifdef INCLUDE_INLINE_FUNCS
+#define _INLINE_ extern
+#else
+#ifdef __GNUC__
+#define _INLINE_ extern __inline__
+#else                          /* For Watcom C */
+#define _INLINE_ extern inline
+#endif
+#endif
+
+#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
+/*
+ *  Allocate memory
+ */
+_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void **ptr)
+{
+       *ptr = malloc(size);
+       if (!*ptr)
+               return EXT2_ET_NO_MEMORY;
+       return 0;
+}
+
+/*
+ * Free memory
+ */
+_INLINE_ errcode_t ext2fs_free_mem(void **ptr)
+{
+       free(*ptr);
+       *ptr = 0;
+       return 0;
+}
+       
+/*
+ *  Resize memory
+ */
+_INLINE_ errcode_t ext2fs_resize_mem(unsigned long old_size,
+                                    unsigned long size, void **ptr)
+{
+       void *p;
+
+       p = realloc(*ptr, size);
+       if (!p)
+               return EXT2_ET_NO_MEMORY;
+       *ptr = p;
+       return 0;
+}
+#endif /* Custom memory routines */
+
+/*
+ * Mark a filesystem superblock as dirty
+ */
+_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
+{
+       fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
+}
+
+/*
+ * Mark a filesystem as changed
+ */
+_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
+{
+       fs->flags |= EXT2_FLAG_CHANGED;
+}
+
+/*
+ * Check to see if a filesystem has changed
+ */
+_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
+{
+       return (fs->flags & EXT2_FLAG_CHANGED);
+}
+
+/*
+ * Mark a filesystem as valid
+ */
+_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
+{
+       fs->flags |= EXT2_FLAG_VALID;
+}
+
+/*
+ * Mark a filesystem as NOT valid
+ */
+_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
+{
+       fs->flags &= ~EXT2_FLAG_VALID;
+}
+
+/*
+ * Check to see if a filesystem is valid
+ */
+_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
+{
+       return (fs->flags & EXT2_FLAG_VALID);
+}
+
+/*
+ * Mark the inode bitmap as dirty
+ */
+_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
+{
+       fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
+}
+
+/*
+ * Mark the block bitmap as dirty
+ */
+_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
+{
+       fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
+}
+
+/*
+ * Check to see if a filesystem's inode bitmap is dirty
+ */
+_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
+{
+       return (fs->flags & EXT2_FLAG_IB_DIRTY);
+}
+
+/*
+ * Check to see if a filesystem's block bitmap is dirty
+ */
+_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
+{
+       return (fs->flags & EXT2_FLAG_BB_DIRTY);
+}
+
+/*
+ * Return the group # of a block
+ */
+_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
+{
+       return (blk - fs->super->s_first_data_block) /
+               fs->super->s_blocks_per_group;
+}
+
+/*
+ * Return the group # of an inode number
+ */
+_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino)
+{
+       return (ino - 1) / fs->super->s_inodes_per_group;
+}
+#undef _INLINE_
+#endif
+
+#endif /* _EXT2FS_EXT2FS_H */
diff --git a/include/fdisk-part.h b/include/fdisk-part.h
new file mode 100644 (file)
index 0000000..382df2d
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Structure of a fdisk driver descriptor (block 0)
+ * and partition table (blocks 1..n).
+ *
+ * Copyright 2000 IBM / Peter Bergner / David Engebretsen
+ */
+
+#define ACTIVE_FLAG     0x80
+
+#define EXTENDED        0x05
+#define WIN98_EXTENDED  0x0f
+#define LINUX_PARTITION 0x81
+#define LINUX_SWAP      0x82
+#define LINUX_NATIVE    0x83
+#define LINUX_EXTENDED  0x85
+
+struct fdisk_partition {
+       unsigned char boot_ind;         /* 0x80 - active */
+       unsigned char head;             /* starting head */
+       unsigned char sector;           /* starting sector */
+       unsigned char cyl;              /* starting cylinder */
+       unsigned char sys_ind;          /* What partition type */
+       unsigned char end_head;         /* end head */
+       unsigned char end_sector;       /* end sector */
+       unsigned char end_cyl;          /* end cylinder */
+       unsigned char start4[4];        /* starting sector counting from 0 */
+       unsigned char size4[4];         /* nr of sectors in partition */
+};
diff --git a/include/file.h b/include/file.h
new file mode 100644 (file)
index 0000000..c68d84f
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+    Definitions for talking to the Open Firmware PROM on
+    Power Macintosh computers.
+
+    Copyright (C) 1999 Benjamin Herrenschmidt
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef FILE_H
+#define FILE_H
+
+#include "types.h"
+#include "stddef.h"
+#include "prom.h"
+
+struct boot_file_t;
+#include "fs.h"
+
+#define FILE_MAX_PATH          1024
+
+/* Simple error codes */
+#define FILE_ERR_OK            0
+#define FILE_ERR_EOF           -1
+#define FILE_ERR_NOTFOUND      -2
+#define FILE_CANT_SEEK         -3
+#define FILE_IOERR             -4
+#define FILE_BAD_PATH          -5
+#define FILE_ERR_BAD_TYPE       -6
+#define FILE_ERR_BAD_FSYS       -7
+#define FILE_ERR_SYMLINK_LOOP   -8
+#define FILE_ERR_LENGTH         -9
+
+/* Device kind */
+#define FILE_DEVICE_BLOCK      1
+#define FILE_DEVICE_NET                2
+
+struct boot_fspec_t {
+       char*   dev;            /* OF device path */
+       int     part;           /* Partition number or -1 */
+       char*   file;           /* File path */
+};
+
+struct boot_file_t {
+
+       /* File access methods */
+        const struct fs_t *fs;
+
+       /* Filesystem private (to be broken once we have a
+        * better malloc'ator)
+        */
+
+       int             device_kind;
+       ihandle         of_device;
+       ino_t           inode;
+       __u64           pos;
+       unsigned char*  buffer;
+       __u64           len;
+//     unsigned int    dev_blk_size;
+//     unsigned int    part_start;
+//     unsigned int    part_count;
+};
+
+extern int open_file(  const struct boot_fspec_t*      spec,
+                       struct boot_file_t*             file);
+
+extern int validate_fspec(
+                       struct boot_fspec_t*    spec,
+                       char*                   default_device,
+                       int                     default_part);
+extern char *parse_device_path(
+                       char*                   of_device,
+                       char**                  file_spec,
+                       int*                    partition);
+
+
+
+#endif
diff --git a/include/fs.h b/include/fs.h
new file mode 100644 (file)
index 0000000..3ec5928
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+    FileSystems common definitions
+
+    Copyright (C) 1999 Benjamin Herrenschmidt
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef FS_H
+#define FS_H
+
+#include "partition.h"
+#include "file.h"
+
+struct fs_t {
+       const char* name;
+
+       int (*open)(    struct boot_file_t*     file,
+                       const char*             dev_name,
+                       struct partition_t*     part,
+                       const char*             file_name);
+                       
+       int (*read)(    struct boot_file_t*     file,
+                       unsigned int            size,
+                       void*                   buffer);
+                               
+       int (*seek)(    struct boot_file_t*     file,
+                       unsigned int            newpos);
+                                       
+       int (*close)(   struct boot_file_t*     file);
+};
+
+extern const struct fs_t *fs_of;
+extern const struct fs_t *fs_of_netboot;
+
+const struct fs_t *fs_open( struct boot_file_t *file, const char *dev_name,
+                            struct partition_t *part, const char *file_name );
+
+#if DEBUG
+# define DEBUG_ENTER prom_printf( "--> %s\n", __PRETTY_FUNCTION__ );
+# define DEBUG_LEAVE(str) \
+    prom_printf( "<-- %s - %s\n", __PRETTY_FUNCTION__, #str );
+# define DEBUG_F(fmt, args...)\
+{\
+    prom_printf( "    %s - ", __PRETTY_FUNCTION__ );\
+    prom_printf( fmt, ## args );\
+}
+# define DEBUG_OPEN DEBUG_F( "dev=%s, part=0x%08lx (%d), file_name=%s\n",\
+                             dev_name, part, part ? part->part_number : -1,\
+                             file_name);
+#else
+#define DEBUG_ENTER
+#define DEBUG_LEAVE(x)
+#define DEBUG_F(fmt, args...)
+#define DEBUG_OPEN
+#endif
+
+#endif
diff --git a/include/gui.h b/include/gui.h
new file mode 100644 (file)
index 0000000..c1aaec6
--- /dev/null
@@ -0,0 +1,3 @@
+extern void fxDisplaySplash(struct boot_fspec_t *filespec);
+int fxReadImage(struct boot_file_t *file, unsigned int filesize, void *base);
+
diff --git a/include/linux/elf.h b/include/linux/elf.h
new file mode 100644 (file)
index 0000000..81d6f10
--- /dev/null
@@ -0,0 +1,607 @@
+#ifndef _LINUX_ELF_H
+#define _LINUX_ELF_H
+
+#include <types.h>
+#include <asm/elf.h>
+
+/* 32-bit ELF base types. */
+typedef __u32  Elf32_Addr;
+typedef __u16  Elf32_Half;
+typedef __u32  Elf32_Off;
+typedef __s32  Elf32_Sword;
+typedef __u32  Elf32_Word;
+
+/* 64-bit ELF base types. */
+typedef __u64  Elf64_Addr;
+typedef __u16  Elf64_Half;
+typedef __s16  Elf64_SHalf;
+typedef __u64  Elf64_Off;
+typedef __s64  Elf64_Sword;
+typedef __u64  Elf64_Word;
+
+/* These constants are for the segment types stored in the image headers */
+#define PT_NULL    0
+#define PT_LOAD    1
+#define PT_DYNAMIC 2
+#define PT_INTERP  3
+#define PT_NOTE    4
+#define PT_SHLIB   5
+#define PT_PHDR    6
+#define PT_LOPROC  0x70000000
+#define PT_HIPROC  0x7fffffff
+#define PT_MIPS_REGINFO                0x70000000
+
+/* Flags in the e_flags field of the header */
+#define EF_MIPS_NOREORDER 0x00000001
+#define EF_MIPS_PIC       0x00000002
+#define EF_MIPS_CPIC      0x00000004
+#define EF_MIPS_ARCH      0xf0000000
+
+/* These constants define the different elf file types */
+#define ET_NONE   0
+#define ET_REL    1
+#define ET_EXEC   2
+#define ET_DYN    3
+#define ET_CORE   4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/* These constants define the various ELF target machines */
+#define EM_NONE  0
+#define EM_M32   1
+#define EM_SPARC 2
+#define EM_386   3
+#define EM_68K   4
+#define EM_88K   5
+#define EM_486   6   /* Perhaps disused */
+#define EM_860   7
+
+#define EM_MIPS                8       /* MIPS R3000 (officially, big-endian only) */
+
+#define EM_MIPS_RS4_BE 10      /* MIPS R4000 big-endian */
+
+#define EM_PARISC      15      /* HPPA */
+
+#define EM_SPARC32PLUS 18      /* Sun's "v8plus" */
+
+#define EM_PPC        20       /* PowerPC */
+#define EM_PPC64       21      /* PowerPC 64-bit */
+
+#define EM_SPARCV9     43      /* SPARC v9 64-bit */
+
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA       0x9026
+
+
+/* This is the info that is needed to parse the dynamic section of the file */
+#define DT_NULL                0
+#define DT_NEEDED      1
+#define DT_PLTRELSZ    2
+#define DT_PLTGOT      3
+#define DT_HASH                4
+#define DT_STRTAB      5
+#define DT_SYMTAB      6
+#define DT_RELA                7
+#define DT_RELASZ      8
+#define DT_RELAENT     9
+#define DT_STRSZ       10
+#define DT_SYMENT      11
+#define DT_INIT                12
+#define DT_FINI                13
+#define DT_SONAME      14
+#define DT_RPATH       15
+#define DT_SYMBOLIC    16
+#define DT_REL         17
+#define DT_RELSZ       18
+#define DT_RELENT      19
+#define DT_PLTREL      20
+#define DT_DEBUG       21
+#define DT_TEXTREL     22
+#define DT_JMPREL      23
+#define DT_LOPROC      0x70000000
+#define DT_HIPROC      0x7fffffff
+#define DT_MIPS_RLD_VERSION    0x70000001
+#define DT_MIPS_TIME_STAMP     0x70000002
+#define DT_MIPS_ICHECKSUM      0x70000003
+#define DT_MIPS_IVERSION       0x70000004
+#define DT_MIPS_FLAGS          0x70000005
+  #define RHF_NONE               0
+  #define RHF_HARDWAY            1
+  #define RHF_NOTPOT             2
+#define DT_MIPS_BASE_ADDRESS   0x70000006
+#define DT_MIPS_CONFLICT       0x70000008
+#define DT_MIPS_LIBLIST                0x70000009
+#define DT_MIPS_LOCAL_GOTNO    0x7000000a
+#define DT_MIPS_CONFLICTNO     0x7000000b
+#define DT_MIPS_LIBLISTNO      0x70000010
+#define DT_MIPS_SYMTABNO       0x70000011
+#define DT_MIPS_UNREFEXTNO     0x70000012
+#define DT_MIPS_GOTSYM         0x70000013
+#define DT_MIPS_HIPAGENO       0x70000014
+#define DT_MIPS_RLD_MAP                0x70000016
+
+/* This info is needed when parsing the symbol table */
+#define STB_LOCAL  0
+#define STB_GLOBAL 1
+#define STB_WEAK   2
+
+#define STT_NOTYPE  0
+#define STT_OBJECT  1
+#define STT_FUNC    2
+#define STT_SECTION 3
+#define STT_FILE    4
+
+#define ELF32_ST_BIND(x) ((x) >> 4)
+#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
+
+/* Symbolic values for the entries in the auxiliary table
+   put on the initial stack */
+#define AT_NULL   0    /* end of vector */
+#define AT_IGNORE 1    /* entry should be ignored */
+#define AT_EXECFD 2    /* file descriptor of program */
+#define AT_PHDR   3    /* program headers for program */
+#define AT_PHENT  4    /* size of program header entry */
+#define AT_PHNUM  5    /* number of program headers */
+#define AT_PAGESZ 6    /* system page size */
+#define AT_BASE   7    /* base address of interpreter */
+#define AT_FLAGS  8    /* flags */
+#define AT_ENTRY  9    /* entry point of program */
+#define AT_NOTELF 10   /* program is not ELF */
+#define AT_UID    11   /* real uid */
+#define AT_EUID   12   /* effective uid */
+#define AT_GID    13   /* real gid */
+#define AT_EGID   14   /* effective gid */
+#define AT_PLATFORM 15  /* string identifying CPU for optimizations */
+#define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
+
+typedef struct dynamic{
+  Elf32_Sword d_tag;
+  union{
+    Elf32_Sword        d_val;
+    Elf32_Addr d_ptr;
+  } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+  Elf64_Word d_tag;            /* entry tag value */
+  union {
+    Elf64_Word d_val;
+    Elf64_Word d_ptr;
+  } d_un;
+} Elf64_Dyn;
+
+/* The following are used with relocations */
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+
+#define R_386_NONE     0
+#define R_386_32       1
+#define R_386_PC32     2
+#define R_386_GOT32    3
+#define R_386_PLT32    4
+#define R_386_COPY     5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF   9
+#define R_386_GOTPC    10
+#define R_386_NUM      11
+
+#define R_MIPS_NONE            0
+#define R_MIPS_16              1
+#define R_MIPS_32              2
+#define R_MIPS_REL32           3
+#define R_MIPS_26              4
+#define R_MIPS_HI16            5
+#define R_MIPS_LO16            6
+#define R_MIPS_GPREL16         7
+#define R_MIPS_LITERAL         8
+#define R_MIPS_GOT16           9
+#define R_MIPS_PC16            10
+#define R_MIPS_CALL16          11
+#define R_MIPS_GPREL32         12
+/* The remaining relocs are defined on Irix, although they are not
+   in the MIPS ELF ABI.  */
+#define R_MIPS_UNUSED1         13
+#define R_MIPS_UNUSED2         14
+#define R_MIPS_UNUSED3         15
+#define R_MIPS_SHIFT5          16
+#define R_MIPS_SHIFT6          17
+#define R_MIPS_64              18
+#define R_MIPS_GOT_DISP                19
+#define R_MIPS_GOT_PAGE                20
+#define R_MIPS_GOT_OFST                21
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_GOTHI16         22
+#define R_MIPS_GOTLO16         23
+#define R_MIPS_SUB             24
+#define R_MIPS_INSERT_A                25
+#define R_MIPS_INSERT_B                26
+#define R_MIPS_DELETE          27
+#define R_MIPS_HIGHER          28
+#define R_MIPS_HIGHEST         29
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_CALLHI16                30
+#define R_MIPS_CALLLO16                31
+/*
+ * This range is reserved for vendor specific relocations.
+ */
+#define R_MIPS_LOVENDOR                100
+#define R_MIPS_HIVENDOR                127
+
+
+/*
+ * Sparc ELF relocation types
+ */
+#define        R_SPARC_NONE            0
+#define        R_SPARC_8               1
+#define        R_SPARC_16              2
+#define        R_SPARC_32              3
+#define        R_SPARC_DISP8           4
+#define        R_SPARC_DISP16          5
+#define        R_SPARC_DISP32          6
+#define        R_SPARC_WDISP30         7
+#define        R_SPARC_WDISP22         8
+#define        R_SPARC_HI22            9
+#define        R_SPARC_22              10
+#define        R_SPARC_13              11
+#define        R_SPARC_LO10            12
+#define        R_SPARC_GOT10           13
+#define        R_SPARC_GOT13           14
+#define        R_SPARC_GOT22           15
+#define        R_SPARC_PC10            16
+#define        R_SPARC_PC22            17
+#define        R_SPARC_WPLT30          18
+#define        R_SPARC_COPY            19
+#define        R_SPARC_GLOB_DAT        20
+#define        R_SPARC_JMP_SLOT        21
+#define        R_SPARC_RELATIVE        22
+#define        R_SPARC_UA32            23
+#define R_SPARC_PLT32          24
+#define R_SPARC_HIPLT22                25
+#define R_SPARC_LOPLT10                26
+#define R_SPARC_PCPLT32                27
+#define R_SPARC_PCPLT22                28
+#define R_SPARC_PCPLT10                29
+#define R_SPARC_10             30
+#define R_SPARC_11             31
+#define R_SPARC_WDISP16                40
+#define R_SPARC_WDISP19                41
+#define R_SPARC_7              43
+#define R_SPARC_5              44
+#define R_SPARC_6              45
+
+/* Bits present in AT_HWCAP, primarily for Sparc32.  */
+
+#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
+#define HWCAP_SPARC_STBAR       2
+#define HWCAP_SPARC_SWAP        4
+#define HWCAP_SPARC_MULDIV      8
+#define HWCAP_SPARC_V9         16
+
+
+/*
+ * 68k ELF relocation types
+ */
+#define R_68K_NONE     0
+#define R_68K_32       1
+#define R_68K_16       2
+#define R_68K_8                3
+#define R_68K_PC32     4
+#define R_68K_PC16     5
+#define R_68K_PC8      6
+#define R_68K_GOT32    7
+#define R_68K_GOT16    8
+#define R_68K_GOT8     9
+#define R_68K_GOT32O   10
+#define R_68K_GOT16O   11
+#define R_68K_GOT8O    12
+#define R_68K_PLT32    13
+#define R_68K_PLT16    14
+#define R_68K_PLT8     15
+#define R_68K_PLT32O   16
+#define R_68K_PLT16O   17
+#define R_68K_PLT8O    18
+#define R_68K_COPY     19
+#define R_68K_GLOB_DAT 20
+#define R_68K_JMP_SLOT 21
+#define R_68K_RELATIVE 22
+
+/*
+ * Alpha ELF relocation types
+ */
+#define R_ALPHA_NONE            0       /* No reloc */
+#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
+#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
+#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
+#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
+#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
+#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
+#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
+#define R_ALPHA_OP_PUSH         12      /* OP stack push */
+#define R_ALPHA_OP_STORE        13      /* OP stack pop and store */
+#define R_ALPHA_OP_PSUB         14      /* OP stack subtract */
+#define R_ALPHA_OP_PRSHIFT      15      /* OP stack right shift */
+#define R_ALPHA_GPVALUE         16
+#define R_ALPHA_GPRELHIGH       17
+#define R_ALPHA_GPRELLOW        18
+#define R_ALPHA_IMMED_GP_16     19
+#define R_ALPHA_IMMED_GP_HI32   20
+#define R_ALPHA_IMMED_SCN_HI32  21
+#define R_ALPHA_IMMED_BR_HI32   22
+#define R_ALPHA_IMMED_LO32      23
+#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
+#define R_ALPHA_RELATIVE        27      /* Adjust by program base */
+
+/* Legal values for e_flags field of Elf64_Ehdr.  */
+
+#define EF_ALPHA_32BIT         1       /* All addresses are below 2GB */
+
+
+typedef struct elf32_rel {
+  Elf32_Addr   r_offset;
+  Elf32_Word   r_info;
+} Elf32_Rel;
+
+typedef struct elf64_rel {
+  Elf64_Addr r_offset; /* Location at which to apply the action */
+  Elf64_Word r_info;   /* index and type of relocation */
+} Elf64_Rel;
+
+typedef struct elf32_rela{
+  Elf32_Addr   r_offset;
+  Elf32_Word   r_info;
+  Elf32_Sword  r_addend;
+} Elf32_Rela;
+
+typedef struct elf64_rela {
+  Elf64_Addr r_offset; /* Location at which to apply the action */
+  Elf64_Word r_info;   /* index and type of relocation */
+  Elf64_Word r_addend; /* Constant addend used to compute value */
+} Elf64_Rela;
+
+typedef struct elf32_sym{
+  Elf32_Word   st_name;
+  Elf32_Addr   st_value;
+  Elf32_Word   st_size;
+  unsigned char        st_info;
+  unsigned char        st_other;
+  Elf32_Half   st_shndx;
+} Elf32_Sym;
+
+typedef struct elf64_sym {
+  Elf32_Word st_name;          /* Symbol name, index in string tbl (yes, Elf32) */
+  unsigned char        st_info;        /* Type and binding attributes */
+  unsigned char        st_other;       /* No defined meaning, 0 */
+  Elf64_Half st_shndx;         /* Associated section index */
+  Elf64_Addr st_value;         /* Value of the symbol */
+  Elf64_Word st_size;          /* Associated symbol size */
+} Elf64_Sym;
+
+
+#define EI_NIDENT      16
+
+/* Minimum amount of the header we need to determine whether
+ * we have an executable PPC32/PPC64 Elf file or not.
+ */
+typedef struct elf_ident_t {
+  unsigned char e_ident[EI_NIDENT];
+  __u16                e_type;
+  __u16                e_machine;
+} Elf_Ident;
+
+typedef struct elf32_hdr{
+  unsigned char        e_ident[EI_NIDENT];
+  Elf32_Half   e_type;
+  Elf32_Half   e_machine;
+  Elf32_Word   e_version;
+  Elf32_Addr   e_entry;  /* Entry point */
+  Elf32_Off    e_phoff;
+  Elf32_Off    e_shoff;
+  Elf32_Word   e_flags;
+  Elf32_Half   e_ehsize;
+  Elf32_Half   e_phentsize;
+  Elf32_Half   e_phnum;
+  Elf32_Half   e_shentsize;
+  Elf32_Half   e_shnum;
+  Elf32_Half   e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct elf64_hdr {
+  unsigned char        e_ident[16];            /* ELF "magic number" */
+  Elf64_SHalf e_type;
+  Elf64_Half e_machine;
+  __s32 e_version;
+  Elf64_Addr e_entry;          /* Entry point virtual address */
+  Elf64_Off e_phoff;           /* Program header table file offset */
+  Elf64_Off e_shoff;           /* Section header table file offset */
+  __s32 e_flags;
+  Elf64_SHalf e_ehsize;
+  Elf64_SHalf e_phentsize;
+  Elf64_SHalf e_phnum;
+  Elf64_SHalf e_shentsize;
+  Elf64_SHalf e_shnum;
+  Elf64_SHalf e_shstrndx;
+} Elf64_Ehdr;
+
+/* These constants define the permissions on sections in the program
+   header, p_flags. */
+#define PF_R           0x4
+#define PF_W           0x2
+#define PF_X           0x1
+
+typedef struct elf32_phdr{
+  Elf32_Word   p_type;
+  Elf32_Off    p_offset;
+  Elf32_Addr   p_vaddr;
+  Elf32_Addr   p_paddr;
+  Elf32_Word   p_filesz;
+  Elf32_Word   p_memsz;
+  Elf32_Word   p_flags;
+  Elf32_Word   p_align;
+} Elf32_Phdr;
+
+typedef struct elf64_phdr {
+  __s32 p_type;
+  __s32 p_flags;
+  Elf64_Off p_offset;          /* Segment file offset */
+  Elf64_Addr p_vaddr;          /* Segment virtual address */
+  Elf64_Addr p_paddr;          /* Segment physical address */
+  Elf64_Word p_filesz;         /* Segment size in file */
+  Elf64_Word p_memsz;          /* Segment size in memory */
+  Elf64_Word p_align;          /* Segment alignment, file & memory */
+} Elf64_Phdr;
+
+/* sh_type */
+#define SHT_NULL       0
+#define SHT_PROGBITS   1
+#define SHT_SYMTAB     2
+#define SHT_STRTAB     3
+#define SHT_RELA       4
+#define SHT_HASH       5
+#define SHT_DYNAMIC    6
+#define SHT_NOTE       7
+#define SHT_NOBITS     8
+#define SHT_REL                9
+#define SHT_SHLIB      10
+#define SHT_DYNSYM     11
+#define SHT_NUM                12
+#define SHT_LOPROC     0x70000000
+#define SHT_HIPROC     0x7fffffff
+#define SHT_LOUSER     0x80000000
+#define SHT_HIUSER     0xffffffff
+#define SHT_MIPS_LIST          0x70000000
+#define SHT_MIPS_CONFLICT      0x70000002
+#define SHT_MIPS_GPTAB         0x70000003
+#define SHT_MIPS_UCODE         0x70000004
+
+/* sh_flags */
+#define SHF_WRITE      0x1
+#define SHF_ALLOC      0x2
+#define SHF_EXECINSTR  0x4
+#define SHF_MASKPROC   0xf0000000
+#define SHF_MIPS_GPREL 0x10000000
+
+/* special section indexes */
+#define SHN_UNDEF      0
+#define SHN_LORESERVE  0xff00
+#define SHN_LOPROC     0xff00
+#define SHN_HIPROC     0xff1f
+#define SHN_ABS                0xfff1
+#define SHN_COMMON     0xfff2
+#define SHN_HIRESERVE  0xffff
+#define SHN_MIPS_ACCOMON       0xff00
+typedef struct {
+  Elf32_Word   sh_name;
+  Elf32_Word   sh_type;
+  Elf32_Word   sh_flags;
+  Elf32_Addr   sh_addr;
+  Elf32_Off    sh_offset;
+  Elf32_Word   sh_size;
+  Elf32_Word   sh_link;
+  Elf32_Word   sh_info;
+  Elf32_Word   sh_addralign;
+  Elf32_Word   sh_entsize;
+} Elf32_Shdr;
+
+typedef struct elf64_shdr {
+  Elf32_Word sh_name;          /* Section name, index in string tbl (yes Elf32) */
+  Elf32_Word sh_type;          /* Type of section (yes Elf32) */
+  Elf64_Word sh_flags;         /* Miscellaneous section attributes */
+  Elf64_Addr sh_addr;          /* Section virtual addr at execution */
+  Elf64_Off sh_offset;         /* Section file offset */
+  Elf64_Word sh_size;          /* Size of section in bytes */
+  Elf32_Word sh_link;          /* Index of another section (yes Elf32) */
+  Elf32_Word sh_info;          /* Additional section information (yes Elf32) */
+  Elf64_Word sh_addralign;     /* Section alignment */
+  Elf64_Word sh_entsize;       /* Entry size if section holds table */
+} Elf64_Shdr;
+
+#define        EI_MAG0         0               /* e_ident[] indexes */
+#define        EI_MAG1         1
+#define        EI_MAG2         2
+#define        EI_MAG3         3
+#define        EI_CLASS        4
+#define        EI_DATA         5
+#define        EI_VERSION      6
+#define        EI_PAD          7
+
+#define        ELFMAG0         0x7f            /* EI_MAG */
+#define        ELFMAG1         'E'
+#define        ELFMAG2         'L'
+#define        ELFMAG3         'F'
+#define        ELFMAG          "\177ELF"
+#define        SELFMAG         4
+
+#define        ELFCLASSNONE    0               /* EI_CLASS */
+#define        ELFCLASS32      1
+#define        ELFCLASS64      2
+#define        ELFCLASSNUM     3
+
+#define ELFDATANONE    0               /* e_ident[EI_DATA] */
+#define ELFDATA2LSB    1
+#define ELFDATA2MSB    2
+
+#define EV_NONE                0               /* e_version, EI_VERSION */
+#define EV_CURRENT     1
+#define EV_NUM         2
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS    1
+#define NT_PRFPREG     2
+#define NT_PRPSINFO    3
+#define NT_TASKSTRUCT  4
+
+/* Note header in a PT_NOTE section */
+typedef struct elf32_note {
+  Elf32_Word   n_namesz;       /* Name size */
+  Elf32_Word   n_descsz;       /* Content size */
+  Elf32_Word   n_type;         /* Content type */
+} Elf32_Nhdr;
+
+/* Note header in a PT_NOTE section */
+/*
+ * For now we use the 32 bit version of the structure until we figure
+ * out whether we need anything better.  Note - on the Alpha, "unsigned int"
+ * is only 32 bits.
+ */
+typedef struct elf64_note {
+  Elf32_Word n_namesz; /* Name size */
+  Elf32_Word n_descsz; /* Content size */
+  Elf32_Word n_type;   /* Content type */
+} Elf64_Nhdr;
+
+#if ELF_CLASS == ELFCLASS32
+
+extern Elf32_Dyn _DYNAMIC [];
+#define elfhdr         elf32_hdr
+#define elf_phdr       elf32_phdr
+#define elf_note       elf32_note
+
+#else
+
+extern Elf64_Dyn _DYNAMIC [];
+#define elfhdr         elf64_hdr
+#define elf_phdr       elf64_phdr
+#define elf_note       elf64_note
+
+#endif
+
+
+#endif /* _LINUX_ELF_H */
diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h
new file mode 100644 (file)
index 0000000..fc3d48c
--- /dev/null
@@ -0,0 +1,624 @@
+/*
+ *  linux/include/linux/ext2_fs.h
+ *
+ * Copyright (C) 1992, 1993, 1994, 1995
+ * Remy Card (card@masi.ibp.fr)
+ * Laboratoire MASI - Institut Blaise Pascal
+ * Universite Pierre et Marie Curie (Paris VI)
+ *
+ *  from
+ *
+ *  linux/include/linux/minix_fs.h
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+#ifndef _LINUX_EXT2_FS_H
+#define _LINUX_EXT2_FS_H
+
+#include "types.h"
+
+/*
+ * The second extended filesystem constants/structures
+ */
+
+/*
+ * Define EXT2FS_DEBUG to produce debug messages
+ */
+#undef EXT2FS_DEBUG
+
+/*
+ * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files
+ */
+#define EXT2_PREALLOCATE
+#define EXT2_DEFAULT_PREALLOC_BLOCKS   8
+
+/*
+ * The second extended file system version
+ */
+#define EXT2FS_DATE            "95/08/09"
+#define EXT2FS_VERSION         "0.5b"
+
+/*
+ * Debug code
+ */
+#ifdef EXT2FS_DEBUG
+#      define ext2_debug(f, a...)      { \
+                                       printk ("EXT2-fs DEBUG (%s, %d): %s:", \
+                                               __FILE__, __LINE__, __FUNCTION__); \
+                                       printk (f, ## a); \
+                                       }
+#else
+#      define ext2_debug(f, a...)      /**/
+#endif
+
+/*
+ * Special inodes numbers
+ */
+#define        EXT2_BAD_INO             1      /* Bad blocks inode */
+#define EXT2_ROOT_INO           2      /* Root inode */
+#define EXT2_ACL_IDX_INO        3      /* ACL inode */
+#define EXT2_ACL_DATA_INO       4      /* ACL inode */
+#define EXT2_BOOT_LOADER_INO    5      /* Boot loader inode */
+#define EXT2_UNDEL_DIR_INO      6      /* Undelete directory inode */
+
+/* First non-reserved inode for old ext2 filesystems */
+#define EXT2_GOOD_OLD_FIRST_INO        11
+
+/*
+ * The second extended file system magic number
+ */
+#define EXT2_SUPER_MAGIC       0xEF53
+
+/*
+ * Maximal count of links to a file
+ */
+#define EXT2_LINK_MAX          32000
+
+/*
+ * Macro-instructions used to manage several block sizes
+ */
+#define EXT2_MIN_BLOCK_SIZE            1024
+#define        EXT2_MAX_BLOCK_SIZE             4096
+#define EXT2_MIN_BLOCK_LOG_SIZE                  10
+#ifdef __KERNEL__
+# define EXT2_BLOCK_SIZE(s)            ((s)->s_blocksize)
+#else
+# define EXT2_BLOCK_SIZE(s)            (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
+#endif
+#define EXT2_ACLE_PER_BLOCK(s)         (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry))
+#define        EXT2_ADDR_PER_BLOCK(s)          (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
+#ifdef __KERNEL__
+# define EXT2_BLOCK_SIZE_BITS(s)       ((s)->s_blocksize_bits)
+#else
+# define EXT2_BLOCK_SIZE_BITS(s)       ((s)->s_log_block_size + 10)
+#endif
+#ifdef __KERNEL__
+#define        EXT2_ADDR_PER_BLOCK_BITS(s)     ((s)->u.ext2_sb.s_addr_per_block_bits)
+#define EXT2_INODE_SIZE(s)             ((s)->u.ext2_sb.s_inode_size)
+#define EXT2_FIRST_INO(s)              ((s)->u.ext2_sb.s_first_ino)
+#else
+#define EXT2_INODE_SIZE(s)     (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+                                EXT2_GOOD_OLD_INODE_SIZE : \
+                                (s)->s_inode_size)
+#define EXT2_FIRST_INO(s)      (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
+                                EXT2_GOOD_OLD_FIRST_INO : \
+                                (s)->s_first_ino)
+#endif
+
+/*
+ * Macro-instructions used to manage fragments
+ */
+#define EXT2_MIN_FRAG_SIZE             1024
+#define        EXT2_MAX_FRAG_SIZE              4096
+#define EXT2_MIN_FRAG_LOG_SIZE           10
+#ifdef __KERNEL__
+# define EXT2_FRAG_SIZE(s)             ((s)->u.ext2_sb.s_frag_size)
+# define EXT2_FRAGS_PER_BLOCK(s)       ((s)->u.ext2_sb.s_frags_per_block)
+#else
+# define EXT2_FRAG_SIZE(s)             (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
+# define EXT2_FRAGS_PER_BLOCK(s)       (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
+#endif
+
+/*
+ * ACL structures
+ */
+struct ext2_acl_header /* Header of Access Control Lists */
+{
+       __u32   aclh_size;
+       __u32   aclh_file_count;
+       __u32   aclh_acle_count;
+       __u32   aclh_first_acle;
+};
+
+struct ext2_acl_entry  /* Access Control List Entry */
+{
+       __u32   acle_size;
+       __u16   acle_perms;     /* Access permissions */
+       __u16   acle_type;      /* Type of entry */
+       __u16   acle_tag;       /* User or group identity */
+       __u16   acle_pad1;
+       __u32   acle_next;      /* Pointer on next entry for the */
+                                       /* same inode or on next free entry */
+};
+
+/*
+ * Structure of a blocks group descriptor
+ */
+struct ext2_group_desc
+{
+       __u32   bg_block_bitmap;                /* Blocks bitmap block */
+       __u32   bg_inode_bitmap;                /* Inodes bitmap block */
+       __u32   bg_inode_table;         /* Inodes table block */
+       __u16   bg_free_blocks_count;   /* Free blocks count */
+       __u16   bg_free_inodes_count;   /* Free inodes count */
+       __u16   bg_used_dirs_count;     /* Directories count */
+       __u16   bg_pad;
+       __u32   bg_reserved[3];
+};
+
+/*
+ * Macro-instructions used to manage group descriptors
+ */
+#ifdef __KERNEL__
+# define EXT2_BLOCKS_PER_GROUP(s)      ((s)->u.ext2_sb.s_blocks_per_group)
+# define EXT2_DESC_PER_BLOCK(s)                ((s)->u.ext2_sb.s_desc_per_block)
+# define EXT2_INODES_PER_GROUP(s)      ((s)->u.ext2_sb.s_inodes_per_group)
+# define EXT2_DESC_PER_BLOCK_BITS(s)   ((s)->u.ext2_sb.s_desc_per_block_bits)
+#else
+# define EXT2_BLOCKS_PER_GROUP(s)      ((s)->s_blocks_per_group)
+# define EXT2_DESC_PER_BLOCK(s)                (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
+# define EXT2_INODES_PER_GROUP(s)      ((s)->s_inodes_per_group)
+#endif
+
+/*
+ * Constants relative to the data blocks
+ */
+#define        EXT2_NDIR_BLOCKS                12
+#define        EXT2_IND_BLOCK                  EXT2_NDIR_BLOCKS
+#define        EXT2_DIND_BLOCK                 (EXT2_IND_BLOCK + 1)
+#define        EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
+#define        EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)
+
+/*
+ * Inode flags
+ */
+#define        EXT2_SECRM_FL                   0x00000001 /* Secure deletion */
+#define        EXT2_UNRM_FL                    0x00000002 /* Undelete */
+#define        EXT2_COMPR_FL                   0x00000004 /* Compress file */
+#define EXT2_SYNC_FL                   0x00000008 /* Synchronous updates */
+#define EXT2_IMMUTABLE_FL              0x00000010 /* Immutable file */
+#define EXT2_APPEND_FL                 0x00000020 /* writes to file may only append */
+#define EXT2_NODUMP_FL                 0x00000040 /* do not dump file */
+#define EXT2_NOATIME_FL                        0x00000080 /* do not update atime */
+/* Reserved for compression usage... */
+#define EXT2_DIRTY_FL                  0x00000100
+#define EXT2_COMPRBLK_FL               0x00000200 /* One or more compressed clusters */
+#define EXT2_NOCOMP_FL                 0x00000400 /* Don't compress */
+#define EXT2_ECOMPR_FL                 0x00000800 /* Compression error */
+/* End compression flags --- maybe not all used */     
+#define EXT2_BTREE_FL                  0x00001000 /* btree format dir */
+#define EXT2_RESERVED_FL               0x80000000 /* reserved for ext2 lib */
+
+#define EXT2_FL_USER_VISIBLE           0x00001FFF /* User visible flags */
+#define EXT2_FL_USER_MODIFIABLE                0x000000FF /* User modifiable flags */
+
+/*
+ * ioctl commands
+ */
+#define        EXT2_IOC_GETFLAGS               _IOR('f', 1, long)
+#define        EXT2_IOC_SETFLAGS               _IOW('f', 2, long)
+#define        EXT2_IOC_GETVERSION             _IOR('v', 1, long)
+#define        EXT2_IOC_SETVERSION             _IOW('v', 2, long)
+
+/*
+ * Structure of an inode on the disk
+ */
+struct ext2_inode {
+       __u16   i_mode;         /* File mode */
+       __u16   i_uid;          /* Owner Uid */
+       __u32   i_size;         /* Size in bytes */
+       __u32   i_atime;        /* Access time */
+       __u32   i_ctime;        /* Creation time */
+       __u32   i_mtime;        /* Modification time */
+       __u32   i_dtime;        /* Deletion Time */
+       __u16   i_gid;          /* Group Id */
+       __u16   i_links_count;  /* Links count */
+       __u32   i_blocks;       /* Blocks count */
+       __u32   i_flags;        /* File flags */
+       union {
+               struct {
+                       __u32  l_i_reserved1;
+               } linux1;
+               struct {
+                       __u32  h_i_translator;
+               } hurd1;
+               struct {
+                       __u32  m_i_reserved1;
+               } masix1;
+       } osd1;                         /* OS dependent 1 */
+       __u32   i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
+       __u32   i_version;      /* File version (for NFS) */
+       __u32   i_file_acl;     /* File ACL */
+       __u32   i_dir_acl;      /* Directory ACL */
+       __u32   i_faddr;        /* Fragment address */
+       union {
+               struct {
+                       __u8    l_i_frag;       /* Fragment number */
+                       __u8    l_i_fsize;      /* Fragment size */
+                       __u16   i_pad1;
+                       __u32   l_i_reserved2[2];
+               } linux2;
+               struct {
+                       __u8    h_i_frag;       /* Fragment number */
+                       __u8    h_i_fsize;      /* Fragment size */
+                       __u16   h_i_mode_high;
+                       __u16   h_i_uid_high;
+                       __u16   h_i_gid_high;
+                       __u32   h_i_author;
+               } hurd2;
+               struct {
+                       __u8    m_i_frag;       /* Fragment number */
+                       __u8    m_i_fsize;      /* Fragment size */
+                       __u16   m_pad1;
+                       __u32   m_i_reserved2[2];
+               } masix2;
+       } osd2;                         /* OS dependent 2 */
+};
+
+#define i_size_high    i_dir_acl
+
+#if defined(__KERNEL__) || defined(__linux__)
+#define i_reserved1    osd1.linux1.l_i_reserved1
+#define i_frag         osd2.linux2.l_i_frag
+#define i_fsize                osd2.linux2.l_i_fsize
+#define i_reserved2    osd2.linux2.l_i_reserved2
+#endif
+
+#ifdef __hurd__
+#define i_translator   osd1.hurd1.h_i_translator
+#define i_frag         osd2.hurd2.h_i_frag;
+#define i_fsize                osd2.hurd2.h_i_fsize;
+#define i_uid_high     osd2.hurd2.h_i_uid_high
+#define i_gid_high     osd2.hurd2.h_i_gid_high
+#define i_author       osd2.hurd2.h_i_author
+#endif
+
+#ifdef __masix__
+#define i_reserved1    osd1.masix1.m_i_reserved1
+#define i_frag         osd2.masix2.m_i_frag
+#define i_fsize                osd2.masix2.m_i_fsize
+#define i_reserved2    osd2.masix2.m_i_reserved2
+#endif
+
+/*
+ * File system states
+ */
+#define        EXT2_VALID_FS                   0x0001  /* Unmounted cleanly */
+#define        EXT2_ERROR_FS                   0x0002  /* Errors detected */
+
+/*
+ * Mount flags
+ */
+#define EXT2_MOUNT_CHECK_NORMAL                0x0001  /* Do some more checks */
+#define EXT2_MOUNT_CHECK_STRICT                0x0002  /* Do again more checks */
+#define EXT2_MOUNT_CHECK               (EXT2_MOUNT_CHECK_NORMAL | \
+                                        EXT2_MOUNT_CHECK_STRICT)
+#define EXT2_MOUNT_GRPID               0x0004  /* Create files with directory's group */
+#define EXT2_MOUNT_DEBUG               0x0008  /* Some debugging messages */
+#define EXT2_MOUNT_ERRORS_CONT         0x0010  /* Continue on errors */
+#define EXT2_MOUNT_ERRORS_RO           0x0020  /* Remount fs ro on errors */
+#define EXT2_MOUNT_ERRORS_PANIC                0x0040  /* Panic on errors */
+#define EXT2_MOUNT_MINIX_DF            0x0080  /* Mimics the Minix statfs */
+
+#define clear_opt(o, opt)              o &= ~EXT2_MOUNT_##opt
+#define set_opt(o, opt)                        o |= EXT2_MOUNT_##opt
+#define test_opt(sb, opt)              ((sb)->u.ext2_sb.s_mount_opt & \
+                                        EXT2_MOUNT_##opt)
+/*
+ * Maximal mount counts between two filesystem checks
+ */
+#define EXT2_DFL_MAX_MNT_COUNT         20      /* Allow 20 mounts */
+#define EXT2_DFL_CHECKINTERVAL         0       /* Don't use interval check */
+
+/*
+ * Behaviour when detecting errors
+ */
+#define EXT2_ERRORS_CONTINUE           1       /* Continue execution */
+#define EXT2_ERRORS_RO                 2       /* Remount fs read-only */
+#define EXT2_ERRORS_PANIC              3       /* Panic */
+#define EXT2_ERRORS_DEFAULT            EXT2_ERRORS_CONTINUE
+
+/*
+ * Structure of the super block
+ */
+struct ext2_super_block {
+       __u32   s_inodes_count;         /* Inodes count */
+       __u32   s_blocks_count;         /* Blocks count */
+       __u32   s_r_blocks_count;       /* Reserved blocks count */
+       __u32   s_free_blocks_count;    /* Free blocks count */
+       __u32   s_free_inodes_count;    /* Free inodes count */
+       __u32   s_first_data_block;     /* First Data Block */
+       __u32   s_log_block_size;       /* Block size */
+       __s32   s_log_frag_size;        /* Fragment size */
+       __u32   s_blocks_per_group;     /* # Blocks per group */
+       __u32   s_frags_per_group;      /* # Fragments per group */
+       __u32   s_inodes_per_group;     /* # Inodes per group */
+       __u32   s_mtime;                /* Mount time */
+       __u32   s_wtime;                /* Write time */
+       __u16   s_mnt_count;            /* Mount count */
+       __s16   s_max_mnt_count;        /* Maximal mount count */
+       __u16   s_magic;                /* Magic signature */
+       __u16   s_state;                /* File system state */
+       __u16   s_errors;               /* Behaviour when detecting errors */
+       __u16   s_minor_rev_level;      /* minor revision level */
+       __u32   s_lastcheck;            /* time of last check */
+       __u32   s_checkinterval;        /* max. time between checks */
+       __u32   s_creator_os;           /* OS */
+       __u32   s_rev_level;            /* Revision level */
+       __u16   s_def_resuid;           /* Default uid for reserved blocks */
+       __u16   s_def_resgid;           /* Default gid for reserved blocks */
+       /*
+        * These fields are for EXT2_DYNAMIC_REV superblocks only.
+        *
+        * Note: the difference between the compatible feature set and
+        * the incompatible feature set is that if there is a bit set
+        * in the incompatible feature set that the kernel doesn't
+        * know about, it should refuse to mount the filesystem.
+        * 
+        * e2fsck's requirements are more strict; if it doesn't know
+        * about a feature in either the compatible or incompatible
+        * feature set, it must abort and not try to meddle with
+        * things it doesn't understand...
+        */
+       __u32   s_first_ino;            /* First non-reserved inode */
+       __u16   s_inode_size;           /* size of inode structure */
+       __u16   s_block_group_nr;       /* block group # of this superblock */
+       __u32   s_feature_compat;       /* compatible feature set */
+       __u32   s_feature_incompat;     /* incompatible feature set */
+       __u32   s_feature_ro_compat;    /* readonly-compatible feature set */
+       __u8    s_uuid[16];             /* 128-bit uuid for volume */
+       char    s_volume_name[16];      /* volume name */
+       char    s_last_mounted[64];     /* directory where last mounted */
+       __u32   s_algorithm_usage_bitmap; /* For compression */
+       /*
+        * Performance hints.  Directory preallocation should only
+        * happen if the EXT2_COMPAT_PREALLOC flag is on.
+        */
+       __u8    s_prealloc_blocks;      /* Nr of blocks to try to preallocate*/
+       __u8    s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
+       __u16   s_padding1;
+       __u32   s_reserved[204];        /* Padding to the end of the block */
+};
+
+#ifdef __KERNEL__
+#define EXT2_SB(sb)    (&((sb)->u.ext2_sb))
+#else
+/* Assume that user mode programs are passing in an ext2fs superblock, not
+ * a kernel struct super_block.  This will allow us to call the feature-test
+ * macros from user land. */
+#define EXT2_SB(sb)    (sb)
+#endif
+
+/*
+ * Codes for operating systems
+ */
+#define EXT2_OS_LINUX          0
+#define EXT2_OS_HURD           1
+#define EXT2_OS_MASIX          2
+#define EXT2_OS_FREEBSD                3
+#define EXT2_OS_LITES          4
+
+/*
+ * Revision levels
+ */
+#define EXT2_GOOD_OLD_REV      0       /* The good old (original) format */
+#define EXT2_DYNAMIC_REV       1       /* V2 format w/ dynamic inode sizes */
+
+#define EXT2_CURRENT_REV       EXT2_GOOD_OLD_REV
+#define EXT2_MAX_SUPP_REV      EXT2_DYNAMIC_REV
+
+#define EXT2_GOOD_OLD_INODE_SIZE 128
+
+/*
+ * Feature set definitions
+ */
+
+#define EXT2_HAS_COMPAT_FEATURE(sb,mask)                       \
+       ( EXT2_SB(sb)->s_feature_compat & (mask) )
+#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)                    \
+       ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
+#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)                     \
+       ( EXT2_SB(sb)->s_feature_incompat & (mask) )
+
+#define EXT2_FEATURE_COMPAT_DIR_PREALLOC       0x0001
+
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER    0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE      0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR       0x0004
+
+#define EXT2_FEATURE_INCOMPAT_COMPRESSION      0x0001
+#define EXT2_FEATURE_INCOMPAT_FILETYPE         0x0002
+
+#define EXT2_FEATURE_COMPAT_SUPP       0
+#define EXT2_FEATURE_INCOMPAT_SUPP     EXT2_FEATURE_INCOMPAT_FILETYPE
+#define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+                                        EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+
+/*
+ * Default values for user and/or group using reserved blocks
+ */
+#define        EXT2_DEF_RESUID         0
+#define        EXT2_DEF_RESGID         0
+
+/*
+ * Structure of a directory entry
+ */
+#define EXT2_NAME_LEN 255
+
+struct ext2_dir_entry {
+       __u32   inode;                  /* Inode number */
+       __u16   rec_len;                /* Directory entry length */
+       __u16   name_len;               /* Name length */
+       char    name[EXT2_NAME_LEN];    /* File name */
+};
+
+/*
+ * The new version of the directory entry.  Since EXT2 structures are
+ * stored in intel byte order, and the name_len field could never be
+ * bigger than 255 chars, it's safe to reclaim the extra byte for the
+ * file_type field.
+ */
+struct ext2_dir_entry_2 {
+       __u32   inode;                  /* Inode number */
+       __u16   rec_len;                /* Directory entry length */
+       __u8    name_len;               /* Name length */
+       __u8    file_type;
+       char    name[EXT2_NAME_LEN];    /* File name */
+};
+
+/*
+ * Ext2 directory file types.  Only the low 3 bits are used.  The
+ * other bits are reserved for now.
+ */
+#define EXT2_FT_UNKNOWN                0
+#define EXT2_FT_REG_FILE       1
+#define EXT2_FT_DIR            2
+#define EXT2_FT_CHRDEV         3
+#define EXT2_FT_BLKDEV                 4
+#define EXT2_FT_FIFO           5
+#define EXT2_FT_SOCK           6
+#define EXT2_FT_SYMLINK                7
+
+#define EXT2_FT_MAX            8
+
+/*
+ * EXT2_DIR_PAD defines the directory entries boundaries
+ *
+ * NOTE: It must be a multiple of 4
+ */
+#define EXT2_DIR_PAD                   4
+#define EXT2_DIR_ROUND                         (EXT2_DIR_PAD - 1)
+#define EXT2_DIR_REC_LEN(name_len)     (((name_len) + 8 + EXT2_DIR_ROUND) & \
+                                        ~EXT2_DIR_ROUND)
+
+#ifdef __KERNEL__
+
+/* Filesize hard limits for 64-bit file offsets */
+extern long long ext2_max_sizes[];
+
+/*
+ * Function prototypes
+ */
+
+/*
+ * Ok, these declarations are also in <linux/kernel.h> but none of the
+ * ext2 source programs needs to include it so they are duplicated here.
+ */
+# define NORET_TYPE    /**/
+# define ATTRIB_NORET  __attribute__((noreturn))
+# define NORET_AND     noreturn,
+
+/* acl.c */
+extern int ext2_permission (struct inode *, int);
+
+/* balloc.c */
+extern int ext2_group_sparse(int group);
+extern int ext2_new_block (const struct inode *, unsigned long,
+                          __u32 *, __u32 *, int *);
+extern void ext2_free_blocks (const struct inode *, unsigned long,
+                             unsigned long);
+extern unsigned long ext2_count_free_blocks (struct super_block *);
+extern void ext2_check_blocks_bitmap (struct super_block *);
+extern struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
+                                                   unsigned int block_group,
+                                                   struct buffer_head ** bh);
+
+/* bitmap.c */
+extern unsigned long ext2_count_free (struct buffer_head *, unsigned);
+
+/* dir.c */
+extern int ext2_check_dir_entry (const char *, struct inode *,
+                                struct ext2_dir_entry_2 *, struct buffer_head *,
+                                unsigned long);
+
+/* file.c */
+extern int ext2_read (struct inode *, struct file *, char *, int);
+extern int ext2_write (struct inode *, struct file *, char *, int);
+
+/* fsync.c */
+extern int ext2_sync_file (struct file *, struct dentry *);
+
+/* ialloc.c */
+extern struct inode * ext2_new_inode (const struct inode *, int, int *);
+extern void ext2_free_inode (struct inode *);
+extern unsigned long ext2_count_free_inodes (struct super_block *);
+extern void ext2_check_inodes_bitmap (struct super_block *);
+
+/* inode.c */
+extern int ext2_bmap (struct inode *, int);
+
+extern struct buffer_head * ext2_getblk (struct inode *, long, int, int *);
+extern struct buffer_head * ext2_bread (struct inode *, int, int, int *);
+
+extern int ext2_getcluster (struct inode * inode, long block);
+extern void ext2_read_inode (struct inode *);
+extern void ext2_write_inode (struct inode *);
+extern void ext2_put_inode (struct inode *);
+extern void ext2_delete_inode (struct inode *);
+extern int ext2_sync_inode (struct inode *);
+extern int ext2_notify_change(struct dentry *, struct iattr *);
+extern void ext2_discard_prealloc (struct inode *);
+
+/* ioctl.c */
+extern int ext2_ioctl (struct inode *, struct file *, unsigned int,
+                      unsigned long);
+
+/* namei.c */
+extern void ext2_release (struct inode *, struct file *);
+extern struct dentry *ext2_lookup (struct inode *, struct dentry *);
+extern int ext2_create (struct inode *,struct dentry *,int);
+extern int ext2_mkdir (struct inode *,struct dentry *,int);
+extern int ext2_rmdir (struct inode *,struct dentry *);
+extern int ext2_unlink (struct inode *,struct dentry *);
+extern int ext2_symlink (struct inode *,struct dentry *,const char *);
+extern int ext2_link (struct dentry *, struct inode *, struct dentry *);
+extern int ext2_mknod (struct inode *, struct dentry *, int, int);
+extern int ext2_rename (struct inode *, struct dentry *,
+                       struct inode *, struct dentry *);
+
+/* super.c */
+extern void ext2_error (struct super_block *, const char *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+extern NORET_TYPE void ext2_panic (struct super_block *, const char *,
+                                  const char *, ...)
+       __attribute__ ((NORET_AND format (printf, 3, 4)));
+extern void ext2_warning (struct super_block *, const char *, const char *, ...)
+       __attribute__ ((format (printf, 3, 4)));
+extern void ext2_put_super (struct super_block *);
+extern void ext2_write_super (struct super_block *);
+extern int ext2_remount (struct super_block *, int *, char *);
+extern struct super_block * ext2_read_super (struct super_block *,void *,int);
+extern int init_ext2_fs(void);
+extern int ext2_statfs (struct super_block *, struct statfs *, int);
+
+/* truncate.c */
+extern void ext2_truncate (struct inode *);
+
+/*
+ * Inodes and files operations
+ */
+
+/* dir.c */
+extern struct inode_operations ext2_dir_inode_operations;
+
+/* file.c */
+extern struct inode_operations ext2_file_inode_operations;
+
+/* symlink.c */
+extern struct inode_operations ext2_symlink_inode_operations;
+
+#endif /* __KERNEL__ */
+
+#endif /* _LINUX_EXT2_FS_H */
diff --git a/include/linux/iso_fs.h b/include/linux/iso_fs.h
new file mode 100644 (file)
index 0000000..5e4610a
--- /dev/null
@@ -0,0 +1,177 @@
+
+#ifndef _ISOFS_FS_H
+#define _ISOFS_FS_H
+
+#include <linux/types.h>
+/*
+ * The isofs filesystem constants/structures
+ */
+
+/* This part borrowed from the bsd386 isofs */
+#define ISODCL(from, to) (to - from + 1)
+
+struct iso_volume_descriptor {
+       char type[ISODCL(1,1)]; /* 711 */
+       char id[ISODCL(2,6)];
+       char version[ISODCL(7,7)];
+       char data[ISODCL(8,2048)];
+};
+
+/* volume descriptor types */
+#define ISO_VD_PRIMARY 1
+#define ISO_VD_SUPPLEMENTARY 2
+#define ISO_VD_END 255
+
+#define ISO_STANDARD_ID "CD001"
+
+struct iso_primary_descriptor {
+       char type                       [ISODCL (  1,   1)]; /* 711 */
+       char id                         [ISODCL (  2,   6)];
+       char version                    [ISODCL (  7,   7)]; /* 711 */
+       char unused1                    [ISODCL (  8,   8)];
+       char system_id                  [ISODCL (  9,  40)]; /* achars */
+       char volume_id                  [ISODCL ( 41,  72)]; /* dchars */
+       char unused2                    [ISODCL ( 73,  80)];
+       char volume_space_size          [ISODCL ( 81,  88)]; /* 733 */
+       char unused3                    [ISODCL ( 89, 120)];
+       char volume_set_size            [ISODCL (121, 124)]; /* 723 */
+       char volume_sequence_number     [ISODCL (125, 128)]; /* 723 */
+       char logical_block_size         [ISODCL (129, 132)]; /* 723 */
+       char path_table_size            [ISODCL (133, 140)]; /* 733 */
+       char type_l_path_table          [ISODCL (141, 144)]; /* 731 */
+       char opt_type_l_path_table      [ISODCL (145, 148)]; /* 731 */
+       char type_m_path_table          [ISODCL (149, 152)]; /* 732 */
+       char opt_type_m_path_table      [ISODCL (153, 156)]; /* 732 */
+       char root_directory_record      [ISODCL (157, 190)]; /* 9.1 */
+       char volume_set_id              [ISODCL (191, 318)]; /* dchars */
+       char publisher_id               [ISODCL (319, 446)]; /* achars */
+       char preparer_id                [ISODCL (447, 574)]; /* achars */
+       char application_id             [ISODCL (575, 702)]; /* achars */
+       char copyright_file_id          [ISODCL (703, 739)]; /* 7.5 dchars */
+       char abstract_file_id           [ISODCL (740, 776)]; /* 7.5 dchars */
+       char bibliographic_file_id      [ISODCL (777, 813)]; /* 7.5 dchars */
+       char creation_date              [ISODCL (814, 830)]; /* 8.4.26.1 */
+       char modification_date          [ISODCL (831, 847)]; /* 8.4.26.1 */
+       char expiration_date            [ISODCL (848, 864)]; /* 8.4.26.1 */
+       char effective_date             [ISODCL (865, 881)]; /* 8.4.26.1 */
+       char file_structure_version     [ISODCL (882, 882)]; /* 711 */
+       char unused4                    [ISODCL (883, 883)];
+       char application_data           [ISODCL (884, 1395)];
+       char unused5                    [ISODCL (1396, 2048)];
+};
+
+/* Almost the same as the primary descriptor but two fields are specified */
+struct iso_supplementary_descriptor {
+       char type                       [ISODCL (  1,   1)]; /* 711 */
+       char id                         [ISODCL (  2,   6)];
+       char version                    [ISODCL (  7,   7)]; /* 711 */
+       char flags                      [ISODCL (  8,   8)]; /* 853 */
+       char system_id                  [ISODCL (  9,  40)]; /* achars */
+       char volume_id                  [ISODCL ( 41,  72)]; /* dchars */
+       char unused2                    [ISODCL ( 73,  80)];
+       char volume_space_size          [ISODCL ( 81,  88)]; /* 733 */
+       char escape                     [ISODCL ( 89, 120)]; /* 856 */
+       char volume_set_size            [ISODCL (121, 124)]; /* 723 */
+       char volume_sequence_number     [ISODCL (125, 128)]; /* 723 */
+       char logical_block_size         [ISODCL (129, 132)]; /* 723 */
+       char path_table_size            [ISODCL (133, 140)]; /* 733 */
+       char type_l_path_table          [ISODCL (141, 144)]; /* 731 */
+       char opt_type_l_path_table      [ISODCL (145, 148)]; /* 731 */
+       char type_m_path_table          [ISODCL (149, 152)]; /* 732 */
+       char opt_type_m_path_table      [ISODCL (153, 156)]; /* 732 */
+       char root_directory_record      [ISODCL (157, 190)]; /* 9.1 */
+       char volume_set_id              [ISODCL (191, 318)]; /* dchars */
+       char publisher_id               [ISODCL (319, 446)]; /* achars */
+       char preparer_id                [ISODCL (447, 574)]; /* achars */
+       char application_id             [ISODCL (575, 702)]; /* achars */
+       char copyright_file_id          [ISODCL (703, 739)]; /* 7.5 dchars */
+       char abstract_file_id           [ISODCL (740, 776)]; /* 7.5 dchars */
+       char bibliographic_file_id      [ISODCL (777, 813)]; /* 7.5 dchars */
+       char creation_date              [ISODCL (814, 830)]; /* 8.4.26.1 */
+       char modification_date          [ISODCL (831, 847)]; /* 8.4.26.1 */
+       char expiration_date            [ISODCL (848, 864)]; /* 8.4.26.1 */
+       char effective_date             [ISODCL (865, 881)]; /* 8.4.26.1 */
+       char file_structure_version     [ISODCL (882, 882)]; /* 711 */
+       char unused4                    [ISODCL (883, 883)];
+       char application_data           [ISODCL (884, 1395)];
+       char unused5                    [ISODCL (1396, 2048)];
+};
+
+
+#define HS_STANDARD_ID "CDROM"
+
+struct  hs_volume_descriptor {
+       char foo                        [ISODCL (  1,   8)]; /* 733 */
+       char type                       [ISODCL (  9,   9)]; /* 711 */
+       char id                         [ISODCL ( 10,  14)];
+       char version                    [ISODCL ( 15,  15)]; /* 711 */
+       char data[ISODCL(16,2048)];
+};
+
+
+struct hs_primary_descriptor {
+       char foo                        [ISODCL (  1,   8)]; /* 733 */
+       char type                       [ISODCL (  9,   9)]; /* 711 */
+       char id                         [ISODCL ( 10,  14)];
+       char version                    [ISODCL ( 15,  15)]; /* 711 */
+       char unused1                    [ISODCL ( 16,  16)]; /* 711 */
+       char system_id                  [ISODCL ( 17,  48)]; /* achars */
+       char volume_id                  [ISODCL ( 49,  80)]; /* dchars */
+       char unused2                    [ISODCL ( 81,  88)]; /* 733 */
+       char volume_space_size          [ISODCL ( 89,  96)]; /* 733 */
+       char unused3                    [ISODCL ( 97, 128)]; /* 733 */
+       char volume_set_size            [ISODCL (129, 132)]; /* 723 */
+       char volume_sequence_number     [ISODCL (133, 136)]; /* 723 */
+       char logical_block_size         [ISODCL (137, 140)]; /* 723 */
+       char path_table_size            [ISODCL (141, 148)]; /* 733 */
+       char type_l_path_table          [ISODCL (149, 152)]; /* 731 */
+       char unused4                    [ISODCL (153, 180)]; /* 733 */
+       char root_directory_record      [ISODCL (181, 214)]; /* 9.1 */
+};
+
+/* We use this to help us look up the parent inode numbers. */
+
+struct iso_path_table{
+       unsigned char  name_len[2];     /* 721 */
+       char extent[4];         /* 731 */
+       char  parent[2];        /* 721 */
+       char name[0];
+};
+
+/* high sierra is identical to iso, except that the date is only 6 bytes, and
+   there is an extra reserved byte after the flags */
+
+struct iso_directory_record {
+       char length                     [ISODCL (1, 1)]; /* 711 */
+       char ext_attr_length            [ISODCL (2, 2)]; /* 711 */
+       char extent                     [ISODCL (3, 10)]; /* 733 */
+       char size                       [ISODCL (11, 18)]; /* 733 */
+       char date                       [ISODCL (19, 25)]; /* 7 by 711 */
+       char flags                      [ISODCL (26, 26)];
+       char file_unit_size             [ISODCL (27, 27)]; /* 711 */
+       char interleave                 [ISODCL (28, 28)]; /* 711 */
+       char volume_sequence_number     [ISODCL (29, 32)]; /* 723 */
+       unsigned char name_len          [ISODCL (33, 33)]; /* 711 */
+       char name                       [0];
+};
+
+#define ISOFS_BLOCK_BITS 11
+#define ISOFS_BLOCK_SIZE 2048
+
+#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize)
+#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits)
+#define ISOFS_ZONE_BITS(INODE)   ((INODE)->i_sb->u.isofs_sb.s_log_zone_size)
+
+#define ISOFS_SUPER_MAGIC 0x9660
+
+extern int isonum_711(char *);
+extern int isonum_712(char *);
+extern int isonum_721(char *);
+extern int isonum_722(char *);
+extern int isonum_723(char *);
+extern int isonum_731(char *);
+extern int isonum_732(char *);
+extern int isonum_733(char *);
+
+
+#endif
diff --git a/include/linux/stat.h b/include/linux/stat.h
new file mode 100644 (file)
index 0000000..0cb11ee
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef _LINUX_STAT_H
+#define _LINUX_STAT_H
+
+#define S_IFMT  00170000
+#define S_IFSOCK 0140000
+#define S_IFLNK         0120000
+#define S_IFREG  0100000
+#define S_IFBLK  0060000
+#define S_IFDIR  0040000
+#define S_IFCHR  0020000
+#define S_IFIFO  0010000
+#define S_ISUID  0004000
+#define S_ISGID  0002000
+#define S_ISVTX  0001000
+
+#define S_ISLNK(m)     (((m) & S_IFMT) == S_IFLNK)
+#define S_ISREG(m)     (((m) & S_IFMT) == S_IFREG)
+#define S_ISDIR(m)     (((m) & S_IFMT) == S_IFDIR)
+#define S_ISCHR(m)     (((m) & S_IFMT) == S_IFCHR)
+#define S_ISBLK(m)     (((m) & S_IFMT) == S_IFBLK)
+#define S_ISFIFO(m)    (((m) & S_IFMT) == S_IFIFO)
+#define S_ISSOCK(m)    (((m) & S_IFMT) == S_IFSOCK)
+
+#define S_IRWXU 00700
+#define S_IRUSR 00400
+#define S_IWUSR 00200
+#define S_IXUSR 00100
+
+#define S_IRWXG 00070
+#define S_IRGRP 00040
+#define S_IWGRP 00020
+#define S_IXGRP 00010
+
+#define S_IRWXO 00007
+#define S_IROTH 00004
+#define S_IWOTH 00002
+#define S_IXOTH 00001
+
+#define S_IRWXUGO      (S_IRWXU|S_IRWXG|S_IRWXO)
+#define S_IALLUGO      (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
+#define S_IRUGO                (S_IRUSR|S_IRGRP|S_IROTH)
+#define S_IWUGO                (S_IWUSR|S_IWGRP|S_IWOTH)
+#define S_IXUGO                (S_IXUSR|S_IXGRP|S_IXOTH)
+
+#endif
diff --git a/include/linux/types.h b/include/linux/types.h
new file mode 100644 (file)
index 0000000..be3a85b
--- /dev/null
@@ -0,0 +1 @@
+#include "../types.h"
\ No newline at end of file
diff --git a/include/mac-part.h b/include/mac-part.h
new file mode 100644 (file)
index 0000000..428f623
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Structure of a Macintosh driver descriptor (block 0)
+ * and partition table (blocks 1..n).
+ *
+ * Copyright 1996 Paul Mackerras.
+ */
+
+#define MAC_PARTITION_MAGIC    0x504d
+
+/* type field value for A/UX or other Unix partitions */
+#define APPLE_AUX_TYPE "Apple_UNIX_SVR2"
+
+struct mac_partition {
+    __u16      signature;      /* expected to be MAC_PARTITION_MAGIC */
+    __u16      res1;
+    __u32      map_count;      /* # blocks in partition map */
+    __u32      start_block;    /* absolute starting block # of partition */
+    __u32      block_count;    /* number of blocks in partition */
+    char       name[32];       /* partition name */
+    char       type[32];       /* string type description */
+    __u32      data_start;     /* rel block # of first data block */
+    __u32      data_count;     /* number of data blocks */
+    __u32      status;         /* partition status */
+    __u32      boot_start;     /* logical start block no. of bootstrap */
+    __u32      boot_size;      /* no. of bytes in bootstrap */
+    __u32      boot_load;      /* bootstrap load address in memory */
+    __u32      boot_load2;     /* reserved for extension of boot_load */
+    __u32      boot_entry;     /* entry point address for bootstrap */
+    __u32      boot_entry2;    /* reserved for extension of boot_entry */
+    __u32      boot_cksum;
+    char       processor[16];  /* name of processor that boot is for */
+};
+
+/* Bit in status field */
+#define STATUS_BOOTABLE        8       /* partition is bootable */
+
+#define MAC_DRIVER_MAGIC       0x4552
+
+/* Driver descriptor structure, in block 0 */
+struct mac_driver_desc {
+    __u16      signature;      /* expected to be MAC_DRIVER_MAGIC */
+    __u16      block_size;
+    __u32      block_count;
+    /* ... more stuff */
+};
diff --git a/include/md5.h b/include/md5.h
new file mode 100644 (file)
index 0000000..c1dbd06
--- /dev/null
@@ -0,0 +1,30 @@
+/* md5.h - an implementation of the MD5 algorithm and MD5 crypt */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2000  Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* If CHECK is true, check a password for correctness. Returns 0
+   if password was correct, and a value != 0 for error, similarly
+   to strcmp.
+   If CHECK is false, crypt KEY and save the result in CRYPTED.
+   CRYPTED must have a salt.  */
+extern int md5_password (const char *key, char *crypted, int check);
+
+/* For convenience.  */
+#define check_md5_password(key,crypted)        md5_password((key), (crypted), 1)
+#define make_md5_password(key,crypted) md5_password((key), (crypted), 0)
diff --git a/include/partition.h b/include/partition.h
new file mode 100644 (file)
index 0000000..244227f
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+    Partition map management
+
+    Copyright (C) 1999 Benjamin Herrenschmidt
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef PARTITION_H
+#define PARTITION_H
+
+struct partition_t;
+
+#include "types.h"
+#include "stddef.h"
+#include "prom.h"
+
+#define MAX_PARTITIONS 32
+#define MAX_PART_NAME  32
+
+struct partition_t {
+       struct partition_t*     next;
+       int                     part_number;
+       char                    part_name[MAX_PART_NAME];
+       unsigned long           part_start; /* In blocks */
+       unsigned long           part_size; /* In blocks */
+       unsigned short          blocksize;
+};
+
+extern struct partition_t*     partitions_lookup(const char *device);
+extern void                    partitions_free(struct partition_t* list);
+
+
+
+#endif
diff --git a/include/prom.h b/include/prom.h
new file mode 100644 (file)
index 0000000..b217be4
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+    Definitions for talking to the Open Firmware PROM on
+    Power Macintosh computers.
+
+    Copyright (C) 1999 Marius Vollmer
+    Copyright (C) 1996 Paul Mackerras.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef PROM_H
+#define PROM_H
+
+#include "stdarg.h"
+
+typedef void *prom_handle;
+typedef void *ihandle;
+typedef void *phandle;
+
+#define PROM_INVALID_HANDLE    ((prom_handle)-1UL)
+
+struct prom_args;
+typedef int (*prom_entry)(struct prom_args *);
+
+extern void prom_init (prom_entry pe);
+
+extern prom_entry prom;
+
+/* I/O */
+
+extern prom_handle prom_stdin;
+extern prom_handle prom_stdout;
+
+prom_handle prom_open (char *spec);
+int prom_read (prom_handle file, void *buf, int len);
+int prom_write (prom_handle file, void *buf, int len);
+int prom_seek (prom_handle file, int pos);
+int prom_lseek (prom_handle file, unsigned long long pos);
+int prom_readblocks (prom_handle file, int blockNum, int blockCount, void *buffer);
+void prom_close (prom_handle file);
+int prom_getblksize (prom_handle file);
+int prom_loadmethod (prom_handle device, void* addr);
+
+#define K_UP    0x141
+#define K_DOWN  0x142
+#define K_LEFT  0x144
+#define K_RIGHT 0x143
+
+int prom_getchar ();
+void prom_putchar (char);
+int prom_nbgetchar();
+
+void prom_vprintf (char *fmt, va_list ap);
+void prom_fprintf (prom_handle dev, char *fmt, ...);
+void prom_printf (char *fmt, ...);
+void prom_readline (char *prompt, char *line, int len);
+int prom_set_color(prom_handle device, int color, int r, int g, int b);
+
+/* memory */
+
+void *prom_claim (void *virt, unsigned int size, unsigned int align);
+void prom_release(void *virt, unsigned int size);
+void prom_map (void *phys, void *virt, int size);
+
+/* packages and device nodes */
+
+prom_handle prom_finddevice (char *name);
+prom_handle prom_findpackage (char *path);
+int prom_getprop (prom_handle dev, char *name, void *buf, int len);
+
+/* misc */
+
+char *prom_getargs ();
+void prom_setargs (char *args);
+
+void prom_exit ();
+void prom_abort (char *fmt, ...);
+
+int prom_interpret (char *forth);
+
+int prom_get_chosen (char *name, void *mem, int len);
+int prom_get_options (char *name, void *mem, int len);
+
+extern int prom_getms(void);
+extern void prom_pause(void);
+
+extern void *call_prom (const char *service, int nargs, int nret, ...);
+extern void *call_prom_return (const char *service, int nargs, int nret, ...);
+
+#endif
diff --git a/include/reiserfs/reiserfs.h b/include/reiserfs/reiserfs.h
new file mode 100644 (file)
index 0000000..2e27a27
--- /dev/null
@@ -0,0 +1,405 @@
+#ifndef _REISERFS_H_
+#define _REISERFS_H_
+#include "byteorder.h"
+#include "types.h"
+
+/* ReiserFS Super Block */
+/* include/linux/reiserfs_fs_sb.h */
+#define REISERFS_MAX_SUPPORTED_VERSION  2
+#define REISERFS_SUPER_MAGIC_STRING     "ReIsErFs"
+#define REISER2FS_SUPER_MAGIC_STRING    "ReIsEr2Fs"
+#define REISERFS_MAX_TREE_HEIGHT        7
+
+struct reiserfs_super_block
+{
+    __u32 s_block_count;
+    __u32 s_free_blocks;            /* free blocks count */
+    __u32 s_root_block;             /* root block number */
+    __u32 s_journal_block;          /* journal block number */
+    __u32 s_journal_dev;            /* journal device number */
+    __u32 s_orig_journal_size;      /* size of the journal */
+    __u32 s_journal_trans_max;      /* max number of blocks in
+                                       a transaction.  */
+    __u32 s_journal_block_count;    /* total size of the journal.
+                                       can change over time  */
+    __u32 s_journal_max_batch;      /* max number of blocks to
+                                       batch into a trans */
+    __u32 s_journal_max_commit_age; /* in seconds, how old can an
+                                       async commit be */
+    __u32 s_journal_max_trans_age;  /* in seconds, how old can a
+                                       transaction be */
+    __u16 s_blocksize;              /* block size */
+    __u16 s_oid_maxsize;            /* max size of object id array, */
+    __u16 s_oid_cursize;            /* current size of obj id array */
+    __u16 s_state;                  /* valid or error */
+    char s_magic[12];               /* reiserfs magic string indicates
+                                       that file system is reiserfs */
+    __u32 s_hash_function_code;            /* indicate, what hash function is
+                                       being use to sort names in a
+                                       directory */
+    __u16 s_tree_height;            /* height of disk tree */
+    __u16 s_bmap_nr;                /* amount of bitmap blocks needed
+                                       to address each block of file
+                                       system */
+    __u16 s_version;
+    __u16 s_marked_in_use;
+    __u16 s_inode_generation;
+    char s_unused[124];             /* zero filled by mkreiserfs */
+    char padding_to_quad[ 2 ];      /* aligned to __u32 */
+} __attribute__ ((__packed__));
+#define SB_SIZE         (sizeof (struct reiserfs_super_block) )
+
+/* ReiserFS Journal */
+/* include/linux/reiserfs_fs.h */
+/* must be correct to keep the desc and commit structs at 4k */
+#define JOURNAL_TRANS_HALF 1018
+
+/* first block written in a commit */
+struct reiserfs_journal_desc {
+    __u32 j_trans_id;                      /* id of commit */
+    __u32 j_len;                           /* length of commit. len +1 is the
+                                            commit block */
+    __u32 j_mount_id;                      /* mount id of this trans*/
+    __u32 j_realblock[JOURNAL_TRANS_HALF]; /* real locations for each block */
+  char j_magic[12];
+};
+
+/* last block written in a commit */
+struct reiserfs_journal_commit {
+    __u32 j_trans_id;                      /* must match j_trans_id from the
+                                              desc block */
+    __u32 j_len;                           /* ditto */
+    __u32 j_realblock[JOURNAL_TRANS_HALF]; /* real locations for each block */
+    char j_digest[16];                     /* md5 sum of all the blocks
+                                              involved, including desc and
+                                              commit. not used, kill it */
+};
+
+/*
+** This header block gets written whenever a transaction is considered
+** fully flushed, and is more recent than the last fully flushed
+** transaction.  fully flushed means all the log blocks and all the real
+** blocks are on disk, and this transaction does not need to be replayed.
+*/
+struct reiserfs_journal_header {
+    __u32 j_last_flush_trans_id;    /* id of last fully flushed transaction */
+    __u32 j_first_unflushed_offset; /* offset in the log of where to start
+                                       replay after a crash */
+    __u32 j_mount_id;
+};
+
+/* Magic to find journal descriptors */
+#define JOURNAL_DESC_MAGIC "ReIsErLB"
+
+/* ReiserFS Tree structures/accessors */
+/* Item version determines which offset_v# struct to use */
+#define ITEM_VERSION_1 0
+#define ITEM_VERSION_2 1
+#define IH_KEY_OFFSET(ih) (INFO->version < 2 \
+                           || ih_version(ih) == ITEM_VERSION_1 \
+                           ? (ih)->ih_key.u.k_offset_v1.k_offset \
+                           : offset_v2_k_offset(&(ih)->ih_key.u.k_offset_v2))
+#define IH_KEY_ISTYPE(ih, type) (INFO->version < 2 \
+                || ih_version(ih) == ITEM_VERSION_1 \
+                ? (ih)->ih_key.u.k_offset_v1.k_uniqueness == V1_##type \
+                : offset_v2_k_type(&(ih)->ih_key.u.k_offset_v2) == V2_##type)
+
+//
+// directories use this key as well as old files
+//
+struct offset_v1 {
+    __u32 k_offset;
+    __u32 k_uniqueness;
+} __attribute__ ((__packed__));
+
+struct offset_v2 {
+#ifdef __LITTLE_ENDIAN
+    /* little endian version */
+    __u64 k_offset:60;
+    __u64 k_type: 4;
+#else
+    /* big endian version */
+    __u64 k_type: 4;
+    __u64 k_offset:60;
+#endif
+} __attribute__ ((__packed__));
+
+#ifndef __LITTLE_ENDIAN
+inline __u16 offset_v2_k_type( struct offset_v2 *v2 );
+inline loff_t offset_v2_k_offset( struct offset_v2 *v2 );
+#else
+# define offset_v2_k_type(v2)           ((v2)->k_type)
+# define offset_v2_k_offset(v2)         ((v2)->k_offset)
+#endif
+
+/* Key of an item determines its location in the S+tree, and
+   is composed of 4 components */
+struct key {
+    __u32 k_dir_id;    /* packing locality: by default parent
+                         directory object id */
+    __u32 k_objectid;  /* object identifier */
+    union {
+       struct offset_v1 k_offset_v1;
+       struct offset_v2 k_offset_v2;
+    } __attribute__ ((__packed__)) u;
+} __attribute__ ((__packed__));
+#define KEY_SIZE        (sizeof (struct key))
+
+//
+// there are 5 item types currently
+//
+#define TYPE_STAT_DATA 0
+#define TYPE_INDIRECT 1
+#define TYPE_DIRECT 2
+#define TYPE_DIRENTRY 3
+#define TYPE_ANY 15 // FIXME: comment is required
+//
+// in old version uniqueness field shows key type
+//
+#define V1_SD_UNIQUENESS 0
+#define V1_INDIRECT_UNIQUENESS 0xfffffffe
+#define V1_DIRECT_UNIQUENESS 0xffffffff
+#define V1_DIRENTRY_UNIQUENESS 500
+#define V1_ANY_UNIQUENESS 555 // FIXME: comment is required
+inline int uniqueness2type (__u32 uniqueness);
+
+struct item_head
+{
+  struct key ih_key;                 /* Everything in the tree is found by
+                                         searching for its key.*/
+
+  union {
+    __u16 ih_free_space_reserved;     /* The free space in the last unformatted
+                                         node of an indirect item if this is an
+                                         indirect item.  This equals 0xFFFF
+                                         iff this is a direct item or stat
+                                         data item. Note that the key, not
+                                         this field, is used to determine
+                                         the item type, and thus which field
+                                         this union contains. */
+    __u16 ih_entry_count;             /* Iff this is a directory item, this
+                                         field equals the number of directory
+                                        entries in the directory item. */
+  } __attribute__ ((__packed__)) u;
+  __u16 ih_item_len;                  /* total size of the item body */
+  __u16 ih_item_location;             /* Offset to the item within the block */
+  __u16 ih_version;                  /* ITEM_VERSION_[01] of key type */
+} __attribute__ ((__packed__));
+#define IH_SIZE (sizeof(struct item_head))
+
+#define ih_version(ih)               le16_to_cpu((ih)->ih_version)
+#define ih_entry_count(ih)           le16_to_cpu((ih)->u.ih_entry_count)
+#define ih_location(ih)              le16_to_cpu((ih)->ih_item_location)
+#define ih_item_len(ih)              le16_to_cpu((ih)->ih_item_len)
+
+/* Header of a disk block.  More precisely, header of a formatted leaf
+   or internal node, and not the header of an unformatted node. */
+struct block_head {       
+    __u16 blk_level;                  /* Level of a block in the tree */
+    __u16 blk_nr_item;                /* Number of keys/items in a block */
+    __u16 blk_free_space;             /* Block free space in bytes */
+    __u16 blk_reserved;
+    struct key blk_right_delim_key;   /* kept only for compatibility */
+};
+#define BLKH_SIZE                     (sizeof(struct block_head))
+
+#define blkh_level(p_blkh)            (le16_to_cpu((p_blkh)->blk_level))
+#define blkh_nr_item(p_blkh)          (le16_to_cpu((p_blkh)->blk_nr_item))
+
+#define BLKH_LEVEL_FREE 0 /* Freed from the tree */
+#define BLKH_LEVEL_LEAF 1 /* Leaf node level*/
+
+struct disk_child {
+    __u32       dc_block_number;   /* Disk child's block number */
+    __u16       dc_size;           /* Disk child's used space */
+    __u16       dc_reserved;
+};
+
+#define DC_SIZE (sizeof(struct disk_child))
+#define dc_block_number(dc_p)  (le32_to_cpu((dc_p)->dc_block_number))
+#define dc_size(dc_p)          (le16_to_cpu((dc_p)->dc_size))
+
+/* Stat data */
+struct stat_data_v1
+{
+    __u16 sd_mode;              /* file type, permissions */
+    __u16 sd_nlink;             /* number of hard links */
+    __u16 sd_uid;               /* owner */
+    __u16 sd_gid;               /* group */
+    __u32 sd_size;             /* file size */
+    __u32 sd_atime;            /* time of last access */
+    __u32 sd_mtime;            /* time file was last modified  */
+    __u32 sd_ctime;            /* time inode (stat data) was last changed
+                                   (except changes to sd_atime and sd_mtime) */
+    union {
+       __u32 sd_rdev;
+       __u32 sd_blocks;        /* number of blocks file uses */
+    } __attribute__ ((__packed__)) u;
+    __u32 sd_first_direct_byte; /* 0 = no direct item, 1 = symlink */
+} __attribute__ ((__packed__));
+#define SD_V1_SIZE              (sizeof(struct stat_data_v1))
+
+#define stat_data_v1(ih)        (ih_version (ih) == ITEM_VERSION_1)
+#define sd_v1_size(sdp)         (le32_to_cpu((sdp)->sd_size))
+
+/* Stat Data on disk (reiserfs version of UFS disk inode minus the
+   address blocks) */
+struct stat_data {
+    __u16 sd_mode;     /* file type, permissions */
+    __u16 sd_reserved;
+    __u32 sd_nlink;    /* number of hard links */
+    __u64 sd_size;     /* file size */
+    __u32 sd_uid;      /* owner */
+    __u32 sd_gid;      /* group */
+    __u32 sd_atime;    /* time of last access */
+    __u32 sd_mtime;    /* time file was last modified  */
+    __u32 sd_ctime;    /* time inode (stat data) was last changed
+                          (except changes to sd_atime and sd_mtime) */
+    __u32 sd_blocks;
+    __u32 sd_rdev;
+} __attribute__ ((__packed__));
+#define SD_V2_SIZE              (sizeof(struct stat_data))
+#define stat_data_v2(ih)        (ih_version (ih) == ITEM_VERSION_2)
+#define sd_v2_size(sdp)         (le64_to_cpu((sdp)->sd_size))
+
+/* valid for any stat data */
+#define sd_size(ih,sdp)         ((ih_version(ih) == ITEM_VERSION_2) ? \
+                                  sd_v2_size((struct stat_data *)sdp) : \
+                                  sd_v1_size((struct stat_data_v1 *)sdp))
+#define sd_mode(sdp)            (le16_to_cpu((sdp)->sd_mode))
+
+struct reiserfs_de_head
+{
+    __u32 deh_offset;    /* third component of the directory entry key */
+    __u32 deh_dir_id;    /* objectid of the parent directory of the object,
+                            that is referenced by directory entry */
+    __u32 deh_objectid;  /* objectid of the object, that is referenced by
+                            directory entry */
+    __u16 deh_location;  /* offset of name in the whole item */
+    __u16 deh_state;    /* whether 1) entry contains stat data (for future),                               and 2) whether entry is hidden (unlinked) */
+} __attribute__ ((__packed__));
+#define DEH_SIZE                  sizeof(struct reiserfs_de_head)
+
+#define deh_offset(p_deh)         (le32_to_cpu((p_deh)->deh_offset))
+#define deh_dir_id(p_deh)         (le32_to_cpu((p_deh)->deh_dir_id))
+#define deh_objectid(p_deh)       (le32_to_cpu((p_deh)->deh_objectid))
+#define deh_location(p_deh)       (le16_to_cpu((p_deh)->deh_location))
+#define deh_state(p_deh)          (le16_to_cpu((p_deh)->deh_state))
+
+/* empty directory contains two entries "." and ".." and their headers */
+#define EMPTY_DIR_SIZE \
+(DEH_SIZE * 2 + ROUND_UP (strlen (".")) + ROUND_UP (strlen ("..")))
+
+/* old format directories have this size when empty */
+#define EMPTY_DIR_SIZE_V1 (DEH_SIZE * 2 + 3)
+
+#define DEH_Statdata 0                 /* not used now */
+#define DEH_Visible 2
+
+/* 64 bit systems need to aligned explicitly -jdm */
+#if BITS_PER_LONG == 64
+# define ADDR_UNALIGNED_BITS  (5)
+#endif
+
+#define test_bit(x,y) ext2fs_test_bit(x,y)
+
+#ifdef ADDR_UNALIGNED_BITS
+# define aligned_address(addr)           ((void *)((long)(addr) & ~((1UL << ADDR_UNALIGNED_BITS) - 1)))
+# define unaligned_offset(addr)          (((int)((long)(addr) & ((1 << ADDR_UNALIGNED_BITS) - 1))) << 3)
+# define set_bit_unaligned(nr, addr)     set_bit((nr) + unaligned_offset(addr), aligned_address(addr))
+# define clear_bit_unaligned(nr, addr)   clear_bit((nr) + unaligned_offset(addr), aligned_address(addr))
+# define test_bit_unaligned(nr, addr)    test_bit((nr) + unaligned_offset(addr), aligned_address(addr))
+#else
+# define set_bit_unaligned(nr, addr)     set_bit(nr, addr)
+# define clear_bit_unaligned(nr, addr)   clear_bit(nr, addr)
+# define test_bit_unaligned(nr, addr)    test_bit(nr, addr)
+#endif
+
+#define SD_OFFSET  0
+#define SD_UNIQUENESS 0
+#define DOT_OFFSET 1
+#define DOT_DOT_OFFSET 2
+#define DIRENTRY_UNIQUENESS 500
+#define V1_TYPE_STAT_DATA 0x0
+#define V1_TYPE_DIRECT 0xffffffff
+#define V1_TYPE_INDIRECT 0xfffffffe
+#define V1_TYPE_DIRECTORY_MAX 0xfffffffd
+#define V2_TYPE_STAT_DATA 0
+#define V2_TYPE_INDIRECT 1
+#define V2_TYPE_DIRECT 2
+#define V2_TYPE_DIRENTRY 3
+
+#define REISERFS_ROOT_OBJECTID 2
+#define REISERFS_ROOT_PARENT_OBJECTID 1
+#define REISERFS_SUPERBLOCK_BLOCK 16
+/* the spot for the super in versions 3.5 - 3.5.11 (inclusive) */
+#define REISERFS_OLD_SUPERBLOCK_BLOCK 2
+#define REISERFS_OLD_BLOCKSIZE 4096
+#define S_ISREG(mode) (((mode) & 0170000) == 0100000)
+#define S_ISDIR(mode) (((mode) & 0170000) == 0040000)
+#define S_ISLNK(mode) (((mode) & 0170000) == 0120000)
+#define PATH_MAX       1024     /* include/linux/limits.h */
+#define MAX_LINK_COUNT    5     /* number of symbolic links to follow */
+
+/* Cache stuff, adapted from GRUB source */
+#define FSYSREISER_CACHE_SIZE        (REISERFS_MAX_TREE_HEIGHT*REISERFS_OLD_BLOCKSIZE)
+#define SECTOR_SIZE                  512
+#define FSYSREISER_MIN_BLOCKSIZE     SECTOR_SIZE
+#define FSYSREISER_MAX_BLOCKSIZE     FSYSREISER_CACHE_SIZE / 3
+
+
+struct reiserfs_state
+{
+    /* Context */
+    struct key fileinfo;
+    struct boot_file_t *file;
+    struct item_head *current_ih;
+    char *current_item;
+    __u64 partition_offset;
+
+    /* Commonly used values, cpu order */
+    __u32 journal_block;       /* Start of journal */
+    __u32 journal_block_count; /* The size of the journal */
+    __u32 journal_first_desc;  /* The first valid descriptor block in journal
+                                 (relative to journal_block) */
+    
+   __u16 version;              /* The ReiserFS version. */
+   __u16 tree_depth;           /* The current depth of the reiser tree. */
+   __u8  blocksize_shift;      /* 1 << blocksize_shift == blocksize. */
+   __u16 blocksize;            /* The reiserfs block size (power of 2) */
+
+    /* Cache */
+    __u16 cached_slots;
+    __u16 journal_transactions;
+    __u32 blocks[REISERFS_MAX_TREE_HEIGHT];
+    __u32 next_key_nr[REISERFS_MAX_TREE_HEIGHT];
+};
+
+#define ROOT     ((char *)FSYS_BUF)
+#define CACHE(i) (ROOT + ((i) * INFO->blocksize))
+#define LEAF     CACHE (BLKH_LEVEL_LEAF)
+
+#define BLOCKHEAD(cache) ((struct block_head *) cache)
+#define ITEMHEAD         ((struct item_head *) ((int) LEAF + BLKH_SIZE))
+#define KEY(cache)       ((struct key *) ((int) cache + BLKH_SIZE))
+#define DC(cache)        ((struct disk_child *) \
+                                ((int) cache + BLKH_SIZE + KEY_SIZE * nr_item))
+
+/*
+ * The journal cache.  For each transaction it contains the number of
+ * blocks followed by the real block numbers of this transaction.
+ *
+ * If the block numbers of some transaction won't fit in this space,
+ * this list is stopped with a 0xffffffff marker and the remaining
+ * uncommitted transactions aren't cached.
+ */
+#define JOURNAL_START    ((__u32 *) (FSYS_BUF + FSYSREISER_CACHE_SIZE))
+#define JOURNAL_END      ((__u32 *) (FSYS_BUF + sizeof(FSYS_BUF)))
+
+
+#endif /* _REISERFS_H_ */
diff --git a/include/setjm2.h b/include/setjm2.h
new file mode 100644 (file)
index 0000000..73d06c9
--- /dev/null
@@ -0,0 +1,101 @@
+/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/*
+ *     ISO C Standard: 4.6 NON-LOCAL JUMPS     <setjmp.h>
+ */
+
+#ifndef        _SETJMP_H
+#define        _SETJMP_H       1
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+#include <bits/setjmp.h>               /* Get `__jmp_buf'.  */
+#include <bits/sigset.h>               /* Get `__sigset_t'.  */
+
+/* Calling environment, plus possibly a saved signal mask.  */
+typedef struct __jmp_buf_tag   /* C++ doesn't like tagless structs.  */
+  {
+    /* NOTE: The machine-dependent definitions of `__sigsetjmp'
+       assume that a `jmp_buf' begins with a `__jmp_buf'.
+       Do not move this member or add others before it.  */
+    __jmp_buf __jmpbuf;                /* Calling environment.  */
+    int __mask_was_saved;      /* Saved the signal mask?  */
+    __sigset_t __saved_mask;   /* Saved signal mask.  */
+  } jmp_buf[1];
+
+
+/* Store the calling environment in ENV, also saving the
+   signal mask if SAVEMASK is nonzero.  Return 0.
+   This is the internal name for `sigsetjmp'.  */
+extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
+
+#ifndef        __FAVOR_BSD
+/* Set ENV to the current position and return 0, not saving the signal mask.
+   This is just like `sigsetjmp (ENV, 0)'.
+   The ISO C standard says `setjmp' is a macro.  */
+# define setjmp(env)   __sigsetjmp ((env), 0)
+#else
+/* We are in 4.3 BSD-compatibility mode in which `setjmp'
+   saves the signal mask like `sigsetjmp (ENV, 1)'.  */
+# define setjmp(env)   __sigsetjmp ((env), 1)
+#endif /* Favor BSD.  */
+
+#if defined __USE_BSD || defined __USE_XOPEN
+/* Set ENV to the current position and return 0, not saving the signal mask.
+   This is the 4.3 BSD name for ISO `setjmp'.  */
+# define _setjmp(env)  __sigsetjmp ((env), 0)
+#endif
+
+
+/* Jump to the environment saved in ENV, making the
+   `setjmp' call there return VAL, or 1 if VAL is 0.  */
+extern void longjmp __P ((jmp_buf __env, int __val))
+     __attribute__ ((__noreturn__));
+#if defined __USE_BSD || defined __USE_XOPEN
+/* Same.  Usually `_longjmp' is used with `_setjmp', which does not save
+   the signal mask.  But it is how ENV was saved that determines whether
+   `longjmp' restores the mask; `_longjmp' is just an alias.  */
+extern void _longjmp __P ((jmp_buf __env, int __val))
+     __attribute__ ((__noreturn__));
+#endif
+
+
+#ifdef __USE_POSIX
+/* Use the same type for `jmp_buf' and `sigjmp_buf'.
+   The `__mask_was_saved' flag determines whether
+   or not `longjmp' will restore the signal mask.  */
+typedef jmp_buf sigjmp_buf;
+
+/* Store the calling environment in ENV, also saving the
+   signal mask if SAVEMASK is nonzero.  Return 0.  */
+# define sigsetjmp(env, savemask)      __sigsetjmp ((env), (savemask))
+
+/* Jump to the environment saved in ENV, making the
+   sigsetjmp call there return VAL, or 1 if VAL is 0.
+   Restore the signal mask if that sigsetjmp call saved it.
+   This is just an alias `longjmp'.  */
+extern void siglongjmp __P ((sigjmp_buf __env, int __val))
+     __attribute__ ((__noreturn__));
+#endif /* Use POSIX.  */
+
+__END_DECLS
+
+#endif /* setjmp.h  */
diff --git a/include/setjmp.h b/include/setjmp.h
new file mode 100644 (file)
index 0000000..e31d6b3
--- /dev/null
@@ -0,0 +1,39 @@
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* Define the machine-dependent type `jmp_buf'.  PowerPC version.  */
+
+#ifndef        _SETJMP_H
+#define        _SETJMP_H       1
+
+typedef long int __jmp_buf[58];
+
+typedef struct __jmp_buf_tag
+{
+    __jmp_buf __jmpbuf;
+    int __mask_was_saved;
+    int __saved_mask;
+} jmp_buf[1];
+
+
+extern int __sigsetjmp (jmp_buf __env, int __savemask);
+#define setjmp(env)    __sigsetjmp ((env), 0)
+
+extern void longjmp (jmp_buf __env, int __val);
+
+#endif
\ No newline at end of file
diff --git a/include/stdlib.h b/include/stdlib.h
new file mode 100644 (file)
index 0000000..0b5e99a
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * include/stdlib.h
+ *
+ */
+#ifndef __STDLIB_H
+#define __STDLIB_H
+
+#include "stdarg.h"
+
+extern void malloc_init(void *bottom, unsigned long size);
+extern void malloc_dispose(void);
+
+extern void *malloc(unsigned int size);
+extern void *realloc(void *ptr, unsigned int size);
+extern void free (void *m);
+extern void mark (void **ptr);
+extern void release (void *ptr);
+
+extern int sprintf(char * buf, const char *fmt, ...);
+extern int vsprintf(char *buf, const char *fmt, va_list args);
+extern long simple_strtol(const char *cp,char **endp,unsigned int base);
+#define strtol(x,y,z) simple_strtol(x,y,z)
+
+#endif
diff --git a/include/string.h b/include/string.h
new file mode 100644 (file)
index 0000000..6d65773
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _LINUX_STRING_H_
+#define _LINUX_STRING_H_
+
+#include "types.h"
+#include "stddef.h"
+
+extern char * ___strtok;
+extern char * strcpy(char *,const char *);
+extern char * strncpy(char *,const char *, size_t);
+extern char * strcat(char *, const char *);
+extern char * strncat(char *, const char *, size_t);
+extern char * strchr(const char *,int);
+extern char * strrchr(const char *,int);
+extern char * strpbrk(const char *,const char *);
+extern char * strtok(char *,const char *);
+extern char * strstr(const char *,const char *);
+extern size_t strlen(const char *);
+extern size_t strspn(const char *,const char *);
+extern int strcmp(const char *,const char *);
+extern int strncmp(const char *,const char *,size_t);
+extern int strnicmp(const char *, const char *, size_t);
+extern void *strdup(char *str);
+
+extern void * memset(void *,int,size_t);
+extern void * memcpy(void *,const void *,size_t);
+extern void * memmove(void *,const void *,size_t);
+extern void * memscan(void *,int,size_t);
+extern int memcmp(const void *,const void *,size_t);
+
+static inline size_t strnlen(const char *s,size_t max)
+{
+       size_t sz = strlen(s);
+       return sz > max ? max : sz;
+}
+#endif /* _LINUX_STRING_H_ */
diff --git a/include/swab.h b/include/swab.h
new file mode 100644 (file)
index 0000000..40c7c8a
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _REISERFS_SWAB_H_
+#define _REISERFS_SWAB_H_
+/* Stolen from linux/include/linux/byteorder/swab.h */
+#define swab16(x) \
+       ((__u16)( \
+               (((__u16)(x) & (__u16)0x00ffU) << 8) | \
+               (((__u16)(x) & (__u16)0xff00U) >> 8) ))
+#define swab32(x) \
+       ((__u32)( \
+               (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \
+               (((__u32)(x) & (__u32)0x0000ff00UL) <<  8) | \
+               (((__u32)(x) & (__u32)0x00ff0000UL) >>  8) | \
+               (((__u32)(x) & (__u32)0xff000000UL) >> 24) ))
+#define swab64(x) \
+       ((__u64)( \
+               (__u64)(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \
+               (__u64)(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \
+               (__u64)(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | \
+               (__u64)(((__u64)(x) & (__u64)0x00000000ff000000ULL) <<  8) | \
+               (__u64)(((__u64)(x) & (__u64)0x000000ff00000000ULL) >>  8) | \
+               (__u64)(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | \
+               (__u64)(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | \
+               (__u64)(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56) ))
+
+#endif /* _REISERFS_SWAB_H_ */
diff --git a/include/types.h b/include/types.h
new file mode 100644 (file)
index 0000000..1a1f403
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef __TYPES_H
+#define __TYPES_H
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+
+#define BITS_PER_LONG 32
+
+/* bsd */
+typedef unsigned char          u_char;
+typedef unsigned short         u_short;
+typedef unsigned int           u_int;
+typedef unsigned long          u_long;
+
+/* sysv */
+typedef unsigned char          unchar;
+typedef unsigned short         ushort;
+typedef unsigned int           uint;
+typedef unsigned long          ulong;
+
+typedef                __u8            u_int8_t;
+typedef                __s8            int8_t;
+typedef                __u16           u_int16_t;
+typedef                __s16           int16_t;
+typedef                __u32           u_int32_t;
+typedef                __s32           int32_t;
+
+typedef                __u8            uint8_t;
+typedef                __u16           uint16_t;
+typedef                __u32           uint32_t;
+
+typedef                __u64           uint64_t;
+typedef                __u64           u_int64_t;
+typedef                __s64           int64_t;
+
+typedef unsigned int ino_t;
+typedef __u64 loff_t;
+
+#endif
diff --git a/include/video.h b/include/video.h
new file mode 100644 (file)
index 0000000..c5f61b8
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __VIDEO_H__
+#define __VIDEO_H__
+
+
+
+#endif
\ No newline at end of file
diff --git a/include/yaboot.h b/include/yaboot.h
new file mode 100644 (file)
index 0000000..d7a9277
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __YABOOT_H__
+#define __YABOOT_H__
+
+#include "file.h"
+
+struct boot_param_t {
+       struct boot_fspec_t     kernel;
+       struct boot_fspec_t     rd;
+       struct boot_fspec_t     sysmap;
+       struct boot_fspec_t     splash;
+
+       char*   args;
+};
+
+extern int useconf;
+extern char bootdevice[];
+extern char *bootpath;
+extern int bootpartition;
+
+#endif
\ No newline at end of file
diff --git a/lib/ctype.c b/lib/ctype.c
new file mode 100644 (file)
index 0000000..e028af4
--- /dev/null
@@ -0,0 +1,46 @@
+#include "string.h"
+#include "ctype.h"
+
+unsigned char _ctype[] = {
+_C,_C,_C,_C,_C,_C,_C,_C,                       /* 0-7 */
+_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C,                /* 8-15 */
+_C,_C,_C,_C,_C,_C,_C,_C,                       /* 16-23 */
+_C,_C,_C,_C,_C,_C,_C,_C,                       /* 24-31 */
+_S|_SP,_P,_P,_P,_P,_P,_P,_P,                   /* 32-39 */
+_P,_P,_P,_P,_P,_P,_P,_P,                       /* 40-47 */
+_D,_D,_D,_D,_D,_D,_D,_D,                       /* 48-55 */
+_D,_D,_P,_P,_P,_P,_P,_P,                       /* 56-63 */
+_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U,     /* 64-71 */
+_U,_U,_U,_U,_U,_U,_U,_U,                       /* 72-79 */
+_U,_U,_U,_U,_U,_U,_U,_U,                       /* 80-87 */
+_U,_U,_U,_P,_P,_P,_P,_P,                       /* 88-95 */
+_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L,     /* 96-103 */
+_L,_L,_L,_L,_L,_L,_L,_L,                       /* 104-111 */
+_L,_L,_L,_L,_L,_L,_L,_L,                       /* 112-119 */
+_L,_L,_L,_P,_P,_P,_P,_C,                       /* 120-127 */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,               /* 128-143 */
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,               /* 144-159 */
+_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,   /* 160-175 */
+_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,       /* 176-191 */
+_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,       /* 192-207 */
+_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L,       /* 208-223 */
+_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,       /* 224-239 */
+_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L};      /* 240-255 */
+
+
+int strcasecmp(const char *s1, const char *s2)
+{
+    int c1, c2;
+
+    for (;;) {
+       c1 = *s1++;
+       if ('A' <= c1 && c1 <= 'Z')
+           c1 += 'a' - 'A';
+       c2 = *s2++;
+       if ('A' <= c2 && c2 <= 'Z')
+           c2 += 'a' - 'A';
+       if (c1 != c2 || c1 == 0)
+           return c1 - c2;
+    }
+}
+
diff --git a/lib/libext2fs.a b/lib/libext2fs.a
new file mode 100644 (file)
index 0000000..a6889b6
Binary files /dev/null and b/lib/libext2fs.a differ
diff --git a/lib/malloc.c b/lib/malloc.c
new file mode 100644 (file)
index 0000000..45f1409
--- /dev/null
@@ -0,0 +1,110 @@
+/* Dumb memory allocation routines
+   
+   Copyright (C) 1997 Paul Mackerras
+                1996 Maurizio Plaza
+                1996 Jakub Jelinek
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include "types.h"
+#include "stddef.h"
+
+/* Imported functions */
+extern void prom_printf (char *fmt, ...);
+
+static char *malloc_ptr = 0;
+static char *malloc_top = 0;
+static char *last_alloc = 0;
+
+void malloc_init(void *bottom, unsigned long size)
+{
+       malloc_ptr = bottom;
+       malloc_top = bottom + size;
+}
+
+void malloc_dispose(void)
+{
+       malloc_ptr = 0;
+       last_alloc = 0;
+}
+
+void *malloc (unsigned int size)
+{
+    char *caddr;
+
+    if (!malloc_ptr)
+       return NULL;
+    if ((malloc_ptr + size + sizeof(int)) > malloc_top) {
+       prom_printf("malloc failed\n");
+       return NULL;
+    }
+    *(int *)malloc_ptr = size;
+    caddr = malloc_ptr + sizeof(int);
+    malloc_ptr += size + sizeof(int);
+    last_alloc = caddr;
+    malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + 3) & (~3));
+    return caddr;
+}
+
+void *realloc(void *ptr, unsigned int size)
+{
+    char *caddr, *oaddr = ptr;
+
+    if (!malloc_ptr)
+       return NULL;
+    if (oaddr == last_alloc) {
+       if (oaddr + size > malloc_top) {
+               prom_printf("realloc failed\n");
+               return NULL;
+       }
+       *(int *)(oaddr - sizeof(int)) = size;
+       malloc_ptr = oaddr + size;
+       return oaddr;
+    }
+    caddr = malloc(size);
+    if (caddr != 0 && oaddr != 0)
+       memcpy(caddr, oaddr, *(int *)(oaddr - sizeof(int)));
+    return caddr;
+}
+
+void free (void *m)
+{
+    if (!malloc_ptr)
+       return;
+    if (m == last_alloc)
+       malloc_ptr = (char *) last_alloc - sizeof(int);
+}
+
+void mark (void **ptr)
+{
+    if (!malloc_ptr)
+       return;
+    *ptr = (void *) malloc_ptr;
+}
+
+void release (void *ptr)
+{
+    if (!malloc_ptr)
+       return;
+    malloc_ptr = (char *) ptr;
+}
+
+void *strdup(char *str)
+{
+    char *p = malloc(strlen(str) + 1);
+
+    strcpy(p, str);
+    return p;
+}
diff --git a/lib/nosys.c b/lib/nosys.c
new file mode 100644 (file)
index 0000000..5208008
--- /dev/null
@@ -0,0 +1,5 @@
+/* we got no time */
+long time()
+{
+    return 0;
+}
diff --git a/lib/string.S b/lib/string.S
new file mode 100644 (file)
index 0000000..6c6b9b2
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * String handling functions for PowerPC.
+ *
+ * Copyright (C) 1996 Paul Mackerras.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+#include "asm/processor.h"
+#include "asm/ppc_asm.tmpl"
+
+       .globl  strcpy
+strcpy:
+       addi    r5,r3,-1
+       addi    r4,r4,-1
+1:     lbzu    r0,1(r4)
+       cmpwi   0,r0,0
+       stbu    r0,1(r5)
+       bne     1b
+       blr
+
+       .globl  strncpy
+strncpy:
+       cmpwi   0,r5,0
+       beqlr
+       mtctr   r5
+       addi    r6,r3,-1
+       addi    r4,r4,-1
+1:     lbzu    r0,1(r4)
+       cmpwi   0,r0,0
+       stbu    r0,1(r6)
+       bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
+       blr
+
+       .globl  strcat
+strcat:
+       addi    r5,r3,-1
+       addi    r4,r4,-1
+1:     lbzu    r0,1(r5)
+       cmpwi   0,r0,0
+       bne     1b
+       addi    r5,r5,-1
+1:     lbzu    r0,1(r4)
+       cmpwi   0,r0,0
+       stbu    r0,1(r5)
+       bne     1b
+       blr
+
+       .globl  strcmp
+strcmp:
+       addi    r5,r3,-1
+       addi    r4,r4,-1
+1:     lbzu    r3,1(r5)
+       cmpwi   1,r3,0
+       lbzu    r0,1(r4)
+       subf.   r3,r0,r3
+       beqlr   1
+       beq     1b
+       blr
+
+   &nbs