[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Remove obsolete tool 'mbootpack'. SYSLINUX now supports Multiboot format.
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |