# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID fb9f7ac2fc542b74b0dd5f943c65cba9c44350be
# Parent fd37e715f50911a6bf041573e47fdad315d0cc43
Remove obsolete tool 'mbootpack'. SYSLINUX now supports Multiboot format.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
tools/misc/mbootpack/GPL | 340 ------------
tools/misc/mbootpack/Makefile | 63 --
tools/misc/mbootpack/README | 75 --
tools/misc/mbootpack/bin2c.c | 356 ------------
tools/misc/mbootpack/bootsect.S | 136 ----
tools/misc/mbootpack/buildimage.c | 176 ------
tools/misc/mbootpack/mb_header.h | 90 ---
tools/misc/mbootpack/mb_info.h | 217 -------
tools/misc/mbootpack/mbootpack.c | 704 -------------------------
tools/misc/mbootpack/mbootpack.h | 109 ---
tools/misc/mbootpack/setup.S | 1064 --------------------------------------
config/x86_32.mk | 1
config/x86_64.mk | 1
tools/misc/Makefile | 6
14 files changed, 3338 deletions(-)
diff -r fd37e715f509 -r fb9f7ac2fc54 config/x86_32.mk
--- a/config/x86_32.mk Tue Oct 17 16:10:09 2006 +0100
+++ b/config/x86_32.mk Tue Oct 17 16:13:13 2006 +0100
@@ -3,7 +3,6 @@ CONFIG_MIGRATE := y
CONFIG_MIGRATE := y
CONFIG_XCUTILS := y
CONFIG_IOEMU := y
-CONFIG_MBOOTPACK := y
CFLAGS += -m32 -march=i686
LDFLAGS += -m32
diff -r fd37e715f509 -r fb9f7ac2fc54 config/x86_64.mk
--- a/config/x86_64.mk Tue Oct 17 16:10:09 2006 +0100
+++ b/config/x86_64.mk Tue Oct 17 16:13:13 2006 +0100
@@ -3,7 +3,6 @@ CONFIG_MIGRATE := y
CONFIG_MIGRATE := y
CONFIG_XCUTILS := y
CONFIG_IOEMU := y
-CONFIG_MBOOTPACK := y
CFLAGS += -m64
LDFLAGS += -m64
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/Makefile
--- a/tools/misc/Makefile Tue Oct 17 16:10:09 2006 +0100
+++ b/tools/misc/Makefile Tue Oct 17 16:13:13 2006 +0100
@@ -20,9 +20,6 @@ all: build
.PHONY: build
build: $(TARGETS)
$(MAKE) -C miniterm
-ifeq ($(CONFIG_MBOOTPACK),y)
- $(MAKE) -C mbootpack
-endif
$(MAKE) -C lomount
.PHONY: install
@@ -34,14 +31,11 @@ install: build
$(MAKE) -C lomount install
# No sense in installing miniterm on the Xen box.
# $(MAKE) -C miniterm install
-# Likewise mbootpack
-# $(MAKE) -C mbootpack install
.PHONY: clean
clean:
$(RM) *.o $(TARGETS) *~
$(MAKE) -C miniterm clean
- $(MAKE) -C mbootpack clean
$(MAKE) -C lomount clean
%.o: %.c $(HDRS) Makefile
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/GPL
--- a/tools/misc/mbootpack/GPL Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,340 +0,0 @@
- 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.
-
- 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.)
-
-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.
-
- 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.
-
- 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
-
- 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.
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/Makefile
--- a/tools/misc/mbootpack/Makefile Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-#
-# Makefile for mbootpack
-#
-XEN_ROOT=../../..
-include $(XEN_ROOT)/tools/Rules.mk
-
-.PHONY: all
-all: build
-
-.PHONY: build
-build: mbootpack
-
-.PHONY: install
-install: build
- $(INSTALL_PROG) mbootpack $(DESTDIR)/usr/bin
-
-# Tools etc.
-RM := rm -f
-INCS := -I. -I-
-DEFS :=
-
-# What object files need building for the program
-OBJS := mbootpack.o buildimage.o
-
-# Get gcc to generate the dependencies for us.
-DEPFLAGS = -Wp,-MD,.$(@F).d
-DEPS = .*.d
-
-mbootpack: $(OBJS)
- $(HOSTCC) $(HOSTCFLAGS) -o $@ $(filter-out %.a, $^)
-
-.PHONY: clean
-clean:
- $(RM) mbootpack *.o $(DEPS) bootsect setup bzimage_header.c bin2c
-
-bootsect: bootsect.S
- $(CC) -m32 $(INCS) $(DEFS) -D__MB_ASM -c bootsect.S -o bootsect.o
- $(LD) -m elf_i386 -Ttext 0x0 -s --oformat binary bootsect.o -o $@
-
-setup: setup.S
- $(CC) -m32 $(INCS) $(DEFS) -D__MB_ASM -c setup.S -o setup.o
- $(LD) -m elf_i386 -Ttext 0x0 -s --oformat binary setup.o -o $@
-
-bin2c: bin2c.o
- $(HOSTCC) $(HOSTCFLAGS) -o $@ $^
-
-bzimage_header.c: bootsect setup bin2c
- ./bin2c -n 8 -b1 -a bzimage_bootsect bootsect > bzimage_header.c
- ./bin2c -n 8 -b1 -a bzimage_setup setup >> bzimage_header.c
-
-buildimage.c: bzimage_header.c
- @
-
-%.o: %.c
- $(HOSTCC) $(DEPFLAGS) $(HOSTCFLAGS) $(INCS) $(DEFS) -c $< -o $@
-
-.PRECIOUS: $(OBJS) $(OBJS:.o=.c) $(DEPS)
-.SUFFIXES:
-
--include $(DEPS)
-
-#
-# EOF
-#
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/README
--- a/tools/misc/mbootpack/README Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-
-mbootpack
----------
-
-This is a utility to take a multiboot kernel and modules and repackage
-them in a form that a standard linux bootloader will be able to load them.
-It statically allocates memory addresses based on a 'standard' PC memory
-layout, and then saves the image of the loaded system, along with an
-almost-standard linux bzImage header which takes care of the start-of-day
-requirements of a multiboot kernel (setting up 32-bit protected mode, etc.)
-
-Example invocation, to package a xen VMM and xenlinux guest and initrd:
-
- mbootpack -o bzImage -m ./xenlinux -m ./initrd.img ./xen-image
-
-You can now boot the 'bzImage' file using your favourite linux bootloader.
-
-The kernel command line will be provided at boot time by the bootloader
-(you can specify a kernel command-line using the '-c' flag, but it will
-be overridden at boot time unledd the bootloder provides an entirely
-empty command line). If you wan to override the command line for the
-first module (i.e. domain 0 kernel in Xen) at boot time, append ' -- '
-and the module commadn line to the bootloader command line, e.g.:
-
- boot: bzImage com1=9600,8n1 console=com1 dom0_mem=49152 -- root=/dev/sda3 ro
console=ttyS0,9600n8
-
-Everything before the '--' is passed to the kernel (xen) as its command
-line; everything after is passed to the first module (xenlinux).
-
-This is ALPHA code: there are execution paths which have *not* been
-tested, though it works for loading the Xen hypervisor using GrUB, LILO
-or SYSLINUX. Bug reports and patches are very welcome.
-
-Possible features for future versions (all look possible, if there's any
-demand for them):
-
- - support for kernels that load below 1MB
- - zImage-style compressed images
- - sane error messgaes for insane load addresses
- - support for the MULTIBOOT_VIDEO_MODE bit
- - proper support for passing E820h memory-maps from bzImage
-
-
-Tim Deegan <tjd21@xxxxxxxxxxxx>, March 2005
-
-
-
-License and attributions
-------------------------
-
-The bzImage header block was originally taken from the Linux kernel.
-http://www.kernel.org/
-
-Some parts of the Multiboot loader code are based on GNU GRUB.
-mb_info.h and mb_header.h are taken from GNU GRUB.
-http://www.gnu.org/software/grub/
-
-Bin2C was written by Nicolas Doualot; I tidied it a bit for a clean compile.
-http://slubman.celeonet.fr/program.php?style=Default&project=bin2c
-
-All other code is copyright (C) 2003-2005 Tim Deegan (tjd21@xxxxxxxxxxxx)
-
-mbootpack is distributed under the GNU General Public License: see "GPL"
-
-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 -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/bin2c.c
--- a/tools/misc/mbootpack/bin2c.c Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,356 +0,0 @@
-/***************************************************************************************
- Project informations:
- Project: bin2c
- Version: 1.00
- Plateforme: PC
- Copyright: DNDD.INC
- Date: 28/03/2004
-
- File informations:
- Name: bin2c.c
- Description:Convert any file to a C array
-
- Author informations:
- Author: DOUALOT Nicolas
- E-Mail: slubman@xxxxxxxxxxx
- site: http://membres.lycos.fr/slubman/gp32
-***************************************************************************************/
-
-
-#include <stdio.h> /*perror */
-#include <sys/mman.h> /*PROT_READ,MAP_xxx */
-#include <fcntl.h> /*O_RDONLY */
-#include <sys/stat.h> /*stat */
-#include <stdlib.h> /*atoi */
-#include <string.h> /*strcmp */
-#include <ctype.h> /*toupper */
-
-#define VERSION "1.10"
-
-
-static void help(void)
-{
- fprintf(stdout, "\nbin2c v"VERSION"\n");
- fprintf(stdout, "Slubman DevSoft (c)2003-2004 slubman.dndd@xxxxxxxxxxx
\n\n");
-
- fprintf(stdout, "Usage: bin2c [flags] <infile>\n\n");
-
- //fprintf(stdout, "\t-quiet :\tdon't output standard messages\n");
- //fprintf(stdout, "\t-slash :\tappend backslash at end of line\n");
- fprintf(stdout, "\t-n <count> :\tnumber of items per line\n");
- fprintf(stdout, "\t-b1 :\tgenerate unsigned char array\n");
- fprintf(stdout, "\t-b2 :\tgenerate unsigned short array\n");
- fprintf(stdout, "\t-b4 :\tgenerate unsigned long array\n");
- fprintf(stdout, "\t-a <name> :\tgenerate an array with given name\n");
- fprintf(stdout, "\t-ss <nr> :\tskip number of bytes at begin of
inputfile\n");
- fprintf(stdout, "\t-se <nr> :\tskip number of bytes at end of
inputfile\n");
- fprintf(stdout, "\t-lb <nr> :\tinsert an additionally linebreak
every nr line\n");
- fprintf(stdout, "\t-h :\tproduce an header\n");
- fprintf(stdout, "\tinfile :\tname of infile\n");
- fprintf(stdout, "\toutfile :\tname of outfile (use \"-\" for
stdout)\n\n");
-
- fprintf(stdout, " \tconverts binary file to C array data\n");
-}
-
-static void UnknownFlag(char *flag)
-{
- fprintf(stderr, "Error: unknown flag %s\n", flag);
- help();
- exit(EXIT_FAILURE);
-}
-
-static void WriteHeader(FILE * outFile, char *oFileName, char *iFileName)
-{
- // File Header
- fprintf(outFile,
"/***************************************************************************************\n");
- fprintf(outFile, "* File Name:\n");
- fprintf(outFile, "* Name: %s\n", oFileName);
- fprintf(outFile, "* From: %s\n", iFileName);
- fprintf(outFile, "* Created by :bin2c v"VERSION"\n*\n");
- fprintf(outFile, "* bin2c v"VERSION":\n");
- fprintf(outFile, "* Author: DOUALOT Nicolas\n");
- fprintf(outFile, "* E-Mail: slubman.dndd@xxxxxxxxxxx\n");
- fprintf(outFile, "* site:
http://www.slubman.linux-fan.com/\n");
- fprintf(outFile,
"***************************************************************************************/\n\n");
-}
-
-int main(int argc, char *argv[])
-{
- FILE *inFile = stdin, *outFile = stdout;
- int a, i, nbLine = 0;
- unsigned char *memory;
- struct stat st;
-
- // Options
- char arrayName[255] = "array"; // Array name
- char *iFileName = NULL; // File to convert
- char *oFileName = NULL; // File to write
- int bpd = 1; // Array item length
- int lb = 0; // Array blank line
each lb line(s)
- int nbCol = 15; // Nuber of items per
line
- int SkeepStart = 0; // Number of byte to skip at
file begining
- int SkeepEnd = 0; // Number of byte to skip at
file end
- int header = 0; // Produce an header
-
- // Is there the good number of arguments
- if (argc < 2)
- {
- help();
- return 0;
- }
-
- // On récupère les arguments (Ready for more options)
- for (a = 1; a < argc; a++)
- {
- // An option
- if (argv[a][0] == '-')
- {
- // Wich flag is it ?
- switch (argv[a][1])
- {
- // Writting on stdout
- case 0:
- printf("%s\n", argv[a]);
- outFile = stdout;
- break;
-
- // ArrayName flag
- case 'a':
- strcpy(arrayName, argv[++a]);
- break;
-
- // Data type
- case 'b':
- switch (argv[a][2])
- {
- case '1':
- bpd = 1;
- break;
-
- case '2':
- bpd = 2;
- break;
-
- case '4':
- bpd = 4;
- break;
-
- default:
- UnknownFlag(argv[a]);
- }
- break;
-
- // Produce an header
- case 'h':
- header = 1;
- break;
-
- // New line each n line
- case 'l':
- switch (argv[a][2])
- {
- case 'b':
- lb = atoi(argv[++a]);
- break;
-
- default:
- UnknownFlag(argv[a]);
- }
-
- // Number of bit per line
- case 'n':
- nbCol = atoi(argv[++a]);
- break;
-
- // Skip bytes
- case 's':
- switch (argv[a][2])
- {
- // Beginig of file
- case 's':
- SkeepStart =
atoi(argv[++a]);
- break;
-
- // End of file
- case 'e':
- SkeepEnd =
atoi(argv[++a]);
- break;
-
- // Flag inconnu
- default:
- UnknownFlag(argv[a]);
- }
-
- // Flag inconnu
- default:
- UnknownFlag(argv[a]);
- }
- }
- // A filename
- else
- {
- if (iFileName == NULL)
- {
- iFileName = argv[a];
- if ((inFile = fopen(iFileName, "rb")) == NULL)
- {
- fprintf(stderr, "Error: can't open
%s\n", iFileName);
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (oFileName == NULL)
- {
- oFileName = argv[a];
- if ((outFile = fopen(oFileName, "wb"))
== NULL)
- {
- fprintf(stderr, "Error: can't
open %s\n", oFileName);
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- fprintf(stderr, "Error: Too many
filesnames given!\n");
- help();
- exit(EXIT_FAILURE);
- }
- }
- }
- }
-
- if (!iFileName)
- exit(EXIT_FAILURE);
-
- // Get file informations
- if (stat(iFileName, &st) != 0)
- {
- fprintf(stderr, "Error: when scanning file %s\n", argv[1]);
- exit(EXIT_FAILURE);
- }
-
- // Allocating memory
- if (!(memory = malloc(st.st_size + 3)))
- {
- memset(memory, 0, st.st_size + 3);
- fprintf(stderr, "Error: not enought memory\n");
- exit(EXIT_FAILURE);
- }
-
- // Reading the file
- if (fread(memory, 1, st.st_size, inFile) != (size_t)st.st_size)
- {
- fprintf(stderr, "Error: when reading file %s\n", argv[1]);
- fclose(inFile);
- exit(EXIT_FAILURE);
- }
- fclose(inFile);
-
- // Must produce an header
- if (header)
- {
- unsigned int i;
- char hFileName[256], *def = NULL;
- FILE *hFile = stdout;
-
- if (oFileName)
- {
- strcpy(hFileName, oFileName);
- hFileName[strlen(hFileName) - 1] = 'h';
- hFile = fopen(hFileName, "wt");
- }
-
- WriteHeader(hFile, hFileName, iFileName);
-
- // Replace all '.' by '_'
- for (i = 0; i < strlen(hFileName); i++)
- if (hFileName[i] == '.')
- hFileName[i] = '_';
- else
- hFileName[i] = toupper(hFileName[i]);
-
- // the #ifdef at the begining
- def = strrchr(hFileName, '/');
- def = def ? def + 1 : hFileName;
- fprintf(hFile, "#ifndef __%s__\n#define __%s__\n\n", def, def);
-
- // Define array size
- fprintf(hFile, "#define _%s_size_ %u\n\n", arrayName, (unsigned
int) (st.st_size - SkeepStart - SkeepEnd) / bpd);
-
- // Begin the array
- fprintf(hFile, "extern unsigned ");
- fprintf(hFile, "%s ", bpd == 1 ? "char" : bpd == 2 ? "short" :
"long");
- fprintf(hFile, "%s[", arrayName);
- fprintf(hFile, "%u];\n\n", (unsigned int) (st.st_size -
SkeepStart - SkeepEnd) / bpd);
-
- // the #endif at the end
- fprintf(hFile, "#endif\n\n");
-
- if (oFileName)
- fclose(hFile);
- }
-
- WriteHeader(outFile, oFileName, iFileName);
-
- // Define array size
- if (!header)
- fprintf(outFile, "#define _%s_size_ %u\n\n", arrayName,
(unsigned int) (st.st_size - SkeepStart - SkeepEnd) / bpd);
-
- // Begin the array
- fprintf(outFile, "unsigned ");
- fprintf(outFile, "%s ", bpd == 1 ? "char" : bpd == 2 ? "short" :
"long");
- fprintf(outFile, "%s[", arrayName);
- fprintf(outFile, "%u] = {\n\t", (unsigned int) (st.st_size - SkeepStart
- SkeepEnd) / bpd);
-
- // Writing file elements
- for (i = 0; i < (st.st_size - SkeepEnd - SkeepStart) / bpd; /*i+=bpd */
i++)
- {
- // We write an item of bpd byte(s)
- switch (bpd)
- {
- case 1:
- fprintf(outFile, "0x%02x", *(unsigned char *)
&memory[SkeepStart + i]);
- break;
-
- case 2:
- fprintf(outFile, "0x%04x", *(unsigned short *)
&memory[SkeepStart + i]);
- break;
-
- case 4:
- fprintf(outFile, "0x%08lx", *(unsigned long *)
&memory[SkeepStart + i]);
- break;
- }
-
- // Must put a coma ?
- if (i != st.st_size - 1)
- fprintf(outFile, ",");
-
- // End of a line ?
- if (i && !((i + 1) % nbCol))
- {
- // -lb option
- if (lb && !((++nbLine) % lb))
- fprintf(outFile, "\n");
- fprintf(outFile, "\n\t");
- }
- // Add a space
- else
- fprintf(outFile, " ");
- }
-
- // The last line as nbCol elements
- if (((st.st_size - SkeepStart - SkeepEnd) / bpd) % nbCol)
- fprintf(outFile, "\n");
-
- // Close the array
- fprintf(outFile, "};\n");
-
- // CLose the output file
- if (outFile != stdout)
- fclose(outFile);
-
- // Free allocated memory
- free(memory);
-
- exit(EXIT_SUCCESS);
-}
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/bootsect.S
--- a/tools/misc/mbootpack/bootsect.S Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
- * bootsect.S
- *
- * This is bootsect.S from the linux 2.6.9 sources,
- * with minor changes for mbootpack.
- *
- *
- * 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.
- *
- * $Id: bootsect.S,v 1.2 2005/03/23 10:39:11 tjd21 Exp $
- *
- */
-
-#include "mbootpack.h"
-
-/*
- * bootsect.S Copyright (C) 1991, 1992 Linus Torvalds
- *
- * modified by Drew Eckhardt
- * modified by Bruce Evans (bde)
- * modified by Chris Noe (May 1999) (as86 -> gas)
- * gutted by H. Peter Anvin (Jan 2003)
- *
- * BIG FAT NOTE: We're in real mode using 64k segments. Therefore segment
- * addresses must be multiplied by 16 to obtain their respective linear
- * addresses. To avoid confusion, linear addresses are written using leading
- * hex while segment addresses are written as segment:offset.
- *
- */
-
-/* #include <asm/boot.h> */
-/* Definitions we should have got from there */
-#define DEF_INITSEG 0x9000
-#define DEF_SYSSEG 0x1000
-#define DEF_SETUPSEG 0x9020
-#define DEF_SYSSIZE 0x7F00
-#define NORMAL_VGA 0xffff
-#define EXTENDED_VGA 0xfffe
-#define ASK_VGA 0xfffd
-
-
-/* SETUPSECTS = 4 */ /* default nr of setup-sectors */
-BOOTSEG = 0x07C0 /* original address of
boot-sector */
-INITSEG = DEF_INITSEG /* we move boot here - out of
the way */
-SETUPSEG = DEF_SETUPSEG /* setup starts here */
-SYSSEG = DEF_SYSSEG /* system loaded at 0x10000 (65536) */
-SYSSIZE = DEF_SYSSIZE /* system size: # of 16-byte
clicks */
- /* to be loaded */
-ROOT_DEV = 0 /* ROOT_DEV is now written by "build" */
-SWAP_DEV = 0 /* SWAP_DEV is now written by "build" */
-
-#ifndef SVGA_MODE
-/* #define SVGA_MODE ASK_VGA */
-#define SVGA_MODE NORMAL_VGA
-#endif
-
-#ifndef RAMDISK
-#define RAMDISK 0
-#endif
-
-#ifndef ROOT_RDONLY
-#define ROOT_RDONLY 1
-#endif
-
-.code16
-.text
-
-.global _start
-_start:
-
- # Normalize the start address
- jmpl $BOOTSEG, $start2
-
-start2:
- movw %cs, %ax
- movw %ax, %ds
- movw %ax, %es
- movw %ax, %ss
- movw $0x7c00, %sp
- sti
- cld
-
- movw $bugger_off_msg, %si
-
-msg_loop:
- lodsb
- andb %al, %al
- jz die
- movb $0xe, %ah
- movw $7, %bx
- int $0x10
- jmp msg_loop
-
-die:
- # Allow the user to press a key, then reboot
- xorw %ax, %ax
- int $0x16
- int $0x19
-
- # int 0x19 should never return. In case it does anyway,
- # invoke the BIOS reset code...
- ljmp $0xf000,$0xfff0
-
-
-bugger_off_msg:
- .ascii "Direct booting from floppy is no longer supported.\r\n"
- .ascii "Please use a boot loader program instead.\r\n"
- .ascii "\n"
- .ascii "Remove disk and press any key to reboot . . .\r\n"
- .byte 0
-
-
- # Kernel attributes; used by setupbegtext
-
- .org 497
-setup_sects: .byte SETUPSECTS
-root_flags: .word ROOT_RDONLY
-syssize: .word SYSSIZE
-swap_dev: .word SWAP_DEV
-ram_size: .word RAMDISK
-vid_mode: .word SVGA_MODE
-root_dev: .word ROOT_DEV
-boot_flag: .word 0xAA55
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/buildimage.c
--- a/tools/misc/mbootpack/buildimage.c Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * buildimage.c
- *
- * Takes the memory image of a loaded kernel and modules and repackages
- * it as a linux bzImage
- *
- * Copyright (C) 2003-2004 Tim Deegan (tjd21@xxxxxxxxxxxx)
- *
- * 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.
- *
- * $Id: buildimage.c,v 1.2 2005/03/23 10:39:19 tjd21 Exp $
- *
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <getopt.h>
-#include <elf.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <asm/page.h>
-
-#include "mbootpack.h"
-#include "mb_header.h"
-
-
-/* We will build an image that a bzImage-capable bootloader will load like
- * this:
- *
- * ============== (0)
- * (BIOS memory)
- * --------------
- * (Bootloader)
- * --------------
- * bzImage startup code
- * MBI, command-lines, module info
- * ============== (0xa0000)
- * (memory hole)
- * ============== (0x100000)
- * Kernel and modules
- * ==============
- *
- * The bzImage startup code is mostly taken straight from the linux kernel
- * (see bootsect.S, startup.S). It does the usual unpleasant start-of-day
- * tasks to get to 32-bit protected mode, then sets registers appropriately
- * and jumps to the kernel's entry address.
- *
- * It also does some relocation to make sure the MBI is where we expect it,
- * and parses the linux command line.
- */
-
-#define BZ_SETUP_OFFSET (512 * (1 + SETUPSECTS))
-#define BZ_ENTRY_OFFSET 0x30
-#define BZ_MBI_OFFSET 0x34
-/* These *MUST* fit the offsets of entry_address and mbi_address in setup.S */
-
-/* Bring in the bzImage boot sector and setup code */
-#include "bzimage_header.c"
-
-#define _p(x) ((void *)(unsigned long)(x))
-
-address_t place_mbi(long int size)
-/* Find space at the top of *low* memory for the MBI and associated red tape */
-{
- address_t start;
- start = 0xa000 - size;
- if (start < 0x9000 + sizeof(bzimage_bootsect) + sizeof(bzimage_setup)) {
- printf("Fatal: command-lines too long: need %ld, have %ld bytes\n",
- size,
- 0x1000L - (sizeof(bzimage_bootsect) + sizeof(bzimage_setup)));
- exit(1);
- }
- if (!quiet) {
- printf("Placed MBI and strings (%p+%p)\n",
- _p(start), _p(size));
- }
- return start;
-}
-
-void make_bzImage(section_t *sections,
- address_t entry,
- address_t mbi,
- FILE *fp)
-/* Rework this list of sections into a bzImage and write it out to fp */
-{
- int i;
- size_t offset;
- section_t *s;
-
- /* Patch the kernel and mbi addresses into the setup code */
- *(address_t *)(bzimage_setup + BZ_ENTRY_OFFSET) = eswap(entry);
- *(address_t *)(bzimage_setup + BZ_MBI_OFFSET) = eswap(mbi);
- if (!quiet) printf("Kernel entry is %p, MBI is %p.\n",_p(entry), _p(mbi));
-
- /* Write out header and trampoline */
- if (fseek(fp, 0, SEEK_SET) < 0) {
- printf("Fatal: error seeking in output file: %s\n",
- strerror(errno));
- exit(1);
- }
- if (fwrite(bzimage_bootsect, sizeof(bzimage_bootsect), 1, fp) != 1) {
- printf("Fatal: error writing to output file: %s\n",
- strerror(errno));
- exit(1);
- }
- if (fwrite(bzimage_setup, sizeof(bzimage_setup), 1, fp) != 1) {
- printf("Fatal: error writing to output file: %s\n",
- strerror(errno));
- exit(1);
- }
-
- if (!quiet) printf("Wrote bzImage header: %ld + %ld bytes.\n",
- (long)sizeof(bzimage_bootsect),
- (long)sizeof(bzimage_setup));
-
- /* Sorted list of sections below 1MB: write them out */
- for (s = sections, i = 0; s; s = s->next) {
- if (s->start >= HIGHMEM_START) continue;
- offset = (s->start - 0x9000);
- if (fseek(fp, offset, SEEK_SET) < 0) {
- printf("Fatal: error seeking in output file: %s\n",
- strerror(errno));
- exit(1);
- }
- if (fwrite(s->buffer, s->size, 1, fp) != 1) {
- printf("Fatal: error writing to output file: %s\n",
- strerror(errno));
- exit(1);
- }
- i++;
- }
-
- if (!quiet) printf("Wrote %i low-memory sections.\n", i);
-
- /* Sorted list of sections higher than 1MB: write them out */
- for (s = sections, i = 0; s; s = s->next) {
- if (s->start < HIGHMEM_START) continue;
- offset = (s->start - HIGHMEM_START) + BZ_SETUP_OFFSET;
- if (fseek(fp, offset, SEEK_SET) < 0) {
- printf("Fatal: error seeking in output file: %s\n",
- strerror(errno));
- exit(1);
- }
- if (fwrite(s->buffer, s->size, 1, fp) != 1) {
- printf("Fatal: error writing to output file: %s\n",
- strerror(errno));
- exit(1);
- }
- i++;
- }
-
- if (!quiet) printf("Wrote %i high-memory sections.\n", i);
-}
-
-
-/*
- * EOF(buildimage.c)
- */
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/mb_header.h
--- a/tools/misc/mbootpack/mb_header.h Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * 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.
- */
-
-/*
- * MultiBoot Header description
- */
-
-struct multiboot_header
-{
- /* Must be MULTIBOOT_MAGIC - see below. */
- unsigned magic;
-
- /* Feature flags - see below. */
- unsigned flags;
-
- /*
- * Checksum
- *
- * The above fields plus this one must equal 0 mod 2^32.
- */
- unsigned checksum;
-
- /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
- unsigned header_addr;
- unsigned load_addr;
- unsigned load_end_addr;
- unsigned bss_end_addr;
- unsigned entry_addr;
-
- /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
- unsigned mode_type;
- unsigned width;
- unsigned height;
- unsigned depth;
-};
-
-/*
- * The entire multiboot_header must be contained
- * within the first MULTIBOOT_SEARCH bytes of the kernel image.
- */
-#define MULTIBOOT_SEARCH 8192
-#define MULTIBOOT_FOUND(addr, len) \
- (! ((addr) & 0x3) \
- && (len) >= 12 \
- && *((int *) (addr)) == MULTIBOOT_MAGIC \
- && ! (*((unsigned *) (addr)) + *((unsigned *) (addr + 4)) \
- + *((unsigned *) (addr + 8))) \
- && (! (MULTIBOOT_AOUT_KLUDGE & *((int *) (addr + 4))) || (len) >= 32) \
- && (! (MULTIBOOT_VIDEO_MODE & *((int *) (addr + 4))) || (len) >= 48))
-
-/* Magic value identifying the multiboot_header. */
-#define MULTIBOOT_MAGIC 0x1BADB002
-
-/*
- * Features flags for 'flags'.
- * If a boot loader sees a flag in MULTIBOOT_MUSTKNOW set
- * and it doesn't understand it, it must fail.
- */
-#define MULTIBOOT_MUSTKNOW 0x0000FFFF
-
-/* currently unsupported flags... this is a kind of version number. */
-#define MULTIBOOT_UNSUPPORTED 0x0000FFF8
-
-/* Align all boot modules on i386 page (4KB) boundaries. */
-#define MULTIBOOT_PAGE_ALIGN 0x00000001
-
-/* Must pass memory information to OS. */
-#define MULTIBOOT_MEMORY_INFO 0x00000002
-
-/* Must pass video information to OS. */
-#define MULTIBOOT_VIDEO_MODE 0x00000004
-
-/* This flag indicates the use of the address fields in the header. */
-#define MULTIBOOT_AOUT_KLUDGE 0x00010000
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/mb_info.h
--- a/tools/misc/mbootpack/mb_info.h Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-/*
- * 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.
- */
-
-/*
- * The structure type "mod_list" is used by the "multiboot_info" structure.
- */
-
-struct mod_list
-{
- /* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
- unsigned long mod_start;
- unsigned long mod_end;
-
- /* Module command line */
- unsigned long cmdline;
-
- /* padding to take it to 16 bytes (must be zero) */
- unsigned long pad;
-};
-
-
-/*
- * INT-15, AX=E820 style "AddressRangeDescriptor"
- * ...with a "size" parameter on the front which is the structure size - 4,
- * pointing to the next one, up until the full buffer length of the memory
- * map has been reached.
- */
-
-struct AddrRangeDesc
-{
- unsigned long size;
- unsigned long long BaseAddr;
- unsigned long long Length;
- unsigned long Type;
-
- /* unspecified optional padding... */
-};
-
-/* usable memory "Type", all others are reserved. */
-#define MB_ARD_MEMORY 1
-
-
-/* Drive Info structure. */
-struct drive_info
-{
- /* The size of this structure. */
- unsigned long size;
-
- /* The BIOS drive number. */
- unsigned char drive_number;
-
- /* The access mode (see below). */
- unsigned char drive_mode;
-
- /* The BIOS geometry. */
- unsigned short drive_cylinders;
- unsigned char drive_heads;
- unsigned char drive_sectors;
-
- /* The array of I/O ports used for the drive. */
- unsigned short drive_ports[0];
-};
-
-/* Drive Mode. */
-#define MB_DI_CHS_MODE 0
-#define MB_DI_LBA_MODE 1
-
-
-/* APM BIOS info. */
-struct apm_info
-{
- unsigned short version;
- unsigned short cseg;
- unsigned long offset;
- unsigned short cseg_16;
- unsigned short dseg_16;
- unsigned short cseg_len;
- unsigned short cseg_16_len;
- unsigned short dseg_16_len;
-};
-
-
-/*
- * MultiBoot Info description
- *
- * This is the struct passed to the boot image. This is done by placing
- * its address in the EAX register.
- */
-
-struct multiboot_info
-{
- /* MultiBoot info version number */
- unsigned long flags;
-
- /* Available memory from BIOS */
- unsigned long mem_lower;
- unsigned long mem_upper;
-
- /* "root" partition */
- unsigned long boot_device;
-
- /* Kernel command line */
- unsigned long cmdline;
-
- /* Boot-Module list */
- unsigned long mods_count;
- unsigned long mods_addr;
-
- union
- {
- struct
- {
- /* (a.out) Kernel symbol table info */
- unsigned long tabsize;
- unsigned long strsize;
- unsigned long addr;
- unsigned long pad;
- }
- a;
-
- struct
- {
- /* (ELF) Kernel section header table */
- unsigned long num;
- unsigned long size;
- unsigned long addr;
- unsigned long shndx;
- }
- e;
- }
- syms;
-
- /* Memory Mapping buffer */
- unsigned long mmap_length;
- unsigned long mmap_addr;
-
- /* Drive Info buffer */
- unsigned long drives_length;
- unsigned long drives_addr;
-
- /* ROM configuration table */
- unsigned long config_table;
-
- /* Boot Loader Name */
- unsigned long boot_loader_name;
-
- /* APM table */
- unsigned long apm_table;
-
- /* Video */
- unsigned long vbe_control_info;
- unsigned long vbe_mode_info;
- unsigned short vbe_mode;
- unsigned short vbe_interface_seg;
- unsigned short vbe_interface_off;
- unsigned short vbe_interface_len;
-};
-
-/*
- * Flags to be set in the 'flags' parameter above
- */
-
-/* is there basic lower/upper memory information? */
-#define MB_INFO_MEMORY 0x00000001
-/* is there a boot device set? */
-#define MB_INFO_BOOTDEV 0x00000002
-/* is the command-line defined? */
-#define MB_INFO_CMDLINE 0x00000004
-/* are there modules to do something with? */
-#define MB_INFO_MODS 0x00000008
-
-/* These next two are mutually exclusive */
-
-/* is there a symbol table loaded? */
-#define MB_INFO_AOUT_SYMS 0x00000010
-/* is there an ELF section header table? */
-#define MB_INFO_ELF_SHDR 0x00000020
-
-/* is there a full memory map? */
-#define MB_INFO_MEM_MAP 0x00000040
-
-/* Is there drive info? */
-#define MB_INFO_DRIVE_INFO 0x00000080
-
-/* Is there a config table? */
-#define MB_INFO_CONFIG_TABLE 0x00000100
-
-/* Is there a boot loader name? */
-#define MB_INFO_BOOT_LOADER_NAME 0x00000200
-
-/* Is there a APM table? */
-#define MB_INFO_APM_TABLE 0x00000400
-
-/* Is there video information? */
-#define MB_INFO_VIDEO_INFO 0x00000800
-
-/*
- * The following value must be present in the EAX register.
- */
-
-#define MULTIBOOT_VALID 0x2BADB002
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/mbootpack.c
--- a/tools/misc/mbootpack/mbootpack.c Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,704 +0,0 @@
-/*
- * mbootpack.c
- *
- * Takes a multiboot image, command-line and modules, and repackages
- * them as if they were a linux kernel. Only supports a subset of
- * the multiboot info page options (enough to boot the Xen hypervisor).
- *
- * Copyright (C) 2003-2004 Tim Deegan (tjd21@xxxxxxxxxxxx)
- *
- * Parts based on GNU GRUB, 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., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * $Id: mbootpack.c,v 1.3 2005/03/23 10:38:36 tjd21 Exp tjd21 $
- *
- */
-
-#define _GNU_SOURCE
-#include "mbootpack.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <getopt.h>
-#include <elf.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <asm/page.h>
-
-/* From GNU GRUB */
-#include "mb_header.h"
-#include "mb_info.h"
-
-
-/*
- * The plan: Marshal up the multiboot modules and strings as if we
- * were loading them into memory on a fresh ix86 PC. Attach
- * a linux bzImage header to the front, which sets up the machine
- * appropriately and then jumps to the kernel entry address.
- *
- * The memory map will be made up roughly like so:
- *
- * =============
- * multiboot information (mbi) struct
- * -------
- * kernel command line
- * -------
- * bootloader name
- * -------
- * module command lines
- * -------
- * module information structs
- * =============
- * (memory hole)
- * =============
- * kernel
- * -------------
- * module 1
- * -------------
- * module 2
- * -------------
- * .
- * .
- * .
- *
- * ==============
- *
- *
- * For allocation of memory we assume that the target machine has 'low'
- * memory from 0 to 640K and 'high' memory starting at 1M. We allocate
- * the kernel first, wherever it wants to be. After that, sections
- * are added at the next available aligned address, always in the order
- * given above, and skipping the memory hole at 640K. Allocated sections
- * are stored in a linked list of buffers.
- *
- * Re-packaging as a bzImage file happens in buildimage.c
- *
- */
-
-/* Version */
-static const char version_string[] = "mbootpack " MBOOTPACK_VERSION_STRING;
-
-/* Flags */
-int quiet = 0;
-
-/* How much of the start of a kernel we read looking for headers.
- * Must be >= MULTIBOOT_SEARCH */
-#define HEADERBUF_SIZE MULTIBOOT_SEARCH
-
-
-/* Linked list of loaded sections, and a pointer to the next
- * available space (i.e. just above the highest allocation so far). */
-static section_t *sections = NULL;
-static section_t *last_section = NULL;
-static address_t next_free_space = 0;
-
-static void usage(void)
-/* If we don't understand the command-line options */
-{
- printf(
-"Usage: mbpack [OPTIONS] kernel-image\n\n"
-" -h --help Print this text.\n"
-" -q --quiet Only output errors and warnings.\n"
-" -o --output=filename Output to filename (default \"bzImage\").\n"
-" -M --multiboot-output Produce a multiboot kernel, not a bzImage\n"
-" (sets default output file to
\"mbImage\").\n"
-" -c --command-line=STRING Set the kernel command line
(DEPRECATED!).\n"
-" -m --module=\"MOD arg1 arg2...\" Load module MOD with arguments
\"arg1...\"\n"
-" (can be used multiple times).\n"
-"\n");
- exit(1);
-}
-
-#define _p(x) ((void *)(unsigned long)(x))
-
-static void place_kernel_section(address_t start, long int size)
-/* Place the kernel in memory, checking for the memory hole. */
-{
- if (start >= MEM_HOLE_END) {
- /* Above the memory hole: easy */
- next_free_space = MAX(next_free_space, start + size);
- if (!quiet) {
- printf("Placed kernel section (%p+%p)\n",
- _p(start), _p(size));
- }
- return;
- }
-
- if (start >= MEM_HOLE_START) {
- /* In the memory hole. Not so good */
- printf("Fatal: kernel load address (%p) is in the memory hole.\n",
- _p(start));
- exit(1);
- }
-
- if (start + size > MEM_HOLE_START) {
- /* Too big for low memory */
- printf("Fatal: kernel (%p+%p) runs into the memory hole.\n",
- _p(start), _p(size));
- exit(1);
- }
-
- /* Kernel loads below the memory hole */
- next_free_space = MAX(next_free_space, start + size);
-
- if (!quiet) {
- printf("Placed kernel section (%p+%p)\n", _p(start), _p(size));
- }
-}
-
-
-static address_t place_section(long int size, int align)
-/* Find the next available place for this section.
- * "align" must be a power of 2 */
-{
- address_t start;
- assert(next_free_space != 0);
- assert(((~align + 1) & align) == align);
-
- start = ROUNDUP_P2(next_free_space, align);
-
- /* Check that we don't hit the memory hole */
- if (start < MEM_HOLE_END && (start + size) > MEM_HOLE_START)
- start = ROUNDUP_P2(MEM_HOLE_END, align);
-
- next_free_space = start + size;
-
- if (!quiet) {
- printf("Placed section (%p+%p), align=%p\n",
- _p(start), _p(size), _p(align));
- }
- return start;
-}
-
-
-static address_t load_kernel(const char *filename)
-/* Load an elf32/multiboot kernel from this file
- * Returns the entry address for the kernel. */
-{
- unsigned int i;
- address_t start;
- size_t len;
- long int size, loadsize;
- FILE *fp;
- char *buffer;
- section_t *sec, *s;
- Elf32_Ehdr *ehdr;
- Elf32_Phdr *phdr;
- struct multiboot_header *mbh;
- struct stat sb;
-
- static char headerbuf[HEADERBUF_SIZE];
-
- /* Stat and open the file */
- if (stat(filename, &sb) != 0) {
- printf("Fatal: cannot stat %s: %s\n", filename, strerror(errno));
- exit(1);
- }
- if ((fp = fopen(filename, "r")) == NULL) {
- printf("Fatal: cannot open %s: %s\n", filename, strerror(errno));
- exit(1);
- }
-
- /* Load the first 8k of the file */
- if (fseek(fp, 0, SEEK_SET) < 0) {
- printf("Fatal: seek error in %s: %s\n", filename, strerror(errno));
- exit(1);
- }
- if ((len = fread(headerbuf, 1, HEADERBUF_SIZE, fp))
- < HEADERBUF_SIZE)
- {
- if (feof(fp)) /* Short file */
- {
- if (len < 12) {
- printf("Fatal: %s is too short to be a multiboot file.",
- filename);
- exit(1);
- }
- } else {
- printf("Fatal: read error in %s: %s\n", filename, strerror(errno));
- exit(1);
- }
- }
-
- /* Sanity-check: is this file compressed? */
- if ((headerbuf[0] == '\037' &&
- (headerbuf[1] == '\235' /* .Z */ ||
- headerbuf[1] == '\213' /* .gz */)) ||
- (headerbuf[0] == 'B' && headerbuf[1] == 'Z') /* .bz[2] */) {
- printf("Warning: %s looks like a compressed file.\n"
- " You should uncompress it first!\n", filename);
- }
-
- /* Now look for a multiboot header */
- for (i = 0; i <= MIN(len - 12, MULTIBOOT_SEARCH - 12); i += 4)
- {
- mbh = (struct multiboot_header *)(headerbuf + i);
- if (eswap(mbh->magic) != MULTIBOOT_MAGIC
- || ((eswap(mbh->magic)+eswap(mbh->flags)+eswap(mbh->checksum))
- & 0xffffffff))
- {
- /* Not a multiboot header */
- continue;
- }
- if (eswap(mbh->flags) & MULTIBOOT_UNSUPPORTED) {
- /* Requires options we don't support */
- printf("Fatal: found a multiboot header, but it "
- "requires multiboot options that I\n"
- "don't understand. Sorry.\n");
- exit(1);
- }
- if (eswap(mbh->flags) & MULTIBOOT_VIDEO_MODE) {
- /* Asked for screen mode information */
- /* XXX carry on regardless */
- printf("Warning: found a multiboot header which asks "
- "for screen mode information.\n"
- " This kernel will NOT be given valid"
- "screen mode information at boot time.\n");
- }
- /* This kernel will do: place and load it */
-
- if (eswap(mbh->flags) & MULTIBOOT_AOUT_KLUDGE) {
-
- /* Load using the offsets in the multiboot header */
- if(!quiet)
- printf("Loading %s using multiboot header.\n", filename);
-
- /* How much is there? */
- start = eswap(mbh->load_addr);
- if (eswap(mbh->load_end_addr) != 0)
- loadsize = eswap(mbh->load_end_addr) - eswap(mbh->load_addr);
- else
- loadsize = sb.st_size;
-
- /* How much memory will it take up? */
- if (eswap(mbh->bss_end_addr) != 0)
- size = eswap(mbh->bss_end_addr) - eswap(mbh->load_addr);
- else
- size = loadsize;
-
- if (loadsize > size) {
- printf("Fatal: can't load %ld bytes of kernel into %ld bytes "
- "of memory.\n", loadsize, size);
- exit(1);
- }
-
- /* Does it fit where it wants to be? */
- place_kernel_section(start, size);
-
- /* Load the kernel */
- if ((buffer = malloc(size)) == NULL) {
- printf("Fatal: malloc() for kernel load failed: %s\n",
- strerror(errno));
- exit(1);
- }
- if ((fread(buffer, loadsize, 1, fp)) != 1) {
- printf("Fatal: cannot read %s: %s\n",
- filename, strerror(errno));
- exit(1);
- }
- fclose(fp);
-
- /* Clear the kernel BSS */
- memset(buffer + loadsize, 0, size - loadsize);
-
- /* Start off the linked list of sections */
- if ((sec = (section_t *)malloc(sizeof (section_t))) == NULL) {
- printf("Fatal: malloc() for section_t failed: %s\n",
- strerror(errno));
- exit(1);
- }
- sec->buffer = buffer;
- sec->start = start;
- sec->size = size;
- sec->next = NULL;
- sec->prev = NULL;
- sections = sec;
- last_section = sec;
-
- /* Done. */
- if (!quiet) printf("Loaded kernel from %s\n", filename);
- return eswap(mbh->entry_addr);
-
- } else {
-
- /* Now look for an ELF32 header */
- ehdr = (Elf32_Ehdr *)headerbuf;
- if (*(unsigned long *)ehdr != eswap(0x464c457f)
- || ehdr->e_ident[EI_DATA] != ELFDATA2LSB
- || ehdr->e_ident[EI_CLASS] != ELFCLASS32
- || eswap(ehdr->e_machine) != EM_386)
- {
- printf("Fatal: kernel has neither ELF32/x86 nor multiboot load"
- " headers.\n");
- exit(1);
- }
- if (eswap(ehdr->e_phoff) + eswap(ehdr->e_phnum)*sizeof(*phdr)
- > HEADERBUF_SIZE) {
- /* Don't expect this will happen with sane kernels */
- printf("Fatal: too much ELF for me. Try increasing "
- "HEADERBUF_SIZE in mbootpack.\n");
- exit(1);
- }
- if (eswap(ehdr->e_phoff) + eswap(ehdr->e_phnum)*sizeof (*phdr)
- > len) {
- printf("Fatal: malformed ELF header overruns EOF.\n");
- exit(1);
- }
- if (eswap(ehdr->e_phnum) <= 0) {
- printf("Fatal: ELF kernel has no program headers.\n");
- exit(1);
- }
-
- if(!quiet)
- printf("Loading %s using ELF header.\n", filename);
-
- if (eswap(ehdr->e_type) != ET_EXEC
- || eswap(ehdr->e_version) != EV_CURRENT
- || eswap(ehdr->e_phentsize) != sizeof (Elf32_Phdr)) {
- printf("Warning: funny-looking ELF header.\n");
- }
- phdr = (Elf32_Phdr *)(headerbuf + eswap(ehdr->e_phoff));
-
- /* Obey the program headers to load the kernel */
- for(i = 0; i < eswap(ehdr->e_phnum); i++) {
-
- start = eswap(phdr[i].p_paddr);
- size = eswap(phdr[i].p_memsz);
- if (eswap(phdr[i].p_type) != PT_LOAD)
- loadsize = 0;
- else
- loadsize = MIN((long int)eswap(phdr[i].p_filesz), size);
-
- if ((buffer = malloc(size)) == NULL) {
- printf("Fatal: malloc() for kernel load failed: %s\n",
- strerror(errno));
- exit(1);
- }
-
- /* Place the section where it wants to be */
- place_kernel_section(start, size);
-
- /* Load section from file */
- if (loadsize > 0) {
- if (fseek(fp, eswap(phdr[i].p_offset), SEEK_SET) != 0) {
- printf("Fatal: seek failed in %s\n",
- strerror(errno));
- exit(1);
- }
- if ((fread(buffer, loadsize, 1, fp)) != 1) {
- printf("Fatal: cannot read %s: %s\n",
- filename, strerror(errno));
- exit(1);
- }
- }
-
- /* Clear the rest of the buffer */
- memset(buffer + loadsize, 0, size - loadsize);
-
- /* Add this section to the list (keeping it ordered) */
- if ((sec = (section_t *)malloc(sizeof (section_t))) == NULL) {
- printf("Fatal: malloc() for section_t failed: %s\n",
- strerror(errno));
- exit(1);
- }
- sec->buffer = buffer;
- sec->start = start;
- sec->size = size;
-
- for(s = sections; s; s = s->next) {
- if (s->start > start) {
- sec->next = s;
- if (s->prev == NULL) {
- /* sec becomes the new first item */
- s->prev = sec;
- sections = sec;
- } else {
- /* sec goes between s->prev and s */
- sec->prev = s->prev;
- sec->prev->next = sec;
- s->prev = sec;
- }
- break;
- }
- }
- if (s == NULL) {
- /* sec becomes the new last item */
- sec->next = NULL;
- sec->prev = last_section;
- if (last_section) {
- last_section->next = sec;
- } else {
- sections = sec;
- }
- last_section = sec;
- }
- }
-
- /* Done! */
- if (!quiet) printf("Loaded kernel from %s\n", filename);
- return eswap(ehdr->e_entry);
- }
-
- }
-
- /* This is not a multiboot kernel */
- printf("Fatal: %s is not a multiboot kernel.\n", filename);
- exit(1);
-}
-
-
-int main(int argc, char **argv)
-{
- char *buffer, *imagename, *command_line, *p;
- char *mod_filename, *mod_command_line, *mod_clp;
- char *out_filename;
- section_t *sec;
- FILE *fp;
- struct stat sb;
- struct multiboot_info *mbi;
- struct mod_list *modp;
- address_t start, kernel_entry;
- long int size, mod_command_line_space, command_line_len;
- int modules, opt, mbi_reloc_offset;
-
- static const char short_options[] = "hc:m:o:qM";
- static const struct option options[] = {
- { "help", 0, 0, 'h' },
- { "command-line", 1, 0, 'c' },
- { "append", 1, 0, 'c' },
- { "module", 1, 0, 'm' },
- { "output", 1, 0, 'o' },
- { "quiet", 0, 0, 'q' },
- { 0, 0, 0, 0 },
- };
-
- /* Parse the command line */
- out_filename = NULL;
- command_line = "";
- command_line_len = 0;
- modules = 0;
- mod_command_line_space = 0;
- while((opt = getopt_long(argc, argv, short_options, options, 0)) != -1)
- {
- switch(opt) {
- case 'c':
- command_line = optarg;
- break;
- case 'm':
- modules++;
- mod_command_line_space += strlen(optarg) + 1;
- break;
- case 'o':
- out_filename = optarg;
- break;
- case 'q':
- quiet = 1;
- break;
- case 'h':
- case '?':
- default:
- usage();
- }
- }
- imagename = argv[optind];
- if (!imagename || strlen(imagename) == 0) usage();
- command_line_len = strlen(command_line) + strlen(imagename) + 2;
- /* Leave space to overwritethe command-line at boot time */
- command_line_len = MAX(command_line_len, CMD_LINE_SPACE);
- if (!out_filename) out_filename = "bzImage";
-
- /* Place and load the kernel */
- kernel_entry = load_kernel(imagename);
- assert(sections != NULL);
- assert(last_section != NULL);
- assert(next_free_space != 0);
-
- /* Next section is all the metadata between kernel and modules */
- size = ((((sizeof (struct multiboot_info)
- + command_line_len
- + strlen(version_string) + 1
- + mod_command_line_space)
- + 3 ) & ~3)
- + modules * sizeof (struct mod_list));
- /* Locate this section after the setup sectors, in *low* memory */
- start = place_mbi(size);
-
- if ((buffer = malloc(size)) == NULL) {
- printf("Fatal: malloc() for boot metadata failed: %s\n",
- strerror(errno));
- exit(1);
- }
-
- if ((sec = (section_t *)malloc(sizeof (section_t))) == NULL) {
- printf("Fatal: malloc() for section_t failed: %s\n",
- strerror(errno));
- exit(1);
- }
- sec->buffer = buffer;
- sec->start = start;
- sec->size = size;
- sec->next = NULL;
- sec->prev = last_section;
- last_section->next = sec;
- last_section = sec;
-
- /* Multiboot info struct */
- mbi = (struct multiboot_info *)buffer;
- memset(buffer, 0, sizeof (struct multiboot_info));
- mbi_reloc_offset = start - (address_t)buffer;
-
- /* Command line */
- p = (char *)(mbi + 1);
- sprintf(p, "%s %s", imagename, command_line);
- mbi->cmdline = eswap(((address_t)p) + mbi_reloc_offset);
- p += command_line_len;
-
- /* Bootloader ID */
- sprintf(p, version_string);
- mbi->boot_loader_name = eswap(((address_t)p) + mbi_reloc_offset);
- p += strlen(version_string) + 1;
-
- /* Next is space for the module command lines */
- mod_clp = p;
-
- /* Last come the module info structs */
- modp = (struct mod_list *)
- ((((address_t)p + mod_command_line_space) + 3) & ~3);
- mbi->mods_count = eswap(modules);
- mbi->mods_addr = eswap(((address_t)modp) + mbi_reloc_offset);
-
- /* Memory information will be added at boot time, by setup.S
- * or trampoline.S. */
- mbi->flags = eswap(MB_INFO_CMDLINE | MB_INFO_BOOT_LOADER_NAME);
-
-
- /* Load the modules */
- if (modules) {
- mbi->flags = eswap(eswap(mbi->flags) | MB_INFO_MODS);
-
- /* Go back and parse the module command lines */
- optind = opterr = 1;
- while((opt = getopt_long(argc, argv,
- short_options, options, 0)) != -1)
- {
- if (opt != 'm') continue;
-
- /* Split module filename from command line */
- mod_command_line = mod_filename = optarg;
- if ((p = strchr(mod_filename, ' ')) != NULL) {
- /* See as I discard the 'const' modifier */
- *p = '\0';
- }
-
- /* Find space for it */
- if (stat(mod_filename, &sb) != 0) {
- printf("Fatal: cannot stat %s: %s\n",
- mod_filename, strerror(errno));
- exit(1);
- }
- size = sb.st_size;
- start = place_section(size, X86_PAGE_SIZE);
- /* XXX should be place_section(size, 4) if the MBH hasn't got
- * XXX MULTIBOOT_PAGE_ALIGN set, but that breaks Xen */
-
- /* Load it */
- if ((buffer = malloc(sb.st_size)) == NULL) {
- printf("Fatal: malloc failed for module load: %s\n",
- strerror(errno));
- exit(1);
- }
- if ((fp = fopen(mod_filename, "r")) == NULL) {
- printf("Fatal: cannot open %s: %s\n",
- mod_filename, strerror(errno));
- exit(1);
- }
- if ((fread(buffer, sb.st_size, 1, fp)) != 1) {
- printf("Fatal: cannot read %s: %s\n",
- mod_filename, strerror(errno));
- exit(1);
- }
- fclose(fp);
-
- /* Sanity-check: is this file compressed? */
- if ((buffer[0] == '\037' &&
- (buffer[1] == '\235' /* .Z */ ||
- buffer[1] == '\213' /* .gz */)) ||
- (buffer[0] == 'B' && buffer[1] == 'Z') /* .bz[2] */) {
- printf("Warning: %s looks like a compressed file.\n",
- mod_filename);
- }
-
- if (!quiet) printf("Loaded module from %s\n", mod_filename);
-
- /* Restore the command line to its former glory */
- if (p != NULL) *p = ' ';
-
- /* Fill in the module info struct */
- modp->mod_start = eswap(start);
- modp->mod_end = eswap(start + size);
- modp->cmdline = eswap((address_t)mod_clp + mbi_reloc_offset);
- modp->pad = eswap(0);
- modp++;
-
- /* Store the module command line */
- sprintf(mod_clp, "%s", mod_command_line);
- mod_clp += strlen(mod_clp) + 1;
-
- /* Add the section to the list */
- if ((sec = (section_t *)malloc(sizeof (section_t))) == NULL) {
- printf("Fatal: malloc() for section_t failed: %s\n",
- strerror(errno));
- exit(1);
- }
- sec->buffer = buffer;
- sec->start = start;
- sec->size = size;
- sec->next = NULL;
- sec->prev = last_section;
- last_section->next = sec;
- last_section = sec;
-
- }
-
- }
-
- /* Everything is placed and loaded. Now we package it all up
- * as a bzImage */
- if ((fp = fopen(out_filename, "w")) == NULL) {
- printf("Fatal: cannot open %s: %s\n", out_filename, strerror(errno));
- exit(1);
- }
- make_bzImage(sections,
- kernel_entry,
- ((address_t)mbi) + mbi_reloc_offset,
- fp);
- fclose(fp);
-
- /* Success! */
- if(!quiet) printf("Finished.\n");
- return 0;
-}
-
-/*
- * EOF (mbootpack.c)
- */
-
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/mbootpack.h
--- a/tools/misc/mbootpack/mbootpack.h Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * mbootpack.h
- *
- * Common definitions for mbootpack
- *
- * Copyright (C) 2003-2004 Tim Deegan (tjd21@xxxxxxxxxxxx)
- *
- * 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.
- *
- * $Id: mbootpack.h,v 1.2 2005/03/23 10:38:37 tjd21 Exp $
- *
- */
-
-#ifndef __MBOOTPACK__H__
-#define __MBOOTPACK__H__
-
-#ifndef __MB_ASM
-
-#undef NDEBUG
-#include <stdio.h>
-
-#include <endian.h>
-#include <byteswap.h>
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define eswap(x) (x)
-#else
-#define eswap(x) \
- ({ \
- typeof(x) y = (x); \
- switch(sizeof(y)) \
- { \
- case 2: y = __bswap_16(y); break; \
- case 4: y = __bswap_32(y); break; \
- case 8: y = __bswap_64(y); break; \
- } \
- y; \
- })
-#endif
-
-/* Flags */
-extern int quiet;
-
-/* Types */
-typedef unsigned long address_t;
-
-typedef struct section_t {
- char *buffer;
- address_t start;
- long int size;
- struct section_t *prev;
- struct section_t *next;
-} section_t;
-
-/* buildimage.c */
-extern void make_bzImage(section_t *sections,
- address_t entry,
- address_t mbi,
- FILE *fp);
-
-address_t place_mbi(long int size);
-
-
-/* trampoline.S */
-extern unsigned char mb_trampoline[];
-extern unsigned char mb_trampoline_end[];
-extern volatile address_t mb_mbi_address, mb_entry_address;
-
-/* Macros */
-#define MIN(_x,_y) (((_x)<=(_y))?(_x):(_y))
-#define MAX(_x,_y) (((_x)<=(_y))?(_y):(_x))
-#define ROUNDUP_P2(_x, _a) (((_x)+((_a)-1))&(~((_a)-1)))
-
-#endif
-
-/* x86 memory: such fun */
-#define MEM_HOLE_START 0xa0000
-#define MEM_HOLE_END 0x100000
-#define HIGHMEM_START MEM_HOLE_END
-#define X86_PAGE_SIZE 0x1000
-
-/* How much command line we'll take from the bootloader. */
-#define CMD_LINE_SPACE 0x300
-
-/* Number of 512-byte sectors to load in low memory (max 7) */
-#define SETUPSECTS 7
-
-
-/* Who are we? */
-#define MBOOTPACK_VERSION_STRING "v0.2 (alpha)"
-
-#endif /* __MBOOTPACK__H__ */
-
-/*
- * EOF (mbootpack.h)
- */
-
diff -r fd37e715f509 -r fb9f7ac2fc54 tools/misc/mbootpack/setup.S
--- a/tools/misc/mbootpack/setup.S Tue Oct 17 16:10:09 2006 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1064 +0,0 @@
-/*
- * bootsect.S
- *
- * This is setup.S from the linux 2.6.9 source code,
- * with heavy cuts and changes for mbootpack
- * November 2004 Tim Deegan <tjd21@xxxxxxxxxxxx>
- *
- *
- * 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.
- *
- * $Id: setup.S,v 1.4 2005/03/23 10:39:03 tjd21 Exp $
- *
- */
-
-#include "mbootpack.h"
-
-/*
- * setup.S Copyright (C) 1991, 1992 Linus Torvalds
- *
- * setup.s is responsible for getting the system data from the BIOS,
- * and putting them into the appropriate places in system memory.
- * both setup.s and system has been loaded by the bootblock.
- *
- * This code asks the bios for memory/disk/other parameters, and
- * puts them in a "safe" place: 0x90000-0x901FF, ie where the
- * boot-block used to be. It is then up to the protected mode
- * system to read them from there before the area is overwritten
- * for buffer-blocks.
- *
- * Move PS/2 aux init code to psaux.c
- * (troyer@xxxxxxxxxxxxxxxxxxxxxxxxxxx) 03Oct92
- *
- * some changes and additional features by Christoph Niemann,
- * March 1993/June 1994 (Christoph.Niemann@xxxxxxxxx)
- *
- * add APM BIOS checking by Stephen Rothwell, May 1994
- * (sfr@xxxxxxxxxxxxxxxx)
- *
- * High load stuff, initrd support and position independency
- * by Hans Lermen & Werner Almesberger, February 1996
- * <lermen@xxxxxxxxxxxxxxxxxx>, <almesber@xxxxxxxxxxx>
- *
- * Video handling moved to video.S by Martin Mares, March 1996
- * <mj@xxxxxxxxxxxxxxxxx>
- *
- * Extended memory detection scheme retwiddled by orc@xxxxxxxxxxxxxx (david
- * parsons) to avoid loadlin confusion, July 1997
- *
- * Transcribed from Intel (as86) -> AT&T (gas) by Chris Noe, May 1999.
- * <stiker@xxxxxxxxxxxxx>
- *
- * Fix to work around buggy BIOSes which dont use carry bit correctly
- * and/or report extended memory in CX/DX for e801h memory size detection
- * call. As a result the kernel got wrong figures. The int15/e801h docs
- * from Ralf Brown interrupt list seem to indicate AX/BX should be used
- * anyway. So to avoid breaking many machines (presumably there was a reason
- * to orginally use CX/DX instead of AX/BX), we do a kludge to see
- * if CX/DX have been changed in the e801 call and if so use AX/BX .
- * Michael Miller, April 2001 <michaelm@xxxxxxxx>
- *
- * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes
- * by Robert Schwebel, December 2001 <robert@xxxxxxxxxxx>
- */
-
-/*
-#include <linux/config.h>
-#include <asm/segment.h>
-#include <linux/version.h>
-#include <linux/compile.h>
-#include <asm/boot.h>
-#include <asm/e820.h>
-#include <asm/page.h>
-*/
-
-/* Definitions that should have come from these includes */
-#define DEF_INITSEG 0x9000
-#define DEF_SYSSEG 0x1000
-#define DEF_SETUPSEG 0x9020
-#define DEF_SYSSIZE 0x7F00
-#define NORMAL_VGA 0xffff
-#define EXTENDED_VGA 0xfffe
-#define ASK_VGA 0xfffd
-#define GDT_ENTRY_BOOT_CS 2
-#define __BOOT_CS (GDT_ENTRY_BOOT_CS * 8)
-#define GDT_ENTRY_BOOT_DS (GDT_ENTRY_BOOT_CS + 1)
-#define __BOOT_DS (GDT_ENTRY_BOOT_DS * 8)
-#define __PAGE_OFFSET (0xC0000000)
-#define E820MAP 0x2d0 /* our map */
-#define E820MAX 32 /* number of entries in E820MAP */
-#define E820NR 0x1e8 /* # entries in E820MAP */
-#define E820_RAM 1
-#define E820_RESERVED 2
-#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
-#define E820_NVS 4
-#define __BIG_KERNEL__
-
-
-/* Signature words to ensure LILO loaded us right */
-#define SIG1 0xAA55
-#define SIG2 0x5A5A
-
-INITSEG = DEF_INITSEG # 0x9000, we move boot here, out of the way
-SYSSEG = DEF_SYSSEG # 0x1000, system loaded at 0x10000 (65536).
-SETUPSEG = DEF_SETUPSEG # 0x9020, this is the current segment
- # ... and the former contents of CS
-
-DELTA_INITSEG = SETUPSEG - INITSEG # 0x0020
-
-.code16
-.globl _start, begtext, begdata, begbss, endtext, enddata, endbss
-
-.text
-begtext:
-.data
-begdata:
-.bss
-begbss:
-.text
-
-_start:
-start:
- jmp trampoline
-
-# This is the setup header, and it must start at %cs:2 (old 0x9020:2)
-
- .ascii "HdrS" # header signature
- .word 0x0203 # header version number (>= 0x0105)
- # or else old loadlin-1.5 will fail)
-realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
-start_sys_seg: .word SYSSEG
- .word kernel_version # pointing to kernel version string
- # above section of header is compatible
- # with loadlin-1.5 (header v1.5). Don't
- # change it.
-
-type_of_loader: .byte 0 # = 0, old one (LILO, Loadlin,
- # Bootlin, SYSLX, bootsect...)
- # See Documentation/i386/boot.txt for
- # assigned ids
-
-# flags, unused bits must be zero (RFU) bit within loadflags
-loadflags:
-LOADED_HIGH = 1 # If set, the kernel is loaded high
-CAN_USE_HEAP = 0x80 # If set, the loader also has set
- # heap_end_ptr to tell how much
- # space behind setup.S can be used for
- # heap purposes.
- # Only the loader knows what is free
-#ifndef __BIG_KERNEL__
- .byte 0
-#else
- .byte LOADED_HIGH
-#endif
-
-setup_move_size: .word 0x8000 # size to move, when setup is not
- # loaded at 0x90000. We will move setup
- # to 0x90000 then just before jumping
- # into the kernel. However, only the
- # loader knows how much data behind
- # us also needs to be loaded.
-
-/* N.B. these next addresses are entirely ignored by this code -- it
- * assumes it was loaded with the 32bit code at 0x100000, and doesn't
- * touch the ramdisk. */
-code32_start: # here loaders can put a different
- # start address for 32-bit code.
-#ifndef __BIG_KERNEL__
- .long 0x1000 # 0x1000 = default for zImage
-#else
- .long 0x100000 # 0x100000 = default for big kernel
-#endif
-
-ramdisk_image: .long 0 # address of loaded ramdisk image
- # Here the loader puts the 32-bit
- # address where it loaded the image.
- # This only will be read by the kernel.
-
-ramdisk_size: .long 0 # its size in bytes
-
-bootsect_kludge:
- .long 0 # obsolete
-
-heap_end_ptr: .word modelist+1024 # (Header version 0x0201 or later)
- # space from here (exclusive) down to
- # end of setup code can be used by setup
- # for local heap purposes.
-
-pad1: .word 0
-cmd_line_ptr: .long 0 # (Header version 0x0202 or later)
- # If nonzero, a 32-bit pointer
- # to the kernel command line.
- # The command line should be
- # located between the start of
- # setup and the end of low
- # memory (0xa0000), or it may
- # get overwritten before it
- # gets read. If this field is
- # used, there is no longer
- # anything magical about the
- # 0x90000 segment; the setup
- # can be located anywhere in
- # low memory 0x10000 or higher.
-
-ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
- # (Header version 0x0203 or later)
- # The highest safe address for
- # the contents of an initrd
-
-/* Add more known locations: the image builder will overwrite
- * these with the entry point and MBI location for the multiboot kernel.
- * These offsets *must* match the definitions in buildimage.c */
-
-entry_address: .long 0 # This will be offset 0x30 (0x230 from b'sect)
-mbi_address: .long 0 # This will be offset 0x34
-
-/* Storage space for the size of memory */
-highmem_size: .long 0
-
-trampoline: call start_of_setup
- .space 1024
-# End of setup header #####################################################
-
-start_of_setup:
-# Bootlin depends on this being done early
- movw $0x01500, %ax
- movb $0x81, %dl
- int $0x13
-
-#ifdef SAFE_RESET_DISK_CONTROLLER
-# Reset the disk controller.
- movw $0x0000, %ax
- movb $0x80, %dl
- int $0x13
-#endif
-
-# Set %ds = %cs, we know that SETUPSEG = %cs at this point
- movw %cs, %ax # aka SETUPSEG
- movw %ax, %ds
-
-# Check signature at end of setup
- cmpw $SIG1, setup_sig1
- jne bad_sig
-
- cmpw $SIG2, setup_sig2
- jne bad_sig
-
- jmp good_sig1
-
-# Routine to print asciiz string at ds:si
-prtstr:
- lodsb
- andb %al, %al
- jz fin
-
- call prtchr
- jmp prtstr
-
-fin: ret
-
-# Space printing
-prtsp2: call prtspc # Print double space
-prtspc: movb $0x20, %al # Print single space (note: fall-thru)
-
-# Part of above routine, this one just prints ascii al
-prtchr: pushw %ax
- pushw %cx
- movw $7,%bx
- movw $0x01, %cx
- movb $0x0e, %ah
- int $0x10
- popw %cx
- popw %ax
- ret
-
-beep: movb $0x07, %al
- jmp prtchr
-
-no_sig_mess: .string "No setup signature found ..."
-
-good_sig1:
- jmp good_sig
-
-# We now have to find the rest of the setup code/data
-bad_sig:
- movw %cs, %ax # SETUPSEG
- subw $DELTA_INITSEG, %ax # INITSEG
- movw %ax, %ds
- xorb %bh, %bh
- movb (497), %bl # get setup sect from bootsect
- subw $4, %bx # LILO loads 4 sectors of setup
- shlw $8, %bx # convert to words (1sect=2^8
words)
- movw %bx, %cx
- shrw $3, %bx # convert to segment
- addw $SYSSEG, %bx
- movw %bx, %cs:start_sys_seg
-# Move rest of setup code/data to here
- movw $2048, %di # four sectors loaded by LILO
- subw %si, %si
- pushw %cs
- popw %es
- movw $SYSSEG, %ax
- movw %ax, %ds
- rep
- movsw
- movw %cs, %ax # aka SETUPSEG
- movw %ax, %ds
- cmpw $SIG1, setup_sig1
- jne no_sig
-
- cmpw $SIG2, setup_sig2
- jne no_sig
-
- jmp good_sig
-
-no_sig:
- lea no_sig_mess, %si
- call prtstr
-
-no_sig_loop:
- hlt
- jmp no_sig_loop
-
-mb_hello_mess1:
- .string "mboot"
-
-good_sig:
- lea mb_hello_mess1, %si
- call prtstr
-
- movw %cs, %ax # aka SETUPSEG
- subw $DELTA_INITSEG, %ax # aka INITSEG
- movw %ax, %ds
-# Check if an old loader tries to load a big-kernel
- testb $LOADED_HIGH, %cs:loadflags # Do we have a big kernel?
- jz loader_ok # No, no danger for old loaders.
-
- cmpb $0, %cs:type_of_loader # Do we have a loader that
- # can deal with us?
- jnz loader_ok # Yes, continue.
-
- pushw %cs # No, we have an old loader,
- popw %ds # die.
- lea loader_panic_mess, %si
- call prtstr
-
- jmp no_sig_loop
-
-loader_panic_mess: .string "Wrong loader, giving up..."
-
-loader_ok:
-
-# Get memory size (extended mem, kB)
-
-/* We'll be storing this in highmem_size, to be copied to the mbi */
-
-# Try three different memory detection schemes. First, try
-# e820h, which lets us assemble a memory map, then try e801h,
-# which returns a 32-bit memory size, and finally 88h, which
-# returns 0-64m
-
- xorl %edx, %edx
- xorl %eax, %eax
- movl %eax, (0x1e0)
- movl %eax, highmem_size
- movb %al, (E820NR)
-
-# method E820H:
-# the memory map from hell. e820h returns memory classified into
-# a whole bunch of different types, and allows memory holes and
-# everything. We scan through this memory map and build a list
-# of the first 32 memory areas, which we return at [E820MAP].
-# This is documented at http://www.acpi.info/, in the ACPI 2.0 specification.
-
-#define SMAP 0x534d4150
-
-meme820:
- xorl %ebx, %ebx # continuation counter
- movw $E820MAP, %di # point into the whitelist
- # so we can have the bios
- # directly write into it.
-
-jmpe820:
- movl $0x0000e820, %eax # e820, upper word zeroed
- movl $SMAP, %edx # ascii 'SMAP'
- movl $20, %ecx # size of the e820rec
- pushw %ds # data record.
- popw %es
- int $0x15 # make the call
- jc bail820 # fall to e801 if it fails
-
- cmpl $SMAP, %eax # check the return is `SMAP'
- jne bail820 # fall to e801 if it fails
-
-# cmpl $1, 16(%di) # is this usable memory?
-# jne again820
-
- # If this is usable memory, we save it by simply advancing %di by
- # sizeof(e820rec).
- #
-good820:
- movb (E820NR), %al # up to 32 entries
- cmpb $E820MAX, %al
- jnl bail820
-
- incb (E820NR)
- movw %di, %ax
- addw $20, %ax
- movw %ax, %di
-again820:
- cmpl $0, %ebx # check to see if
- jne jmpe820 # %ebx is set to EOF
-
-/* Multiboot spec says high mem should be the address of the first
- * upper memory hole, minus 1 MB */
- xorl %ebx, %ebx
- xorl %ecx, %ecx
- xorl %edx, %edx
- movw $E820MAP, %di # Start at the beginning
-calc_highmem_loop:
- cmpl $1, 16(%di) # is it usable memory?
- jnz calc_highmem_next
- cmpl $0, 4(%di) # is base < 4GB?
- jnz calc_highmem_next
- cmpl $0x100000, 0(%di) # is base <= 1MB?
- jg calc_highmem_next
- movl 8(%di), %ecx # Calculate base+length
- shrl $10, %ecx # in kilobytes
- movl 12(%di), %edx
- shll $22, %edx
- orl %edx, %ecx
- movl 0(%di), %edx
- shrl $10, %edx
- addl %edx, %ecx
- subl $1024, %ecx # - 1 MB
- cmpl %cs:highmem_size, %ecx
- jl calc_highmem_next
- movl %ecx, %cs:highmem_size
-calc_highmem_next:
- add $1, %bl
- add $20, %di
- cmp %bl, (E820NR)
- je calc_highmem_done
- jmp calc_highmem_loop
-calc_highmem_done:
-
-bail820:
-
-# method E801H:
-# memory size is in 1k chunksizes, to avoid confusing loadlin.
-
-meme801:
- stc # fix to work around buggy
- xorw %cx,%cx # BIOSes which dont clear/set
- xorw %dx,%dx # carry on pass/error of
- # e801h memory size call
- # or merely pass cx,dx though
- # without changing them.
- movw $0xe801, %ax
- int $0x15
- jc mem88
-
- cmpw $0x0, %cx # Kludge to handle BIOSes
- jne e801usecxdx # which report their extended
- cmpw $0x0, %dx # memory in AX/BX rather than
- jne e801usecxdx # CX/DX. The spec I have read
- movw %ax, %cx # seems to indicate AX/BX
- movw %bx, %dx # are more reasonable anyway...
-
-e801usecxdx:
- andl $0xffff, %edx # clear sign extend
- shll $6, %edx # and go from 64k to 1k chunks
- andl $0xffff, %ecx # clear sign extend
- addl %ecx, %edx
-
- cmpl %cs:highmem_size, %edx # store extended mem size
- jl mem88 # if it's bigger than
- movl %edx, %cs:highmem_size # what we already have
-
-# Ye Olde Traditional Methode. Returns the memory size (up to 16mb or
-# 64mb, depending on the bios) in ax.
-mem88:
- movb $0x88, %ah
- int $0x15
-
- andl $0xffff, %eax # clear sign extend
- cmpl %cs:highmem_size, %eax # store extended mem size
- jl have_memsize # if it's bigger than
- movl %eax, %cs:highmem_size # what we already have
-
-have_memsize:
-
-/* Culled: HDD probes, APM, speedstep */
-
-# Now we want to move to protected mode ...
- cmpw $0, %cs:realmode_swtch
- jz rmodeswtch_normal
-
- lcall *%cs:realmode_swtch
-
- jmp rmodeswtch_end
-
-rmodeswtch_normal:
- pushw %cs
- call default_switch
-
-rmodeswtch_end:
-
-/* Culled: code to take the 32bit entry address from the loader */
-/* Culled: code to relocate non-bzImage kernels */
-
- # then we load the segment descriptors
- movw %cs, %ax # aka SETUPSEG
- movw %ax, %ds
-
-# Check whether we need to be downward compatible with version <=201
- cmpl $0, cmd_line_ptr
- jne end_move_self # loader uses version >=202 features
- cmpb $0x20, type_of_loader
- je end_move_self # bootsect loader, we know of it
-
-# Boot loader doesnt support boot protocol version 2.02.
-# If we have our code not at 0x90000, we need to move it there now.
-# We also then need to move the params behind it (commandline)
-# Because we would overwrite the code on the current IP, we move
-# it in two steps, jumping high after the first one.
- movw %cs, %ax
- cmpw $SETUPSEG, %ax
- je end_move_self
-
- cli # make sure we really have
- # interrupts disabled !
- # because after this the stack
- # should not be used
- subw $DELTA_INITSEG, %ax # aka INITSEG
- movw %ss, %dx
- cmpw %ax, %dx
- jb move_self_1
-
- addw $INITSEG, %dx
- subw %ax, %dx # this will go into %ss after
- # the move
-move_self_1:
- movw %ax, %ds
- movw $INITSEG, %ax # real INITSEG
- movw %ax, %es
- movw %cs:setup_move_size, %cx
- std # we have to move up, so we use
- # direction down because the
- # areas may overlap
- movw %cx, %di
- decw %di
- movw %di, %si
- subw $move_self_here+0x200, %cx
- rep
- movsb
- ljmp $SETUPSEG, $move_self_here
-
-move_self_here:
- movw $move_self_here+0x200, %cx
- rep
- movsb
- movw $SETUPSEG, %ax
- movw %ax, %ds
- movw %dx, %ss
-end_move_self: # now we are at the right place
-
-#
-# Enable A20. This is at the very best an annoying procedure.
-# A20 code ported from SYSLINUX 1.52-1.63 by H. Peter Anvin.
-# AMD Elan bug fix by Robert Schwebel.
-#
-
-#if defined(CONFIG_X86_ELAN)
- movb $0x02, %al # alternate A20 gate
- outb %al, $0x92 # this works on SC410/SC520
-a20_elan_wait:
- call a20_test
- jz a20_elan_wait
- jmp a20_done
-#endif
-
-
-A20_TEST_LOOPS = 32 # Iterations per wait
-A20_ENABLE_LOOPS = 255 # Total loops to try
-
-
-#ifndef CONFIG_X86_VOYAGER
-a20_try_loop:
-
- # First, see if we are on a system with no A20 gate.
-a20_none:
- call a20_test
- jnz a20_done
-
- # Next, try the BIOS (INT 0x15, AX=0x2401)
-a20_bios:
- movw $0x2401, %ax
- pushfl # Be paranoid about flags
- int $0x15
- popfl
-
- call a20_test
- jnz a20_done
-
- # Try enabling A20 through the keyboard controller
-#endif /* CONFIG_X86_VOYAGER */
-a20_kbc:
- call empty_8042
-
-#ifndef CONFIG_X86_VOYAGER
- call a20_test # Just in case the BIOS worked
- jnz a20_done # but had a delayed reaction.
-#endif
-
- movb $0xD1, %al # command write
- outb %al, $0x64
- call empty_8042
-
- movb $0xDF, %al # A20 on
- outb %al, $0x60
- call empty_8042
-
-#ifndef CONFIG_X86_VOYAGER
- # Wait until a20 really *is* enabled; it can take a fair amount of
- # time on certain systems; Toshiba Tecras are known to have this
- # problem.
-a20_kbc_wait:
- xorw %cx, %cx
-a20_kbc_wait_loop:
- call a20_test
- jnz a20_done
- loop a20_kbc_wait_loop
-
- # Final attempt: use "configuration port A"
-a20_fast:
- inb $0x92, %al # Configuration Port A
- orb $0x02, %al # "fast A20" version
- andb $0xFE, %al # don't accidentally reset
- outb %al, $0x92
-
- # Wait for configuration port A to take effect
-a20_fast_wait:
- xorw %cx, %cx
-a20_fast_wait_loop:
- call a20_test
- jnz a20_done
- loop a20_fast_wait_loop
-
- # A20 is still not responding. Try frobbing it again.
- #
- decb (a20_tries)
- jnz a20_try_loop
-
- movw $a20_err_msg, %si
- call prtstr
-
-a20_die:
- hlt
- jmp a20_die
-
-a20_tries:
- .byte A20_ENABLE_LOOPS
-
-a20_err_msg:
- .ascii "linux: fatal error: A20 gate not responding!"
- .byte 13, 10, 0
-
- # If we get here, all is good
-a20_done:
-
-
-#endif /* CONFIG_X86_VOYAGER */
-
-/* Another print, to show protected mode and A20 are OK */
-
- jmp mb_hello_mess2_end
-mb_hello_mess2:
- .string "pack "
-mb_hello_mess2_end:
- lea mb_hello_mess2, %si
- call prtstr
-
-# set up gdt and idt
-/* lidt idt_48 # load idt with 0,0 */
-/* Multiboot kernels must set up their own IDT: leave this for now,
- * so we can print diagnostics */
-
- xorl %eax, %eax # Compute gdt_base
- movw %ds, %ax # (Convert %ds:gdt to a linear
ptr)
- shll $4, %eax
- addl $gdt, %eax
- movl %eax, (gdt_48+2)
- lgdt gdt_48 # load gdt with whatever is
- # appropriate
-
-# make sure any possible coprocessor is properly reset..
- xorw %ax, %ax
- outb %al, $0xf0
- call delay
-
- outb %al, $0xf1
- call delay
-
-
-# well, that went ok, I hope. Now we mask all interrupts - the rest
-# is done in init_IRQ().
- movb $0xFF, %al # mask all interrupts for now
- outb %al, $0xA1
- call delay
-
- movb $0xFB, %al # mask all irq's but irq2 which
- outb %al, $0x21 # is cascaded
-
-# Well, that certainly wasn't fun :-(. Hopefully it works, and we don't
-# need no steenking BIOS anyway (except for the initial loading :-).
-# The BIOS-routine wants lots of unnecessary data, and it's less
-# "interesting" anyway. This is how REAL programmers do it.
-
-/* Tailor the jump below so the target is the 32bit trampoline code */
-
- xorl %eax, %eax # Calculate
- movw %cs, %ax # the linear
- shll $4, %eax # address of
- addl $trampoline32, %eax # %cs:trampoline32
- movl %eax, %cs:code32 # Stick it into the jmpi
-
- /* Load a 32-bit pointer to the entry address into %ecx */
- xorl %ecx, %ecx # Calculate
- movw %cs, %cx # the linear
- shll $4, %ecx # address of
- addl $entry_address, %ecx # %cs:entry_address
-
-# Well, now's the time to actually move into protected mode.
-
- lea mb_ready_mess, %si
- call prtstr
-
-/* May as well load this IDT now */
- lidt idt_48
-
- xorl %eax, %eax
- movw $1, %ax # protected mode (PE) bit
- lmsw %ax # This is it!
- jmp flush_instr
-flush_instr:
-
- /* Set up segment registers */
- movw $__BOOT_DS, %dx
- movw %dx, %ds
- movw %dx, %es
- movw %dx, %fs
- movw %dx, %gs
- movw %dx, %ss
-
- /* Trampoline expects this in %eax */
- movl %ecx, %eax
-
- /* Jump to the 32-bit trampoline */
-
-# NOTE: For high loaded big kernels we need a
-# jmpi 0x100000,__BOOT_CS
-#
-# but we yet haven't reloaded the CS register, so the default size
-# of the target offset still is 16 bit.
-# However, using an operand prefix (0x66), the CPU will properly
-# take our 48 bit far pointer. (INTeL 80386 Programmer's Reference
-# Manual, Mixing 16-bit and 32-bit code, page 16-6)
-
- .byte 0x66, 0xea # prefix + jmpi-opcode
-code32: .long 0x1000 # will be set to
trampoline32
- # by code above.
- .word __BOOT_CS
-
-# Here's a bunch of information about your current kernel..
-
-kernel_version: .string "mbootpack changeling bzImage"
-mb_ready_mess:
- .ascii MBOOTPACK_VERSION_STRING
- .ascii "\r\n"
- .byte 0
-
-# This is the default real mode switch routine.
-# to be called just before protected mode transition
-default_switch:
- cli # no interrupts allowed !
- movb $0x80, %al # disable NMI for bootup
- # sequence
- outb %al, $0x70
- lret
-
-
-#ifndef CONFIG_X86_VOYAGER
-# This routine tests whether or not A20 is enabled. If so, it
-# exits with zf = 0.
-#
-# The memory address used, 0x200, is the int $0x80 vector, which
-# should be safe.
-
-A20_TEST_ADDR = 4*0x80
-
-a20_test:
- pushw %cx
- pushw %ax
- xorw %cx, %cx
- movw %cx, %fs # Low memory
- decw %cx
- movw %cx, %gs # High memory area
- movw $A20_TEST_LOOPS, %cx
- movw %fs:(A20_TEST_ADDR), %ax
- pushw %ax
-a20_test_wait:
- incw %ax
- movw %ax, %fs:(A20_TEST_ADDR)
- call delay # Serialize and make delay
constant
- cmpw %gs:(A20_TEST_ADDR+0x10), %ax
- loope a20_test_wait
-
- popw %fs:(A20_TEST_ADDR)
- popw %ax
- popw %cx
- ret
-
-#endif /* CONFIG_X86_VOYAGER */
-
-# This routine checks that the keyboard command queue is empty
-# (after emptying the output buffers)
-#
-# Some machines have delusions that the keyboard buffer is always full
-# with no keyboard attached...
-#
-# If there is no keyboard controller, we will usually get 0xff
-# to all the reads. With each IO taking a microsecond and
-# a timeout of 100,000 iterations, this can take about half a
-# second ("delay" == outb to port 0x80). That should be ok,
-# and should also be plenty of time for a real keyboard controller
-# to empty.
-#
-
-empty_8042:
- pushl %ecx
- movl $100000, %ecx
-
-empty_8042_loop:
- decl %ecx
- jz empty_8042_end_loop
-
- call delay
-
- inb $0x64, %al # 8042 status port
- testb $1, %al # output buffer?
- jz no_output
-
- call delay
- inb $0x60, %al # read it
- jmp empty_8042_loop
-
-no_output:
- testb $2, %al # is input buffer full?
- jnz empty_8042_loop # yes - loop
-empty_8042_end_loop:
- popl %ecx
- ret
-
-# Read the cmos clock. Return the seconds in al
-gettime:
- pushw %cx
- movb $0x02, %ah
- int $0x1a
- movb %dh, %al # %dh contains the seconds
- andb $0x0f, %al
- movb %dh, %ah
- movb $0x04, %cl
- shrb %cl, %ah
- aad
- popw %cx
- ret
-
-# Delay is needed after doing I/O
-delay:
- outb %al,$0x80
- ret
-
-# Descriptor tables
-#
-# NOTE: The intel manual says gdt should be sixteen bytes aligned for
-# efficiency reasons. However, there are machines which are known not
-# to boot with misaligned GDTs, so alter this at your peril! If you alter
-# GDT_ENTRY_BOOT_CS (in asm/segment.h) remember to leave at least two
-# empty GDT entries (one for NULL and one reserved).
-#
-# NOTE: On some CPUs, the GDT must be 8 byte aligned. This is
-# true for the Voyager Quad CPU card which will not boot without
-# This directive. 16 byte aligment is recommended by intel.
-#
-
-
-/* The boot-time code segment is set at the jmpi above */
-/* Dont change this without checking everything still matches */
-
- .align 16
-gdt:
- .fill GDT_ENTRY_BOOT_CS,8,0
-
- .word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb)
- .word 0 # base address = 0
- .word 0x9A00 # code read/exec
- .word 0x00CF # granularity = 4096, 386
- # (+5th nibble of limit)
-
- .word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb)
- .word 0 # base address = 0
- .word 0x9200 # data read/write
- .word 0x00CF # granularity = 4096, 386
- # (+5th nibble of limit)
-gdt_end:
- .align 4
-
- .word 0 # alignment byte
-idt_48:
- .word 0 # idt limit = 0
- .word 0, 0 # idt base = 0L
-
- .word 0 # alignment byte
-gdt_48:
- .word gdt_end - gdt - 1 # gdt limit
- .word 0, 0 # gdt base (filled in later)
-
-# Include video setup & detection code
-
-/* #include "video.S" */
-
-.code32
-trampoline32:
- /* Here, %eax = 32-bit pointer to entry_address */
-
- /* Check if the bootloader gave us a (non-empty) command line */
- movl -8(%eax), %ebx # cmd_line_ptr
- cmpl $0, %ebx
- je no_cmd_line
- cmpb $0, 0(%ebx)
- je no_cmd_line
-
- /* Find the MBI command line */
- movl %eax, %ecx # &entry_address
- addl $(begtext-entry_address), %ecx # --> start of setup
- subl $0x9200, %ecx # --> reloc offset
- movl %ecx, %esi # (copy offset)
- movl %ecx, %ebx # (copy offset)
- addl 4(%eax), %ecx # --> current addr of MBI
- addl 16(%ecx), %ebx # --> cur. addr of MB cmdline
-
- /* Overwrite the built-in MBI kernel command line */
- movl -8(%eax), %ecx
- movl $0, %edi
-
- /* Give the kernel a 'self' word, that linux doesn't get */
- movw $0x202E, 0(%ebx) # '. '
- addl $0x2, %ebx
-
-cmd_line_copy:
- movb (%ecx, %edi), %dl
- movb %dl, (%ebx, %edi)
- inc %edi
- cmp $CMD_LINE_SPACE-3, %edi
- je cmd_line_copy_end
-
- cmpb $0x0, %dl
- jne cmd_line_copy
-cmd_line_copy_end:
- movb $0x0, (%ebx, %edi)
- subl $0x2, %ebx
-
- /* Look for '--' in the kernel command line */
-cmd_line_scan:
- inc %ebx
- cmpb $0x0, 0(%ebx)
- je no_cmd_line
- cmpl $0x202D2D20, 0(%ebx) # ' -- '
- jne cmd_line_scan
-
- /* Found it: terminate kernel's command line */
- movb $0x0, 0(%ebx)
- inc %ebx
- /* Relocate address to where it will be moved to */
- subl %esi, %ebx
-
- /* Is there a module 0? */
- movl %esi, %ecx # Reloc offset
- addl 4(%eax), %ecx # --> current addr of MBI
- cmpl $0x0, 20(%ecx) # (check module count)
- je no_cmd_line
- /* Overwrite module 0's command line */
- movl %esi, %edx # Reloc offset
- addl 24(%ecx), %edx # --> cur. add. of Module 0
- movl %ebx, 8(%edx) # --> blat mod. 0's cmdline
-no_cmd_line:
-
-
- /* Relocate the MBI from after the setup code to its proper home
- * between the MBI pointer and 0xa000 */
- movl %eax, %ecx # &entry_address
- addl $(begtext-entry_address), %ecx # --> start of setup
- subl $0x9200, %ecx # --> reloc offset
- addl 4(%eax), %ecx # --> current addr of MBI
-
- movl $0xa000, %ebx # End of MBI
- subl 4(%eax), %ebx # --> size of MBI
- movl %ebx, %edi
-
- movl 4(%eax), %ebx # Destination of MBI
-
-mbi_copy:
- dec %edi
- movb (%ecx, %edi), %dl
- movb %dl, (%ebx, %edi)
- cmp $0x0, %edi
- jne mbi_copy
-
- /* Copy memory size into MBI structure */
- movl 4(%eax), %ebx # MBI pointer
- movl 8(%eax), %ecx # highmem_size
- movl %ecx, 8(%ebx) # --> mbi.mem_upper
- movl $0x280, %ecx
- movl %ecx, 4(%ebx) # --> mbi.mem_lower
- /* Set the MB_INFO_MEMORY bit */
- orl $1, 0(%ebx)
-
- /* Recover the MBI pointer into %ebx */
- movl 4(%eax), %ebx # MBI pointer
- /* Extract the load address into %ecx */
- movl 0(%eax), %ecx
- /* Let the kernel know we're a multiboot loader */
- movl $0x2BADB002, %eax
- /* Jump to the kernel address supplied */
- jmp *%ecx
-
-# Setup signature -- must be last
-setup_sig1: .word SIG1
-setup_sig2: .word SIG2
-
-# After this point, there is some free space which is used by the video mode
-# handling code to store the temporary mode table (not used by the kernel).
-
-modelist:
-
-.text
-endtext:
-.data
-enddata:
-.bss
-endbss:
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|