From 15ac34a918f67fc40238930d584ab129b0b47c58 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 9 Mar 2006 12:47:37 +0000 Subject: [PATCH] * Added glue code to compile libcaca without a libc and build applications as multiboot kernels. --- COPYING.GPL | 340 ++++++++++++++++++++++++++++++++++++++++ Makefile.am | 4 +- build-kernel | 30 ++++ caca/time.c | 26 +-- configure.ac | 16 +- cucul/bitmap.c | 15 +- cucul/box.c | 4 +- cucul/char.c | 27 ++-- cucul/conic.c | 4 +- cucul/cucul.c | 6 +- cucul/cucul_internals.h | 6 +- cucul/export.c | 8 +- cucul/line.c | 4 +- cucul/math.c | 4 +- cucul/sprite.c | 8 +- cucul/triangle.c | 4 +- kernel/Makefile.am | 12 ++ kernel/kernel.c | 204 ++++++++++++++++++++++++ kernel/kernel.h | 95 +++++++++++ kernel/multiboot.S | 73 +++++++++ kernel/multiboot.h | 115 ++++++++++++++ src/aafire.c | 8 +- 22 files changed, 958 insertions(+), 55 deletions(-) create mode 100644 COPYING.GPL create mode 100644 build-kernel create mode 100644 kernel/Makefile.am create mode 100644 kernel/kernel.c create mode 100644 kernel/kernel.h create mode 100644 kernel/multiboot.S create mode 100644 kernel/multiboot.h diff --git a/COPYING.GPL b/COPYING.GPL new file mode 100644 index 0000000..b7b5f53 --- /dev/null +++ b/COPYING.GPL @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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. + + + Copyright (C) + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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. + + , 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 --git a/Makefile.am b/Makefile.am index f7d8be0..5064a81 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,9 @@ # $Id$ -SUBDIRS = cucul caca src test doc +SUBDIRS = kernel cucul caca src test doc DIST_SUBDIRS = $(SUBDIRS) autotools debian msvc -EXTRA_DIST = NOTES COPYING.LGPL bootstrap build-dos build-win32 caca-config.in libcaca.spec +EXTRA_DIST = NOTES COPYING.GPL COPYING.LGPL bootstrap build-dos build-kernel build-win32 caca-config.in libcaca.spec AUTOMAKE_OPTIONS = dist-bzip2 bin_SCRIPTS = caca-config diff --git a/build-kernel b/build-kernel new file mode 100644 index 0000000..6423bb3 --- /dev/null +++ b/build-kernel @@ -0,0 +1,30 @@ +#! /bin/sh + +## Kernel-mode libcaca compilation script -- Sam Hocevar +## $Id: build-dos 333 2006-03-07 12:39:34Z sam $ + +set -x +set -e + +CFLAGS="-fno-builtin -O2 -I. -I.. -Wall" +CPPFLAGS="-D__KERNEL__ -nostdinc -include kernel/kernel.h" +LDFLAGS="-nostdlib -Wl,-N -Wl,-Ttext -Wl,100000" + +./configure --disable-slang --disable-ncurses --disable-win32 \ + --disable-conio --disable-x11 --disable-gl --disable-network \ + --enable-vga --disable-imlib2 --disable-doc \ + --host i386 + +(cd cucul && make) +(cd caca && make) + +(cd src && make cacafire-aafire.o) + +(cd kernel && + gcc $CFLAGS -c multiboot.S -o multiboot.o + gcc $CFLAGS $CPPFLAGS -c kernel.c -o kernel.o) + +gcc $LDFLAGS -o src/cacafire kernel/multiboot.o kernel/kernel.o src/cacafire-aafire.o caca/.libs/libcaca.a cucul/.libs/libcucul.a + +objcopy -O binary src/cacafire cacafire.boot + diff --git a/caca/time.c b/caca/time.c index a43355b..bc094a8 100644 --- a/caca/time.c +++ b/caca/time.c @@ -19,18 +19,18 @@ #include "config.h" -#include -#if defined(HAVE_SYS_TIME_H) -# include -#endif -#include - -#if defined(USE_WIN32) -# include -#endif - -#if defined(HAVE_UNISTD_H) -# include +#if !defined(__KERNEL__) +# include +# if defined(HAVE_SYS_TIME_H) +# include +# endif +# include +# if defined(USE_WIN32) +# include +# endif +# if defined(HAVE_UNISTD_H) +# include +# endif #endif #include "caca.h" @@ -43,7 +43,7 @@ void _caca_sleep(unsigned int usec) #elif defined(HAVE_SLEEP) Sleep(usec / 1000); #else - SLEEP + /* SLEEP */ #endif } diff --git a/configure.ac b/configure.ac index fe589b7..bcc54a5 100644 --- a/configure.ac +++ b/configure.ac @@ -11,6 +11,7 @@ AM_CONFIG_HEADER(config.h) AM_PROG_CC_C_O AC_PROG_CPP +AM_PROG_AS AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL @@ -38,6 +39,8 @@ AC_ARG_ENABLE(gl, [ --enable-gl OpenGL support (autodetected)]) AC_ARG_ENABLE(network, [ --enable-network Network support (autodetected)]) +AC_ARG_ENABLE(vga, + [ --enable-vga VGA support (default disabled)]) dnl example programs features AC_ARG_ENABLE(imlib2, @@ -47,7 +50,7 @@ dnl conditional builds AC_ARG_ENABLE(doc, [ --enable-doc build documentation (needs doxygen and LaTeX)]) -AC_CHECK_HEADERS(signal.h sys/ioctl.h sys/time.h inttypes.h endian.h unistd.h) +AC_CHECK_HEADERS(stdio.h stdarg.h signal.h sys/ioctl.h sys/time.h inttypes.h endian.h unistd.h) AC_CHECK_FUNCS(signal ioctl vsnprintf getenv putenv strcasecmp) AC_CHECK_FUNCS(usleep gettimeofday) @@ -168,6 +171,16 @@ if test "${enable_ncurses}" != "no"; then fi fi +if test "${enable_vga}" = "yes"; then + ac_cv_my_have_vga="yes" + CPPFLAGS="${CPPFLAGS} -I. -D__KERNEL__ -nostdinc -include kernel/kernel.h" + CFLAGS="${CFLAGS} -fno-builtin -O2 -Wall" + CCASFLAGS="${CCASFLAGS} -I." + LDFLAGS="${LDFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,100000" + AC_DEFINE(USE_VGA, 1, Define to activate the VGA backend driver) + CACA_DRIVERS="${CACA_DRIVERS} vga" +fi + AC_MSG_CHECKING(valid output drivers) if test -z "${CACA_DRIVERS}"; then AC_MSG_RESULT(no) @@ -244,6 +257,7 @@ AM_CONDITIONAL(USE_LATEX, test "${LATEX}" != "no") AC_CONFIG_FILES([ Makefile + kernel/Makefile cucul/Makefile caca/Makefile src/Makefile diff --git a/cucul/bitmap.c b/cucul/bitmap.c index 86a51e4..bfdbd60 100644 --- a/cucul/bitmap.c +++ b/cucul/bitmap.c @@ -19,15 +19,16 @@ #include "config.h" -#if defined(HAVE_ENDIAN_H) -# include +#if !defined(__KERNEL__) +# if defined(HAVE_ENDIAN_H) +# include +# endif +# include +# include +# include +# include #endif -#include -#include -#include -#include - #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/box.c b/cucul/box.c index 88d94ae..2a04bb4 100644 --- a/cucul/box.c +++ b/cucul/box.c @@ -19,7 +19,9 @@ #include "config.h" -#include +#if !defined(__KERNEL__) +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/char.c b/cucul/char.c index 8ecd6fe..1d4b12a 100644 --- a/cucul/char.c +++ b/cucul/char.c @@ -19,19 +19,20 @@ #include "config.h" -#include /* BUFSIZ */ -#include -#include -#if defined(HAVE_UNISTD_H) -# include -#endif -#include - -#if defined(HAVE_SIGNAL_H) -# include -#endif -#if defined(HAVE_SYS_IOCTL_H) -# include +#if !defined(__KERNEL__) +# include /* BUFSIZ */ +# include +# include +# include +# if defined(HAVE_UNISTD_H) +# include +# endif +# if defined(HAVE_SIGNAL_H) +# include +# endif +# if defined(HAVE_SYS_IOCTL_H) +# include +# endif #endif #include "cucul.h" diff --git a/cucul/conic.c b/cucul/conic.c index 5b4db62..34bf2a3 100644 --- a/cucul/conic.c +++ b/cucul/conic.c @@ -20,7 +20,9 @@ #include "config.h" -#include +#if !defined(__KERNEL__) +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/cucul.c b/cucul/cucul.c index 781580e..2ffbd3f 100644 --- a/cucul/cucul.c +++ b/cucul/cucul.c @@ -20,8 +20,10 @@ #include "config.h" -#include -#include +#if !defined(__KERNEL__) +# include +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/cucul_internals.h b/cucul/cucul_internals.h index 3e33ce0..abfe3c1 100644 --- a/cucul/cucul_internals.h +++ b/cucul/cucul_internals.h @@ -20,12 +20,12 @@ #ifndef __CUCUL_INTERNALS_H__ #define __CUCUL_INTERNALS_H__ -#if defined(HAVE_INTTYPES_H) || defined(_DOXYGEN_SKIP_ME) +#if defined(HAVE_INTTYPES_H) && !defined(__KERNEL__) # include -#elif !defined(CUSTOM_INTTYPES) +#elif !defined(CUSTOM_INTTYPES) && !defined(_DOXYGEN_SKIP_ME) # define CUSTOM_INTTYPES typedef unsigned char uint8_t; -typedef unsigned char uint16_t; +typedef unsigned short uint16_t; typedef unsigned int uint32_t; #endif diff --git a/cucul/export.c b/cucul/export.c index e5a7da0..1758217 100644 --- a/cucul/export.c +++ b/cucul/export.c @@ -21,9 +21,11 @@ #include "config.h" -#include -#include -#include +#if !defined(__KERNEL__) +# include +# include +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/line.c b/cucul/line.c index 85c2b47..0b9f179 100644 --- a/cucul/line.c +++ b/cucul/line.c @@ -20,7 +20,9 @@ #include "config.h" -#include +#if !defined(__KERNEL__) +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/math.c b/cucul/math.c index 21f6e79..3ffd870 100644 --- a/cucul/math.c +++ b/cucul/math.c @@ -19,7 +19,9 @@ #include "config.h" -#include +#if !defined(__KERNEL__) +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/sprite.c b/cucul/sprite.c index 56677ed..3b13411 100644 --- a/cucul/sprite.c +++ b/cucul/sprite.c @@ -19,9 +19,11 @@ #include "config.h" -#include -#include -#include +#if !defined(__KERNEL__) +# include +# include +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/cucul/triangle.c b/cucul/triangle.c index 7dcac88..0eb52f4 100644 --- a/cucul/triangle.c +++ b/cucul/triangle.c @@ -19,7 +19,9 @@ #include "config.h" -#include +#if !defined(__KERNEL__) +# include +#endif #include "cucul.h" #include "cucul_internals.h" diff --git a/kernel/Makefile.am b/kernel/Makefile.am new file mode 100644 index 0000000..6fb0489 --- /dev/null +++ b/kernel/Makefile.am @@ -0,0 +1,12 @@ +# $Id: Makefile.am 326 2006-03-06 20:57:14Z sam $ + +lib_LTLIBRARIES = libkernel.la + +libkernel_la_SOURCES = \ + kernel.c \ + kernel.h \ + multiboot.S \ + multiboot.h \ + $(NULL) +libkernel_la_LDFLAGS = -no-undefined + diff --git a/kernel/kernel.c b/kernel/kernel.c new file mode 100644 index 0000000..c652330 --- /dev/null +++ b/kernel/kernel.c @@ -0,0 +1,204 @@ +/* + * libcucul Unicode canvas library + * libcaca ASCII-Art library + * Copyright (c) 2006 Sam Hocevar + * All Rights Reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the Do What The Fuck You Want To + * Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/** \file kernel.c + * \version \$Id$ + * \author Sam Hocevar + * \brief Kernel features + * + * This file contains replacement functions for the standard C library + * that must be used when building libcucul and libcaca into a kernel. + */ + +#include "config.h" + +#ifdef __KERNEL__ + +/* Our memory mapping */ +static uint32_t *freemem = (uint32_t*) 0x00200000; + +/* Multiboot kernel entry point */ +void cmain(unsigned long int magic, unsigned long int addr) +{ + char *argv[] = { NULL }; + int argc = 0; + main(argc, argv); +} + +/* stdlib.h functions */ +void *malloc(size_t size) +{ + uint32_t *p = freemem; + size = (size + 0x7) / 4; + *p = size; + freemem += size + 1; + return p + 1; +} + +void free(void *ptr) +{ + return; +} + +void *realloc(void *ptr, size_t size) +{ + uint32_t oldsize = ((uint32_t *)ptr)[-1]; + void *p; + if(oldsize >= size) + return ptr; + + p = malloc(size); + memcpy(p, ptr, oldsize); + return p; +} + +char *getenv(const char *name) +{ + return NULL; +} + +int rand(void) +{ + static int seed = 0x68743284; + seed = (seed * 0x7f32ba17) ^ 0xf893a735; + return seed % RAND_MAX; +} + +int abs(int j) +{ + if(j < 0) + return -j; + return j; +} + +void exit(int status) +{ + /* FIXME: reboot? */ + while(1); +} + +/* string.h functions */ +void *memset(void *s, int c, size_t n) +{ + uint8_t *ptr = s; + + while(n--) + *ptr++ = c; + + return s; +} + +void *memcpy(void *dest, const void *src, size_t n) +{ + uint8_t *destptr = dest; + uint8_t const *srcptr = src; + + while(n--) + *destptr++ = *srcptr++; + + return dest; +} + +size_t strlen(const char *s) +{ + int len = 0; + + while(*s++) + len++; + + return len; +} + +int strcasecmp(const char *s1, const char *s2) +{ + /* FIXME */ + return -1; +} + +/* stdarg.h functions */ +int vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + /* FIXME */ + return 0; +} + +/* stdio.h functions */ +FILE *fopen(const char *path, const char *mode) +{ + /* FIXME */ + return NULL; +} + +int feof(FILE *stream) +{ + /* FIXME */ + return 0; +} + +char *fgets(char *s, int size, FILE *stream) +{ + /* FIXME */ + return NULL; +} + +int fclose(FILE *fp) +{ + /* FIXME */ + return 0; +} + +int printf(const char *format, ...) +{ + /* FIXME */ + return 0; +} + +int sprintf(char *str, const char *format, ...) +{ + /* FIXME */ + return 0; +} + +int sscanf(const char *str, const char *format, ...) +{ + /* FIXME */ + return 0; +} + +/* unistd.h functions */ +void usleep(unsigned long usec) +{ + /* FIXME */ + return; +} + +/* time.h functions */ +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + static int usec = 0; + static int sec = 0; + + /* FIXME */ + usec += 10000; + if(usec > 1000000) + { + sec++; + usec -= 1000000; + } + + tv->tv_sec = sec; + tv->tv_usec = usec; + + return 0; +} + +#endif /* __KERNEL__ */ diff --git a/kernel/kernel.h b/kernel/kernel.h new file mode 100644 index 0000000..3f690c2 --- /dev/null +++ b/kernel/kernel.h @@ -0,0 +1,95 @@ +/* + * libcucul Unicode canvas library + * libcaca ASCII-Art library + * Copyright (c) 2006 Sam Hocevar + * All Rights Reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the Do What The Fuck You Want To + * Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/** \file kernel.h + * \version \$Id$ + * \author Sam Hocevar + * \brief Kernel features + * + * This file contains replacement functions for the standard C library + * that must be used when building libcucul and libcaca into a kernel. + */ + +/* Various defines */ +#define NULL ((void *)0) +#define BUFSIZ 4096 +#define RAND_MAX ((unsigned int)0x8000000) +#define INT_MAX ((int)0x7fffffff) +#define __BYTE_ORDER 1 +#define __BIG_ENDIAN 2 + +/* Various typedefs -- some are x86-specific */ +#define CUSTOM_INTTYPES +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned int uintptr_t; + +typedef unsigned int size_t; + +typedef struct file +{ + void *mem; +} FILE; + +struct timeval { + int tv_sec; + int tv_usec; +}; + +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; + +/* Multiboot kernel entry point */ +void cmain(unsigned long int magic, unsigned long int addr); + +/* The application's entry point */ +int main(int argc, char *argv[]); + +/* stdlib.h functions */ +void *malloc(size_t size); +void free(void *ptr); +void *realloc(void *ptr, size_t size); +char *getenv(const char *name); +int rand(void); +int abs(int j); +void exit(int status); + +/* string.h functions */ +void *memset(void *s, int c, size_t n); +void *memcpy(void *dest, const void *src, size_t n); +size_t strlen(const char *s); +int strcasecmp(const char *s1, const char *s2); + +/* stdarg.h functions */ +typedef void * va_list; +#define va_start(v,a) v = (void *)((uintptr_t)(&a) + sizeof(a)) +#define va_end(v) +int vsnprintf(char *str, size_t size, const char *format, va_list ap); + +/* stdio.h functions */ +FILE *fopen(const char *path, const char *mode); +int feof(FILE *stream); +char *fgets(char *s, int size, FILE *stream); +int fclose(FILE *fp); +int printf(const char *format, ...); +int sprintf(char *str, const char *format, ...); +int sscanf(const char *str, const char *format, ...); + +/* unistd.h functions */ +void usleep(unsigned long usec); + +/* time.h functions */ +int gettimeofday(struct timeval *tv, struct timezone *tz); + diff --git a/kernel/multiboot.S b/kernel/multiboot.S new file mode 100644 index 0000000..d0a4fea --- /dev/null +++ b/kernel/multiboot.S @@ -0,0 +1,73 @@ +/* boot.S - bootstrap the kernel */ +/* Copyright (C) 1999 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. */ + +#define ASM 1 +#include + + .text + + .code32 + .globl start, _start + + /* This entry is not used actually. */ +start: +_start: + jmp multiboot_entry + + /* Align 32 bits boundary. */ + .align 4 + + /* Multiboot header. */ +multiboot_header: + /* magic */ + .long MULTIBOOT_HEADER_MAGIC + /* flags */ + .long MULTIBOOT_HEADER_FLAGS + /* checksum */ + .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) + /* header_addr */ + .long multiboot_header + /* load_addr */ + .long _start + /* load_end_addr */ + .long _edata + /* bss_end_addr */ + .long _end + /* entry_addr */ + .long multiboot_entry + +multiboot_entry: + /* Initialize the stack pointer. */ + movl $(stack + STACK_SIZE), %esp + + /* Reset EFLAGS. */ + pushl $0 + popf + + /* Push the pointer to the Multiboot information structure. */ + pushl %ebx + /* Push the magic value. */ + pushl %eax + + /* Now enter the C main function... */ + call EXT_C(cmain) + +loop: hlt + jmp loop + + /* Our stack area. */ + .comm stack, STACK_SIZE diff --git a/kernel/multiboot.h b/kernel/multiboot.h new file mode 100644 index 0000000..f8afac9 --- /dev/null +++ b/kernel/multiboot.h @@ -0,0 +1,115 @@ +/* multiboot.h - the header for Multiboot */ +/* Copyright (C) 1999 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. */ + +/* Macros. */ + +/* The magic number for the Multiboot header. */ +#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 + +/* The flags for the Multiboot header. */ +#define MULTIBOOT_HEADER_FLAGS 0x00010003 + +/* The magic number passed by a Multiboot-compliant boot loader. */ +#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 + +/* The size of our stack (16KB). */ +#define STACK_SIZE 0x4000 + +/* C symbol format. HAVE_ASM_USCORE is defined by configure. */ +#ifdef HAVE_ASM_USCORE +# define EXT_C(sym) _ ## sym +#else +# define EXT_C(sym) sym +#endif + +#ifndef ASM +/* Do not include here in boot.S. */ + +/* Types. */ + +/* The Multiboot header. */ +typedef struct multiboot_header +{ + unsigned long magic; + unsigned long flags; + unsigned long checksum; + unsigned long header_addr; + unsigned long load_addr; + unsigned long load_end_addr; + unsigned long bss_end_addr; + unsigned long entry_addr; +} multiboot_header_t; + +/* The symbol table for a.out. */ +typedef struct aout_symbol_table +{ + unsigned long tabsize; + unsigned long strsize; + unsigned long addr; + unsigned long reserved; +} aout_symbol_table_t; + +/* The section header table for ELF. */ +typedef struct elf_section_header_table +{ + unsigned long num; + unsigned long size; + unsigned long addr; + unsigned long shndx; +} elf_section_header_table_t; + +/* The Multiboot information. */ +typedef struct multiboot_info +{ + unsigned long flags; + unsigned long mem_lower; + unsigned long mem_upper; + unsigned long boot_device; + unsigned long cmdline; + unsigned long mods_count; + unsigned long mods_addr; + union + { + aout_symbol_table_t aout_sym; + elf_section_header_table_t elf_sec; + } u; + unsigned long mmap_length; + unsigned long mmap_addr; +} multiboot_info_t; + +/* The module structure. */ +typedef struct module +{ + unsigned long mod_start; + unsigned long mod_end; + unsigned long string; + unsigned long reserved; +} module_t; + +/* The memory map. Be careful that the offset 0 is base_addr_low + but no size. */ +typedef struct memory_map +{ + unsigned long size; + unsigned long base_addr_low; + unsigned long base_addr_high; + unsigned long length_low; + unsigned long length_high; + unsigned long type; +} memory_map_t; + +#endif /* ! ASM */ diff --git a/src/aafire.c b/src/aafire.c index 6a62ce1..edf3b7b 100644 --- a/src/aafire.c +++ b/src/aafire.c @@ -24,9 +24,11 @@ #ifdef LIBCACA #include "config.h" -#include -#include -#include +#if !defined(__KERNEL__) +# include +# include +# include +#endif #include "caca.h" #else #include