From 7841d71656fec99b029832ddb319e972fd64ac4f Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Thu, 20 Dec 2018 18:03:39 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20code=20du=20kernel,=20bootloader?= =?UTF-8?q?=20non=20termin=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CONTACT | 1 + src/COPYING | 675 ++++++++++++++++++++++++++++++++ src/ChangeLog | 17 + src/ChangeLog~ | 17 + src/Makefile | 126 ++++++ src/Makefile~ | 109 ++++++ src/boot/boot.asm~ | 0 src/boot/common.inc | 27 ++ src/boot/common.inc~ | 25 ++ src/boot/folder.desc | 23 ++ src/boot/loader.inc~ | 83 ++++ src/boot/loader.s | 303 ++++++++++++++ src/boot/loader.s~ | 372 ++++++++++++++++++ src/boot/mbr.inc | 88 +++++ src/boot/mbr.inc~ | 26 ++ src/boot/mbr.s | 128 ++++++ src/boot/mbr.s~ | 198 ++++++++++ src/boot/pseudo_kern.c | 28 ++ src/boot/pseudo_kern.c~ | 10 + src/boot/pseudo_kernel.s~ | 13 + src/boot/pseudo_screen.c | 84 ++++ src/boot/pseudo_screen.c~ | 76 ++++ src/boot/types.h | 9 + src/boot/types.h~ | 0 src/kaleid/common/assert.h | 34 ++ src/kaleid/common/atomic.h | 20 + src/kaleid/common/common.h | 37 ++ src/kaleid/common/config.h | 31 ++ src/kaleid/common/config.h.in | 31 ++ src/kaleid/common/lib/string.c | 31 ++ src/kaleid/common/status.h | 28 ++ src/kaleid/common/string.h | 19 + src/kaleid/common/types.h | 34 ++ src/kaleid/kernel/folder.desc | 44 +++ src/kaleid/kernel/init.c | 20 + src/kaleid/kernel/init.h | 20 + src/kaleid/kernel/io/ports.c | 13 + src/kaleid/kernel/io/ports.h | 21 + src/kaleid/kernel/io/terminal.c | 147 +++++++ src/kaleid/kernel/io/terminal.h | 43 ++ src/making.sh | 0 src/making.sh~ | 2 + src/neox.sh | 0 src/neox.sh~ | 12 + src/project-style.txt | 19 + src/project-tree.txt | 53 +++ src/script.sh | 4 + src/script.sh~ | 4 + 48 files changed, 3105 insertions(+) create mode 100644 src/CONTACT create mode 100644 src/COPYING create mode 100644 src/ChangeLog create mode 100644 src/ChangeLog~ create mode 100644 src/Makefile create mode 100644 src/Makefile~ create mode 100644 src/boot/boot.asm~ create mode 100644 src/boot/common.inc create mode 100644 src/boot/common.inc~ create mode 100644 src/boot/folder.desc create mode 100644 src/boot/loader.inc~ create mode 100644 src/boot/loader.s create mode 100644 src/boot/loader.s~ create mode 100644 src/boot/mbr.inc create mode 100644 src/boot/mbr.inc~ create mode 100644 src/boot/mbr.s create mode 100644 src/boot/mbr.s~ create mode 100644 src/boot/pseudo_kern.c create mode 100644 src/boot/pseudo_kern.c~ create mode 100644 src/boot/pseudo_kernel.s~ create mode 100644 src/boot/pseudo_screen.c create mode 100644 src/boot/pseudo_screen.c~ create mode 100644 src/boot/types.h create mode 100644 src/boot/types.h~ create mode 100644 src/kaleid/common/assert.h create mode 100644 src/kaleid/common/atomic.h create mode 100644 src/kaleid/common/common.h create mode 100644 src/kaleid/common/config.h create mode 100644 src/kaleid/common/config.h.in create mode 100644 src/kaleid/common/lib/string.c create mode 100644 src/kaleid/common/status.h create mode 100644 src/kaleid/common/string.h create mode 100644 src/kaleid/common/types.h create mode 100644 src/kaleid/kernel/folder.desc create mode 100644 src/kaleid/kernel/init.c create mode 100644 src/kaleid/kernel/init.h create mode 100644 src/kaleid/kernel/io/ports.c create mode 100644 src/kaleid/kernel/io/ports.h create mode 100644 src/kaleid/kernel/io/terminal.c create mode 100644 src/kaleid/kernel/io/terminal.h create mode 100644 src/making.sh create mode 100644 src/making.sh~ create mode 100644 src/neox.sh create mode 100644 src/neox.sh~ create mode 100644 src/project-style.txt create mode 100644 src/project-tree.txt create mode 100644 src/script.sh create mode 100644 src/script.sh~ diff --git a/src/CONTACT b/src/CONTACT new file mode 100644 index 0000000..dd6d86a --- /dev/null +++ b/src/CONTACT @@ -0,0 +1 @@ +XXX diff --git a/src/COPYING b/src/COPYING new file mode 100644 index 0000000..53d1f3d --- /dev/null +++ b/src/COPYING @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. + diff --git a/src/ChangeLog b/src/ChangeLog new file mode 100644 index 0000000..0f5b213 --- /dev/null +++ b/src/ChangeLog @@ -0,0 +1,17 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: ChangeLog #1 // +// From: 2018/12/06 // +// UpTo: current // +//----------------------------------------------------------------------------// + +2018/10/?? - Started talking about making our own OS +2018/11/?? - Name decided & creation of gnu-os-k.eu +2018/12/06 - Actually started project, began MBR, decided directories organization, created this file and others +2018/12/08 - MBR actually supports Long Mode Compatibility Verification + - Added A20 line Enabling to MBR + diff --git a/src/ChangeLog~ b/src/ChangeLog~ new file mode 100644 index 0000000..0f5b213 --- /dev/null +++ b/src/ChangeLog~ @@ -0,0 +1,17 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: ChangeLog #1 // +// From: 2018/12/06 // +// UpTo: current // +//----------------------------------------------------------------------------// + +2018/10/?? - Started talking about making our own OS +2018/11/?? - Name decided & creation of gnu-os-k.eu +2018/12/06 - Actually started project, began MBR, decided directories organization, created this file and others +2018/12/08 - MBR actually supports Long Mode Compatibility Verification + - Added A20 line Enabling to MBR + diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..d77faca --- /dev/null +++ b/src/Makefile @@ -0,0 +1,126 @@ +#----------------------------------------------------------------------------# +# GNU GPL OS/K # +# # +# Authors: spectral` # +# NeoX # +# # +# Desc: Project Makefile # +#----------------------------------------------------------------------------# + +CC_NAME="/opt/cross-cc/bin/x86_64-elf-gcc" +CWARNS=-Wall -Wextra -Werror +CFLAGS=-nostdlib -ffreestanding -mcmodel=large -mno-red-zone -mno-mmx -mno-sse -mno-sse2 +CINCLUDES=-I./kaleid +CDEFINES= + +CC=$(CC_NAME) $(CWARNS) $(CFLAGS) $(CDEFINES) $(CINCLUDES) + +ASM=nasm +ASMFLAGS= +BOOTFLAGS=-f bin + +BINDIR=../bin +OBJDIR=../obj + +BOOTDIR=boot +COMMDIR=kaleid/common +KERNDIR=kaleid/kernel +SYSTDIR=kaleid/system + +all: bootloader + +boot.mbr.s: $(BOOTDIR)/mbr.s $(BOOTDIR)/mbr.inc + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/mbr.s -o $(OBJDIR)/boot/mbr.bin + +boot.loader.s: $(BOOTDIR)/loader.s + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/loader.s -o $(OBJDIR)/boot/loader.bin + +bootloader: boot.mbr.s boot.loader.s + cat $(OBJDIR)/boot/mbr.bin $(OBJDIR)/boot/loader.bin > $(BINDIR)/bootloader.bin + +#----------------------------------------------------------------------------# +# TESTING MAKEFILE + +pseudo_kern: + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/pseudo_kernel.s -o $(OBJDIR)/boot/pkernel.bin + +testing: bootloader pseudo_kern + cat $(BINDIR)/bootloader.bin $(OBJDIR)/boot/pkernel.bin > $(BINDIR)/boot.bin + +#----------------------------------------------------------------------------# +# COMMON MAKEFILE + +COBJDIR=$(OBJDIR)/$(COMMDIR) + +COMM_DEPS=$(COMMDIR)/common.h $(COMMDIR)/assert.h $(COMMDIR)/atomic.h $(COMMDIR)/config.h \ + $(COMMDIR)/status.h + +COBJECTS=$(COBJDIR)/lib/string.o + +common: common.lib.string.c $(COMM_DEPS) + +common.lib.string.c: $(COMMDIR)/lib/string.c $(COMM_DEPS) + $(CC) -c $(COMMDIR)/lib/string.c -o $(OBJDIR)/$(COMMDIR)/lib/string.o + +#----------------------------------------------------------------------------# +# KERNEL MAKEFILE + +KOBJDIR=$(OBJDIR)/$(KERNDIR) + +KERN_DEPS=$(COMM_DEPS) $(KERNDIR)/init.h $(KERNDIR)/io/terminal.h $(KERNDIR)/io/ports.h + +kernel: common kernel.io.terminal.c kernel.init.c kernel.io.ports.c + $(CC) -o $(BINDIR)/kaleid-kernel.elf \ + $(COBJECTS) $(KOBJDIR)/init.o \ + $(KOBJDIR)/io/terminal.o $(KOBJDIR)/io/ports.o + + +kernel.init.c: $(KERNDIR)/init.c $(KERN_DEPS) + $(CC) -c $(KERNDIR)/init.c -o $(KOBJDIR)/init.o + +kernel.io.ports.c: $(KERNDIR)/io/ports.c $(KERN_DEPS) + $(CC) -c $(KERNDIR)/io/ports.c -o $(KOBJDIR)/io/ports.o + +kernel.io.terminal.c: $(KERNDIR)/io/terminal.c $(KERN_DEPS) + $(CC) -c $(KERNDIR)/io/terminal.c -o $(KOBJDIR)/io/terminal.o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Makefile~ b/src/Makefile~ new file mode 100644 index 0000000..032c57b --- /dev/null +++ b/src/Makefile~ @@ -0,0 +1,109 @@ +#----------------------------------------------------------------------------# +# GNU GPL OS/K # +# # +# Authors: spectral` # +# NeoX # +# # +# Desc: Project Makefile # +#----------------------------------------------------------------------------# + +CC_NAME="../toolchains/x86_64-elf-7.3.0-Linux-x86_64/bin/x86_64-elf-gcc" +CWARNS=-Wall -Wextra -Werr +CFLAGS=-nostdlib -ffreestanding -mcmodel=large -mno-red-zone -mno-mmx -mno-sse -mno-sse2 +CDEFINES=-DNDEBUG +CINCLUDES=-I./kaleid + +CC=$(CC_NAME) $(CWARNS) $(CFLAGS) $(CDEFINES) $(CINCLUDES) + +ASM=nasm +ASMFLAGS= +BOOTFLAGS=-f bin + +BINDIR=../bin +OBJDIR=../obj + +BOOTDIR=boot +COMMDIR=kaleid/common +KERNDIR=kaleid/kernel +SYSTDIR=kaleid/system + +all: bootloader + +boot.mbr.s: $(BOOTDIR)/mbr.s + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/mbr.s -o $(OBJDIR)/boot/mbr.bin + +boot.loader.s: $(BOOTDIR)/loader.s + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/loader.s -o $(OBJDIR)/boot/loader.bin + +bootloader: boot.mbr.s boot.loader.s + dd if=/dev/zero of=$(BINDIR)/disk.img bs=1024 count=0 seek=1048576 + su -c "mkfs.vfat $(BINDIR)/disk.img -F 32 -r 112 -S 512 -v" + dd if=$(OBJDIR)/boot/mbr.bin of=$(BINDIR)/disk.img count=1 + su -c "mkdir /mnt/disk && mount -o loop $(BINDIR)/disk.img /mnt/disk" + cp $(OBJDIR)/boot/loader.bin /mnt/disk/loader.bin + +#----------------------------------------------------------------------------# +# TESTING MAKEFILE + +pseudo_kern: + $(ASM) $(BOOTFLAGS) $(BOOTDIR)/pseudo_kernel.s -o $(OBJDIR)/boot/pkernel.bin + +testing: bootloader pseudo_kern + cat $(BINDIR)/bootloader.bin $(OBJDIR)/boot/pkernel.bin > $(BINDIR)/boot.bin + +#----------------------------------------------------------------------------# +# COMMON MAKEFILE + +COMM_DEPS=$(COMMDIR)/common.h $(COMMDIR)/assert.h $(COMMDIR)/atomic.h $(COMMDIR)/config.h \ + $(COMMDIR)/status.h $(COMMDIR)/string.h $(COMMDIR)/types.h + +common.lib.string.c: $(COMMDIR)/lib/string.c $(COMM_DEPS) + $(CC) -c $(COMMDIR)/lib/string.c -o ../obj/$(COMMDIR)/lib/string.o + +#----------------------------------------------------------------------------# +# KERNEL MAKEFILE + +KERN_DEPS=$(COMM_DEPS) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/boot/boot.asm~ b/src/boot/boot.asm~ new file mode 100644 index 0000000..e69de29 diff --git a/src/boot/common.inc b/src/boot/common.inc new file mode 100644 index 0000000..fbd5616 --- /dev/null +++ b/src/boot/common.inc @@ -0,0 +1,27 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Functions for the OS/K loaders ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +;-------------------------------------------------------------------; +; Prints the (null-terminated) string at address @es:@si ; +;-------------------------------------------------------------------; +PrintB: + pushad ; saving context +.pLoop: + lodsb ; loads the character at @es:@si in @al + mov bh, 0x00 + mov bl, 0x07 + cmp al,0 + je .pEnd ; while @al, i.e. while we're not hitting '\0' + mov ah, 0x0E + int 0x10 ; print character @al in color @bl (BIOS interrupt) + jmp .pLoop +.pEnd: + popad ; restores context + ret diff --git a/src/boot/common.inc~ b/src/boot/common.inc~ new file mode 100644 index 0000000..e8f6c4c --- /dev/null +++ b/src/boot/common.inc~ @@ -0,0 +1,25 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Functions for the OS/K loaders ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +;-------------------------------------------------------------------; +; Prints the (null-terminated) string at address @es:@si ; +;-------------------------------------------------------------------; +PrintB: + pushad ; saving context +.pLoop: + lodsb ; loads the character at @es:@si in @al + cmp al,0 + je .pEnd ; while @al, i.e. while we're not hitting '\0' + mov ah, 0x0E + int 0x10 ; print character @al in color @bl (BIOS interrupt) + jmp .pLoop +.pEnd: + popad ; restores context + ret diff --git a/src/boot/folder.desc b/src/boot/folder.desc new file mode 100644 index 0000000..d6b3cab --- /dev/null +++ b/src/boot/folder.desc @@ -0,0 +1,23 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Folder description - "boot" // +//----------------------------------------------------------------------------// + + +This folder contains the source for OS/K's bootloader. +OS/K being intended to only run on x86-64 systems, we have not divided +this folder into one sub-folder per architecture. + +It is divided in two parts each of exactly 512 bytes: + - mbr.s (and its auxiliary file mbr.inc) + This is our Master Boot Record (MBR). It switches to long mode + (64 bits mode) then loads the second half of the bootloader. + The MBR must be placed precisely on the first sector of the hard drive. + + - loader.s + This is the Kernel Loader. XXX + diff --git a/src/boot/loader.inc~ b/src/boot/loader.inc~ new file mode 100644 index 0000000..fa5d73b --- /dev/null +++ b/src/boot/loader.inc~ @@ -0,0 +1,83 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Functions for the OS/K kernel loader ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +;-------------------------------------------------------------------; +; Setting the pages for long model ; +;-------------------------------------------------------------------; +[BITS 16] +PagingSetting: + ;clear tables + mov edi, 0x1000 + mov cr3, edi + xor eax, eax + mov ecx, 4096 + rep stosd + mov edi, cr3 + + ;set up new tables + mov DWORD [edi], 0x2003 + add edi, 0x1000 + mov DWORD [edi], 0x3003 + add edi, 0x1000 + mov DWORD [edi], 0x4003 + add edi, 0x1000 + + mov ebx, 0x00000003 + mov ecx, 512 + +.setEntry: + mov DWORD [edi], ebx + add ebx, 0x1000 + add edi, 8 + loop .setEntry + + ;enable PAE bit in CR4 + mov eax, cr4 + or eax, 1<<5 + mov cr4, eax + + ;switch from REAL MODE + ;set long mode bit + mov ecx, 0xc0000080 + rdmsr + or eax, 1<<8 + wrmsr + + ;enable paging + mov eax, cr0 + or eax, 1<<31 + mov cr0, eax + + ret + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/boot/loader.s b/src/boot/loader.s new file mode 100644 index 0000000..583cfeb --- /dev/null +++ b/src/boot/loader.s @@ -0,0 +1,303 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Kernel (second stage) Loader for OS/K ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +[ORG 0x1000] + +pop ax +mov [Bootdrv], ax +jmp main + +;; DATA +%define TRAM 0x0B8000 ; [T]ext[RAM] +%define VRAM 0x0A0000 ; [V]ideo[RAM] +Bootdrv db 0x00 +VGA_HEIGHT dq 0 +VIDEO_MODE dw 0 + +;; GDT WITH DOC +GDT64: + NULL_SELECTOR: ;; null selector within 64 bits + dw GDT_LENGTH ; limit of GDT + dw GDT64 ; linear address of GDT + dd 0x0 + CODE_SELECTOR: ;; 32-bit code selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10011010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 11001111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + + DATA_SELECTOR: ;; flat data selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10010010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- expansion direction. 1 for a LIFO + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 10001111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + + LONG_SELECTOR: ;; 64-bit code selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10011010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 10101111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + GDT_LENGTH: + +[BITS 16] +disable_cursor: + pushf + push eax + push edx + + mov dx, 0x3D4 + mov al, 0xA ; low cursor shape register + out dx, al + + inc dx + mov al, 0x20 ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape + out dx, al + + pop edx + pop eax + popf + ret + +get_dimensions: + push eax + push ebx + mov ah, 0x0F + int 0x10 + mov [VGA_HEIGHT], ah + mov [VIDEO_MODE], al + pop ebx + pop eax + ret + +main: + ;; DISABLING CURSOR BLINKING AND GETTING INFOS + call get_dimensions + call disable_cursor + + ;;GO GDT64 + cli ; disable interrupts + lgdt [GDT64] + ;; ACTIVATE PROTECTED MODE + mov eax, cr0 + or al, 1b ; PE = 1 + mov cr0, eax + ;; DISABLE PAGING + mov eax, cr0 + and eax, 0x7FFFFFFF ; PG = 0 + ; |0|111111111111111111111111111111 + ; | + ; `------ Paging bit + mov cr0, eax + + push dword [VIDEO_MODE] + push dword [VGA_HEIGHT] + jmp (CODE_SELECTOR-GDT64):main32 + +[BITS 32] +VIDEO_MODE32 dw 0 +VGA_HEIGHT32 dw 0 + +main32: + pop dword [VGA_HEIGHT32] + pop dword [VIDEO_MODE32] + + ;; INITIALIZE PROTECTED MODE SEGMENT REGISTERS + mov ax, DATA_SELECTOR-GDT64 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + ;; ACTIVATE PHYSICAL ADRESS EXTENSION + mov eax, cr4 + or eax, 100000b ; PAE = 1 = 4 Mo / page. 0 = 4 Ko + mov cr4, eax + + ;;cleanup + mov edi, 0x70000 + mov ecx, 0x10000 + xor eax, eax + rep stosd + ;;formatting + mov dword [0x70000], 0x71000 + 7 ; first PDP table + mov dword [0x71000], 0x72000 + 7 ; first page directory + mov dword [0x72000], 0x73000 + 7 ; first page table + mov edi, 0x73000 ; address of first page table + mov eax, 7 + mov ecx, 256 ; number of pages to map (1 MB) +.make_page_entries: + stosd + add edi, 4 + add eax, 0x1000 + loop .make_page_entries + ;; pointing pml4 + mov eax, 0x70000 ; Bass address of PML4 + mov cr3, eax ; load page-map level-4 base + + ;; ACTIVATE LONG MODE + mov ecx, 0xC0000080 ; address of MSR + rdmsr ; read MSR + or eax, 100000000b ; LME = 1. (Long Mode Enable) + wrmsr ; write MSR + + ;; ACTIVATE PAGING + mov eax, cr0 + or eax, 0x80000000 ; make bit 31 (PG = Paging) to 1 : + ; |1|000000000000000000000000000000 + ; | + ; `------ Paging bit + mov cr0, eax + push dword 0 + push dword [VIDEO_MODE] + push dword 0 + push dword [VGA_HEIGHT] + jmp (LONG_SELECTOR-GDT64):main64 + +[BITS 64] +;; FUNCTIONS + +write: +;-----------------------------------------------------------------------; +; x64/LM Text Printing Functions ; +; bl : color code ; +; esi : string address ; +;-----------------------------------------------------------------------; + mov edi, [NextTRAM] ;TRAM ADDRESS + push rsi + push rdi +.pLoop: + lodsb + cmp al, 0 ; while @al, i.e. while we're not hitting '\0' + je .pEnd + cmp al, 0x0A ; LF + je .lf + cmp al, 0x0D ; CR + je .cr + stosb ; text subpixel + mov al, bl + stosb ; color subpixel + add qword [NextTRAM], 0x2 ; Cursor moving + add qword [VGA_X], 0x2 ; coord + 2 because 2 subpixels + jmp .pLoop +.pEnd: + pop rdi + pop rsi + ret +.lf: + mov rax, [VGA_HEIGHT64] + add [NextTRAM], rax ; Cursor moving + add [NextTRAM], rax + add edi, eax ; Address moving + add edi, eax + jmp .pLoop +.cr: + push rax + mov rax, qword [VGA_X] + sub qword [NextTRAM], rax ; pos = X + Y * VGA_HEIGHT64. Donc pos - X = début de ligne + sub edi, edx + mov qword [VGA_X], 0 + pop rax + jmp .pLoop +.scroll: + + jmp .pLoop + +;; DATA +txt db 0x09, " Switching to Long Mode... OK", 0x0A, 0x0D, 0 +NextTRAM dq 0x0B8AA0 ; Last position of cursor +VIDEO_MODE64 dq 0 +VGA_HEIGHT64 dq 0 +VGA_X dq 0x0 +msg db "The system is now in x64 mode. Is this not beautiful ?", 0x0A, 0x0D, 0 + +main64: + pop qword [VGA_HEIGHT64] + pop qword [VIDEO_MODE64] + ;; INITIALIZE STACK + mov rsp, 0x9F000 + + ;; NOTIFYING + mov bl, 0x0A + mov esi, txt + call write + + mov bl, 0x0B + mov esi, msg + call write + + mov bl, 0x0C + mov esi, msg + call write + + mov bl, 0x0D + mov esi, msg + call write + + mov bl, 0x0E + mov esi, msg + call write + + ;call KERNEL + jmp $ + +times 1024-($-$$) db 144 +KERNEL: diff --git a/src/boot/loader.s~ b/src/boot/loader.s~ new file mode 100644 index 0000000..97667aa --- /dev/null +++ b/src/boot/loader.s~ @@ -0,0 +1,372 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Kernel (second stage) Loader for OS/K ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +[ORG 0x1000] + +pop word [Bootdrv] +jmp main + +;; DATA +%define TRAM 0x0B8000 ; [T]ext[RAM] +%define VRAM 0x0A0000 ; [V]ideo[RAM] +Bootdrv db 0x00 +VGA_HEIGHT dq 0 +VIDEO_MODE dw 0 + +;; GDT WITH DOC +GDT64: + NULL_SELECTOR: ;; null selector within 64 bits + dw GDT_LENGTH ; limit of GDT + dw GDT64 ; linear address of GDT + dd 0x0 + CODE_SELECTOR: ;; 32-bit code selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10011010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 11001111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + + DATA_SELECTOR: ;; flat data selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10010010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- expansion direction. 1 for a LIFO + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 10001111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + + LONG_SELECTOR: ;; 64-bit code selector (ring 0) + dw 0x0FFFF ; Segment Limit 15:00 + db 0x0, 0x0, 0x0 ; Base Address 23:00 + db 10011010b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- 1 when segment used. + ; | | | | | | `------ 1 when writable. + ; | | | | | `------- 1 if "conformant". Don't know what is it... spectral ? xD + ; | | | | `-------- 1 always + ; | | | `--------- 1 for segment descriptor, 0 for system descriptor + ; | | `---------- DPL !!! 0 for ring 0 + ; | `----------- DPL (2/2) + ; `------------ 1 if in physical memory, 0 if page fault + db 10101111b ; |7|6|5|4|3|2|1|0| + ; | | | | | | | `----- Limit 16 + ; | | | | | | `------ Limit 17 + ; | | | | | `------- Limit 18 + ; | | | | `-------- Limit 19 + ; | | | `--------- available for use + ; | | `---------- 0 always + ; | `----------- size of data. 1 for 32bits + ; `------------ 0 if limit is in Bytes, 1 if it's in pages (4ko) + db 0x0 ; Base Address 31:24 + GDT_LENGTH: + +[BITS 16] +disable_cursor: + pushf + push eax + push edx + + mov dx, 0x3D4 + mov al, 0xA ; low cursor shape register + out dx, al + + inc dx + mov al, 0x20 ; bits 6-7 unused, bit 5 disables the cursor, bits 0-4 control the cursor shape + out dx, al + + pop edx + pop eax + popf + ret + +get_dimensions: + push eax + push ebx + mov ah, 0x0F + int 0x10 + mov [VGA_HEIGHT], ah + mov [VIDEO_MODE], al + pop ebx + pop eax + ret + +;-----------------------------------------------------------------------; +; Checks if the CPU is compatible with 64-bits operating systems ; +; If the 21th bit of the eax register is set, then CPUID is supported ; +; We then test CPUID's result to see if long mode is supported ; +;-----------------------------------------------------------------------; +Is64bits: + pushfd ; recovering the flags in eax + pop eax + mov ecx, eax + xor eax, 0x200000 + push eax + popfd + pushfd + pop eax + xor eax, ecx + shr eax, 21 + and eax, 1 ; magical spell of murta + push ecx + popfd + test eax, eax + jz .NonCompat ; if (CPUID non supporté) goto NonCompat + mov eax, 0x80000000 + cpuid + cmp eax, 0x80000001 + jb .NonCompat ; if (eax <= 0x80000001) goto NonCompat + mov eax, 0x80000001 + cpuid + test edx, 1 << 29 + jz .NonCompat ; if (edx != 1 << 29) goto NonCompat + ret ; back to mbr.s +.NonCompat: + stc + ret + +;; INCLUDES +%include "boot/common.inc" ; for PrintB + +main: + ;; compatibility check + mov si, Init + call PrintB + pop si + call Is64bits + jc ErrorNo64 + push si + mov si, Pass + call PrintB + + ;; enabling A20 + mov si, EnA20 + call PrintB + pop si + in al, 0x92 + or al, 2 + out 0x92, al + push si + mov si, Pass + call PrintB + + ;; DISABLING CURSOR BLINKING AND GETTING INFOS + call get_dimensions + call disable_cursor + + ;;GO GDT64 + cli ; disable interrupts + lgdt [GDT64] + ;; ACTIVATE PROTECTED MODE + mov eax, cr0 + or al, 1b ; PE = 1 + mov cr0, eax + ;; DISABLE PAGING + mov eax, cr0 + and eax, 0x7FFFFFFF ; PG = 0 + ; |0|111111111111111111111111111111 + ; | + ; `------ Paging bit + mov cr0, eax + + push dword [VIDEO_MODE] + push dword [VGA_HEIGHT] + jmp (CODE_SELECTOR-GDT64):main32 + +[BITS 32] +VIDEO_MODE32 dw 0 +VGA_HEIGHT32 dw 0 + +main32: + pop dword [VGA_HEIGHT32] + pop dword [VIDEO_MODE32] + + ;; INITIALIZE PROTECTED MODE SEGMENT REGISTERS + mov ax, DATA_SELECTOR-GDT64 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + + ;; ACTIVATE PHYSICAL ADRESS EXTENSION + mov eax, cr4 + or eax, 100000b ; PAE = 1 = 4 Mo / page. 0 = 4 Ko + mov cr4, eax + + ;;cleanup + mov edi, 0x70000 + mov ecx, 0x10000 + xor eax, eax + rep stosd + ;;formatting + mov dword [0x70000], 0x71000 + 7 ; first PDP table + mov dword [0x71000], 0x72000 + 7 ; first page directory + mov dword [0x72000], 0x73000 + 7 ; first page table + mov edi, 0x73000 ; address of first page table + mov eax, 7 + mov ecx, 256 ; number of pages to map (1 MB) +.make_page_entries: + stosd + add edi, 4 + add eax, 0x1000 + loop .make_page_entries + ;; pointing pml4 + mov eax, 0x70000 ; Bass address of PML4 + mov cr3, eax ; load page-map level-4 base + + ;; ACTIVATE LONG MODE + mov ecx, 0xC0000080 ; address of MSR + rdmsr ; read MSR + or eax, 100000000b ; LME = 1. (Long Mode Enable) + wrmsr ; write MSR + + ;; ACTIVATE PAGING + mov eax, cr0 + or eax, 0x80000000 ; make bit 31 (PG = Paging) to 1 : + ; |1|000000000000000000000000000000 + ; | + ; `------ Paging bit + mov cr0, eax + push dword 0 + push dword [VIDEO_MODE] + push dword 0 + push dword [VGA_HEIGHT] + jmp (LONG_SELECTOR-GDT64):main64 + +[BITS 64] +;; FUNCTIONS + +write: +;-----------------------------------------------------------------------; +; x64/LM Text Printing Functions ; +; bl : color code ; +; esi : string address ; +;-----------------------------------------------------------------------; + mov edi, [NextTRAM] ;TRAM ADDRESS + push rsi + push rdi +.pLoop: + lodsb + cmp al, 0 ; while @al, i.e. while we're not hitting '\0' + je .pEnd + cmp al, 0x0A ; LF + je .lf + cmp al, 0x0D ; CR + je .cr + stosb ; text subpixel + mov al, bl + stosb ; color subpixel + add qword [NextTRAM], 0x2 ; Cursor moving + add qword [VGA_X], 0x2 ; coord + 2 because 2 subpixels + jmp .pLoop +.pEnd: + pop rdi + pop rsi + ret +.lf: + mov rax, [VGA_HEIGHT64] + add [NextTRAM], rax ; Cursor moving + add [NextTRAM], rax + add edi, eax ; Address moving + add edi, eax + jmp .pLoop +.cr: + push rax + mov rax, qword [VGA_X] + sub qword [NextTRAM], rax ; pos = X + Y * VGA_HEIGHT64. Donc pos - X = début de ligne + sub edi, edx + mov qword [VGA_X], 0 + pop rax + jmp .pLoop +.scroll: + + jmp .pLoop + +;; DATA +txt db 0x09, " Switching to Long Mode... OK", 0x0A, 0x0D, 0 +Init db 0x09, " Checking CPUID", 0 +EnA20 db 0x09, " Enabling A20 line", 0 +Pass db " OK", 0x0A, 0x0D, 0 +NextTRAM dq 0x0B8AA0 ; Last position of cursor +VIDEO_MODE64 dq 0 +VGA_HEIGHT64 dq 0 +VGA_X dq 0x0 +msg db "The system is now in x64 mode. Is this not beautiful ?", 0x0A, 0x0D, 0 + +main64: + pop qword [VGA_HEIGHT64] + pop qword [VIDEO_MODE64] + ;; INITIALIZE STACK + mov rsp, 0x9F000 + + ;; NOTIFYING + mov bl, 0x0A + mov esi, txt + call write + + mov bl, 0x0B + mov esi, msg + call write + + mov bl, 0x0C + mov esi, msg + call write + + mov bl, 0x0D + mov esi, msg + call write + + mov bl, 0x0E + mov esi, msg + call write + + ;call KERNEL + jmp $ + +[BITS 16] +ErrorNo64: + mov si, NoLongMode + call PrintB +Die: + cli + hlt ; die nooooow + retf + +times 1024-($-$$) db 144 +KERNEL: diff --git a/src/boot/mbr.inc b/src/boot/mbr.inc new file mode 100644 index 0000000..a03437e --- /dev/null +++ b/src/boot/mbr.inc @@ -0,0 +1,88 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Functions for the OS/K mbr ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + + +;-----------------------------------------------------------------------; +; Checks if the CPU is compatible with 64-bits operating systems ; +; If the 21th bit of the eax register is set, then CPUID is supported ; +; We then test CPUID's result to see if long mode is supported ; +;-----------------------------------------------------------------------; +[BITS 16] +Is64bits: + pushfd ; recovering the flags in eax + pop eax + mov ecx, eax + xor eax, 0x200000 + push eax + popfd + + pushfd + pop eax + xor eax, ecx + shr eax, 21 + and eax, 1 ; magical spell of murta + push ecx + popfd + + test eax, eax + jz .NonCompat ; if (CPUID non supporté) goto NonCompat + + mov eax, 0x80000000 + cpuid + cmp eax, 0x80000001 + jb .NonCompat ; if (eax <= 0x80000001) goto NonCompat + + mov eax, 0x80000001 + cpuid + test edx, 1 << 29 + jz .NonCompat ; if (edx != 1 << 29) goto NonCompat + + ret ; back to mbr.s + +.NonCompat: + stc + ret + +;-------------------------------------------------------------------; +; loading second stage loader (loader.s) ; +;-------------------------------------------------------------------; +LoadSec: + + ;; prepare data for reading the disk + xor ax, ax + mov dl, [Bootdrv] + int 0x13 + + mov ax, SECOND_STAGE + mov es, ax + xor bx, bx + + mov ah, 2 ; ah = 2 = function read sectors from disk + mov al, 2 ; al = number of sectors to read (1 - 128) + xor ch, ch ; ch = track/cylinder number + mov cl, 2 ; sector number + xor dh, dh ; dh = head number + mov dl, [Bootdrv] + int 0x13 + jc .read_error + + ret + +.read_error: + popa + stc + ret + + + + + + + diff --git a/src/boot/mbr.inc~ b/src/boot/mbr.inc~ new file mode 100644 index 0000000..43e4d08 --- /dev/null +++ b/src/boot/mbr.inc~ @@ -0,0 +1,26 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Functions for the OS/K mbr ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + + +;-----------------------------------------------------------------------; +; Checks if the CPU is compatible with 64-bits operating systems ; +; If the 21th bit of the eax register is set, then CPUID is supported ; +; We then test CPUID's result to see if long mode is supported ; +;-----------------------------------------------------------------------; + + + + + + + + + + diff --git a/src/boot/mbr.s b/src/boot/mbr.s new file mode 100644 index 0000000..81098cb --- /dev/null +++ b/src/boot/mbr.s @@ -0,0 +1,128 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Master Boot Record for OS/K ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + + +[BITS 16] ; real mode +[ORG 0x7C00] ; address where the BIOS/UEFI CSM is loading us + + jmp 0x0000:Start ; far-jump to avoid loading address issues with older BIOSes + ; some older BIOSes could load bootloader.bin at 0x7C00:0x0000 + ; while newer ones would load it at 0x0000:0x7C00... + ; here the far-jump sets CS to 0 + +bootdb db 'GNUOS/K ' ;Fabricant + n°série Formatage +sizec dw 512 ;octet/secteur +db 1 ;secteur/cluster +reserv dw 1 ;secteur reserv‚ +nbfat db 2 ;nb de copie de la FAT +nbfit dw 224 ;taille rep racine +allclu dw 2880 ;nb secteur du volume si < 32 még +db 0F0h ;Descripteur de média +fatsize dw 9 ;secteur/FAT +nbtrack dw 18 ;secteur/piste +head dw 2 ;nb de tˆteb de lecture/écriture +hidden dd 0 ;nombre de secteur cach‚s +dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors +bootdrv db 0 ;Lecteur de d‚marrage +bootsig db 0 ;NA +db 29h ;boot signature 29h +bootsig2 dd 01020304h ;no de serie +pope db 'COS2000 ' ;nom de volume +db 'FAT12 ' ;FAT + +;; DATA +Bootdrv db 0x00 +Starting db 0x0A, 0x0D, 0x07, " GNU GPL OS/K ", 0x0A, 0x0D, 0x0A, 0x0D, 0 +NoLongMode db 0x0A, 0x0D, "ERROR: Your computer is not designed for x64 OS", 0 +A20ERR db 0x0A, 0x0D, "ERROR: Failed to enable A20 line!", 0 +SwErr db 0x0A, 0x0D, "ERROR: Loading failed!", 0 +Init db 0x09, " Checking CPUID", 0 +EnA20 db 0x09, " Enabling A20 line", 0 +Switch db 0x09, " Loading Second Stage", 0 +Pass db " OK", 0x0A, 0x0D, 0 + +%define SECOND_STAGE 0x100 +;; INCLUDES +%include "boot/mbr.inc" ; for Is64Bits +%include "boot/common.inc" ; for PrintB + +Start: + pushad + pushfd + pushf + mov [Bootdrv], dl ; dl contains the boot drive. Saving it. + + ;; hello world + push si + mov si, Starting + call PrintB + + ;; compatibility check + mov si, Init + call PrintB + pop si + + call Is64bits ; in mbr.inc + jc ErrorNo64 + + push si + mov si, Pass + call PrintB + + ;; enabling A20 + mov si, EnA20 + call PrintB + pop si + + in al, 0x92 + or al, 2 + out 0x92, al + jc A20Fail + + push si + mov si, Pass + call PrintB + + + ;; switch to second stage + mov si, Switch + call PrintB + pop si + ;; Reset floppy drive and load second stage + call LoadSec ; Loading from boot disk + jc SwFail + + popf + popfd + popad + mov ax, [Bootdrv] + push ax + jmp dword SECOND_STAGE:0000 ; Jumping to second stage loader. + ;;END OF MBR + +;;----------------------------------------------------------------------------;; +A20Fail: + mov si, A20ERR + call PrintB + jmp Die +SwFail: + mov si, SwErr + call PrintB + jmp Die +ErrorNo64: + mov si, NoLongMode + call PrintB +Die: + cli + hlt ; die nooooow + jmp Die +End: + times 510-($-$$) db 144 ; NOP until 510 + dw 0xAA55 ; magic word diff --git a/src/boot/mbr.s~ b/src/boot/mbr.s~ new file mode 100644 index 0000000..07d943c --- /dev/null +++ b/src/boot/mbr.s~ @@ -0,0 +1,198 @@ +;=----------------------------------------------------------------------------=; +; GNU GPL OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Master Boot Record for OS/K ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +%define SECOND_STAGE 0x100 + + +[BITS 16] ; real mode +[ORG 0x7C00] ; address where the BIOS/UEFI CSM is loading us + +jmp short Start + +;; File Allocation Table Disk Identifiers +nop +OEM_ID db "GPL OS/K" +BytesPerSector dw 0x0200 +SectorsPerCluster db 0x08 +ReservedSectors dw 0x0020 +TotalFATs db 0x02 +MaxRootEntries dw 0x0000 +NumberOfSectors dw 0x0000 +MediaDescriptor db 0xF8 +SectorsPerFAT dw 0x0000 +SectorsPerTrack dw 0x003D +SectorsPerHead dw 0x0002 +HiddenSectors dd 0x00000000 +TotalSectors dd 0x00FE3B1F +BigSectorsPerFAT dd 0x00000778 +Flags dw 0x0000 +FSVersion dw 0x0000 +RootDirectoryStart dd 0x00000002 +FSInfoSector dw 0x0001 +BackupBootSector dw 0x0006 + +TIMES 12 DB 0 ; going to the next offset + +DriveNumber db 0x00 +ReservedByte db 0x00 +Signature db 0x29 +VolumeID dd 0xFFFFFFFF +VolumeLabel db "OS/K BDISK " +SystemID db "FAT32 " + +Start: + ;; saving registers for future + pushad + pushfd + pushf + + ;; dl contains the boot drive. Saving it. + mov [Bootdrv], dl + + ;; hello world + push si + mov si, Starting + call PrintB + + ;; SWITCHING TO LOADER + mov si, Switch + call PrintB + pop si + mov cx, word [SectorsPerCluster] ; size of a cluster in sectors is stored in cx + + ; computing location of the begining of the Data area and store in ax + mov al, byte [TotalFATs] ; Total number of FATs + mul word [BigSectorsPerFAT] ; Number of sectors for a FAT + add ax, word [ReservedSectors] ; Find the start of the Data area + mov word [Datasector], ax ; Store the begining of the Data area + + ; reading 1st data cluster into memory (7C00:0200) + mov ax, word [RootDirectoryStart] + call ClusterLBA + mov bx, 0x0200 ; copy 1st data cluter above bootcode + call ReadSectors + + ; Point Index register to 1st File Entry + mov di, 0x0200 + 0x20 + ;Point to the offset where the file location information contains + mov dx, word [di + 0x001A] + mov word [Cluster], dx + ;Set up the segments where the loader needs to be loaded ;) + mov ax, 0100h ; set ES:BX = 0100:0000 + mov es, ax + xor bx, bx + + ;Read the cluster which contains the loader + mov cx, 0x0008 + mov ax, word [Cluster] + call ClusterLBA + call ReadSectors + + ;Jump to the location where the loader was loded + popf + popfd + popad + push word [Bootdrv] + call dword SECOND_STAGE:0000 + + ; Exiting + mov ah, 0x00 + int 0x19 ; warm boot computer + + ;;END OF MBR + +;;----------------------------------------------------------------------------;; +;; DATA +Starting db 0x0A, 0x0D, 0x07, "GNU GPL OS/K", 0x0A, 0x0D, 0x0A, 0x0D, 0 +Switch db 0x09, " Loading Second Stage", 0 +AbsoluteSector db 0x00 +AbsoluteHead db 0x00 +AbsoluteTrack db 0x00 +Cluster dw 0x0000 +Datasector dw 0x0000 + +Bootdrv db 0x00 + +;; INCLUDES +%include "boot/common.inc" ; for PrintB + +;; INTERNAL FUNCTIONS +;-------------------------------------------------------------------; +; loading second stage loader (loader.s) ; +;-------------------------------------------------------------------; +ReadSectors: +.main: + mov di, 0x0005 ; five retries for error +.sectorloop: + push ax + push bx + push cx + call LbaToChs + mov ah, 0x02 ; BIOS read sector + mov al, 0x01 ; read one sector + mov ch, BYTE [AbsoluteTrack] ; track + mov cl, BYTE [AbsoluteSector] ; sector + mov dh, BYTE [AbsoluteHead] ; head + int 0x13 ; invoke BIOS + jnc .success ; test for read error + xor ax, ax ; BIOS reset disk + int 0x13 ; invoke BIOS + dec di ; decrement error counter + pop cx + pop bx + pop ax + jnz .sectorloop ; attempt to read again + int 0x18 +.success: + pop cx + pop bx + pop ax + add bx, WORD [BytesPerSector] ; queue next buffer + inc ax ; queue next sector + loop .main ; read next sector + ret + +;-------------------------------------------------------------------; +; Converts LBA Adresses to CHS ; +;-------------------------------------------------------------------; +LbaToChs: + xor dx, dx ; prepare dx:ax for operation + div WORD [SectorsPerTrack] ; calculate + inc dl ; adjust for sector 0 + mov BYTE [AbsoluteSector], dl + xor dx, dx ; prepare dx:ax for operation + div WORD [SectorsPerHead] ; calculate + mov BYTE [AbsoluteHead], dl + mov BYTE [AbsoluteTrack], al + ret +;-------------------------------------------------------------------; +; Converts FAT Adresses to LBA ; +;-------------------------------------------------------------------; + ClusterLBA: + sub ax, 0x0002 ; zero base cluster number + xor cx, cx + mov cl, BYTE [SectorsPerCluster] ; convert byte to word + mul cx + add ax, WORD [Datasector] ; base data sector + ret + +;; Holes +SwFail: + jmp Die +ErrorNo64: + mov si, NoLongMode + call PrintB +Die: + cli + hlt ; die nooooow + jmp Die +End: + times 510-($-$$) db 144 ; NOP until 510 + dw 0xAA55 ; magic word diff --git a/src/boot/pseudo_kern.c b/src/boot/pseudo_kern.c new file mode 100644 index 0000000..ca7f3fc --- /dev/null +++ b/src/boot/pseudo_kern.c @@ -0,0 +1,28 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Kernel entry point // +//----------------------------------------------------------------------------// + +extern void scrollup(unsigned int); +extern void print(char *); + +extern kY; +extern kattr; + +void _start(void) +{ + kY = 18; + kattr = 0x5E; + print("un message\n"); + + kattr = 0x4E; + print("un autre message\n"); + + scrollup(2); + + while (1); +} diff --git a/src/boot/pseudo_kern.c~ b/src/boot/pseudo_kern.c~ new file mode 100644 index 0000000..d52dbd1 --- /dev/null +++ b/src/boot/pseudo_kern.c~ @@ -0,0 +1,10 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Kernel entry point // +//----------------------------------------------------------------------------// + + diff --git a/src/boot/pseudo_kernel.s~ b/src/boot/pseudo_kernel.s~ new file mode 100644 index 0000000..85dfb0a --- /dev/null +++ b/src/boot/pseudo_kernel.s~ @@ -0,0 +1,13 @@ +;=----------------------------------------------------------------------------=; +; GNU OS/K ; +; ; +; Authors: spectral` ; +; NeoX ; +; ; +; Desc: Pseudo kernel test for OS/K ; +; (x86_64 architecture only) ; +;=----------------------------------------------------------------------------=; + +[BITS 64] + +times 1024-($-$$) db 144 diff --git a/src/boot/pseudo_screen.c b/src/boot/pseudo_screen.c new file mode 100644 index 0000000..8df3ea7 --- /dev/null +++ b/src/boot/pseudo_screen.c @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Kernel screen func // +//----------------------------------------------------------------------------// +#include "types.h" + +#define RAMSCREEN 0xB8000 /* debut de la memoire video */ +#define SIZESCREEN 0xFA0 /* 4000, nombres d'octets d'une page texte */ +#define SCREENLIM 0xB8FA0 + +char kX = 0; /* position courante du curseur a l'ecran */ +char kY = 17; +char kattr = 0x0E; /* attributs video des caracteres a afficher */ + + +/* + * 'scrollup' scrolle l'ecran (la console mappee en ram) vers le haut + * de n lignes (de 0 a 25). + */ +void scrollup(unsigned int n) +{ + unsigned char *video, *tmp; + + for (video = (unsigned char *) RAMSCREEN; + video < (unsigned char *) SCREENLIM; video += 2) { + tmp = (unsigned char *) (video + n * 160); + + if (tmp < (unsigned char *) SCREENLIM) { + *video = *tmp; + *(video + 1) = *(tmp + 1); + } else { + *video = 0; + *(video + 1) = 0x07; + } + } + + kY -= n; + if (kY < 0) + kY = 0; +} + +void putcar(uchar c) +{ + unsigned char *video; + int i; + + if (c == 10) { /* CR-NL */ + kX = 0; + kY++; + } else if (c == 9) { /* TAB */ + kX = kX + 8 - (kX % 8); + } else if (c == 13) { /* CR */ + kX = 0; + } else { /* autres caracteres */ + video = (unsigned char *) (RAMSCREEN + 2 * kX + 160 * kY); + *video = c; + *(video + 1) = kattr; + + kX++; + if (kX > 79) { + kX = 0; + kY++; + } + } + + if (kY > 24) + scrollup(kY - 24); +} + +/* + * 'print' affiche a l'ecran, a la position courante du curseur, une chaine + * de caracteres terminee par \0. + */ +void print(char *string) +{ + while (*string != 0) { /* tant que le caractere est different de 0x0 */ + putcar(*string); + string++; + } +} diff --git a/src/boot/pseudo_screen.c~ b/src/boot/pseudo_screen.c~ new file mode 100644 index 0000000..c39927c --- /dev/null +++ b/src/boot/pseudo_screen.c~ @@ -0,0 +1,76 @@ +#include "types.h" + +#define RAMSCREEN 0xB8000 /* debut de la memoire video */ +#define SIZESCREEN 0xFA0 /* 4000, nombres d'octets d'une page texte */ +#define SCREENLIM 0xB8FA0 + +char kX = 0; /* position courante du curseur a l'ecran */ +char kY = 17; +char kattr = 0x0E; /* attributs video des caracteres a afficher */ + + +/* + * 'scrollup' scrolle l'ecran (la console mappee en ram) vers le haut + * de n lignes (de 0 a 25). + */ +void scrollup(unsigned int n) +{ + unsigned char *video, *tmp; + + for (video = (unsigned char *) RAMSCREEN; + video < (unsigned char *) SCREENLIM; video += 2) { + tmp = (unsigned char *) (video + n * 160); + + if (tmp < (unsigned char *) SCREENLIM) { + *video = *tmp; + *(video + 1) = *(tmp + 1); + } else { + *video = 0; + *(video + 1) = 0x07; + } + } + + kY -= n; + if (kY < 0) + kY = 0; +} + +void putcar(uchar c) +{ + unsigned char *video; + int i; + + if (c == 10) { /* CR-NL */ + kX = 0; + kY++; + } else if (c == 9) { /* TAB */ + kX = kX + 8 - (kX % 8); + } else if (c == 13) { /* CR */ + kX = 0; + } else { /* autres caracteres */ + video = (unsigned char *) (RAMSCREEN + 2 * kX + 160 * kY); + *video = c; + *(video + 1) = kattr; + + kX++; + if (kX > 79) { + kX = 0; + kY++; + } + } + + if (kY > 24) + scrollup(kY - 24); +} + +/* + * 'print' affiche a l'ecran, a la position courante du curseur, une chaine + * de caracteres terminee par \0. + */ +void print(char *string) +{ + while (*string != 0) { /* tant que le caractere est different de 0x0 */ + putcar(*string); + string++; + } +} diff --git a/src/boot/types.h b/src/boot/types.h new file mode 100644 index 0000000..71faf9b --- /dev/null +++ b/src/boot/types.h @@ -0,0 +1,9 @@ +#ifndef _I386_TYPE_ +#define _I386_TYPE_ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned char uchar; + +#endif diff --git a/src/boot/types.h~ b/src/boot/types.h~ new file mode 100644 index 0000000..e69de29 diff --git a/src/kaleid/common/assert.h b/src/kaleid/common/assert.h new file mode 100644 index 0000000..5bf73eb --- /dev/null +++ b/src/kaleid/common/assert.h @@ -0,0 +1,34 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Assertions // +//----------------------------------------------------------------------------// + +#ifndef __kaleid_assert_h +#define __kaleid_assert_h + +#if !defined(NDEBUG) + +extern const char *panicstr; +extern void panic(const char *) __dead; + +#define assert(x) do{if(!(x))panic(#x);}while(0); + +#define assert_never_used(x) do{static bool __anu_##x = FALSE; \ + assert(__anu_##x == FALSE); __anu_##x = TRUE;}while(0); + +#define assert_used_once(x) do{static bool __anu_##x; assert(__anu_##x == TRUE);} while(0); + +#else // NDEBUG + +#define assert(x) +#define assert_never_used(x) +#define assert_used_once(x) + +#endif // NDEBUG + +#endif + diff --git a/src/kaleid/common/atomic.h b/src/kaleid/common/atomic.h new file mode 100644 index 0000000..80dfe98 --- /dev/null +++ b/src/kaleid/common/atomic.h @@ -0,0 +1,20 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Atomic stuff // +//----------------------------------------------------------------------------// + +#ifndef __kaleid_atomic_h +#define __kaleid_atomic_h + +// atomic_t defined in common/types.h + +#define cli() // XXX +#define sti() // XXX +#define hlt() // XXX + +#endif + diff --git a/src/kaleid/common/common.h b/src/kaleid/common/common.h new file mode 100644 index 0000000..4f85241 --- /dev/null +++ b/src/kaleid/common/common.h @@ -0,0 +1,37 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Standard include file for both kernel/ and system/ // +//----------------------------------------------------------------------------// + + +#ifndef __kaleid_common_h +#define __kaleid_common_h + +#define true 1 +#define TRUE 1 +#define YES 1 + +#define false 0 +#define FALSE 0 +#define NO 0 + +#define NULL ((void*)0) + +#define PACKED __attribute__((packed)) +#define __dead __attribute__((noreturn)) + +#define THROWS(...) +#define ERRS(...) + +#include "common/types.h" +#include "common/config.h" +#include "common/atomic.h" +#include "common/status.h" +#include "common/assert.h" + +#endif + diff --git a/src/kaleid/common/config.h b/src/kaleid/common/config.h new file mode 100644 index 0000000..a31d87f --- /dev/null +++ b/src/kaleid/common/config.h @@ -0,0 +1,31 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Default configuration file // +//----------------------------------------------------------------------------// + +// XXX update the tree etc + +// This file is to be copied to "config.h" and edited before compilation +// We may do a script that generates "config.h" for the user, asking about +// the different configuration choices in the terminal. + +#ifndef __kaleid_config_h +#define __kaleid_config_h + +//------------------------------------------// +// General configuration choices // +//------------------------------------------// + +// Enable multiprocessor support? +// Right now this has to be left to NO +#define MULTIPROCESSOR NO + +// etc... +// this file is to be progressively filled + +#endif + diff --git a/src/kaleid/common/config.h.in b/src/kaleid/common/config.h.in new file mode 100644 index 0000000..a31d87f --- /dev/null +++ b/src/kaleid/common/config.h.in @@ -0,0 +1,31 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Default configuration file // +//----------------------------------------------------------------------------// + +// XXX update the tree etc + +// This file is to be copied to "config.h" and edited before compilation +// We may do a script that generates "config.h" for the user, asking about +// the different configuration choices in the terminal. + +#ifndef __kaleid_config_h +#define __kaleid_config_h + +//------------------------------------------// +// General configuration choices // +//------------------------------------------// + +// Enable multiprocessor support? +// Right now this has to be left to NO +#define MULTIPROCESSOR NO + +// etc... +// this file is to be progressively filled + +#endif + diff --git a/src/kaleid/common/lib/string.c b/src/kaleid/common/lib/string.c new file mode 100644 index 0000000..7f1d30b --- /dev/null +++ b/src/kaleid/common/lib/string.c @@ -0,0 +1,31 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: strlen() function // +//----------------------------------------------------------------------------// + +#include "common/string.h" + +// XXX several of these should be re-wrote in assembly + +size_t strlen(const char *s) +{ + size_t i; + + for (i = 0; s; s++, i++); + + return i; +} + +/*size_t wcslen(const wchar_t *s); +{ + int i; + + for (i = 0; s; s++, i++); + + return s; +}*/ + diff --git a/src/kaleid/common/status.h b/src/kaleid/common/status.h new file mode 100644 index 0000000..b445fec --- /dev/null +++ b/src/kaleid/common/status.h @@ -0,0 +1,28 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Values for status_t // +//----------------------------------------------------------------------------// + + +#ifndef __kaleid_status_h +#define __kaleid_status_h + +#define STATUS_FAILED(x) ((x) < 0)) +#define STATUS_SUCCESS(x) (!STATUS_FAILED(x)) + +#define SUCCESS (0) // everything went fine + +#define FAILED (-1) +#define ERROR FAILED // something went wrong, can't be more precise +#define NOT_PERMITTED (-2) +#define ACCESS_DENIED (-3) + +#define BAD_ARGUMENT (-4) // invalid arguments, can't be more precise +#define BAD_ARG_RANGE (-5) // arguments out of range + +#endif + diff --git a/src/kaleid/common/string.h b/src/kaleid/common/string.h new file mode 100644 index 0000000..d18053a --- /dev/null +++ b/src/kaleid/common/string.h @@ -0,0 +1,19 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Kaleid string library // +//----------------------------------------------------------------------------// + + +#ifndef __kaleid_string_h +#define __kaleid_string_h + +#include "common/common.h" + +size_t strlen(const char *s); + +#endif + diff --git a/src/kaleid/common/types.h b/src/kaleid/common/types.h new file mode 100644 index 0000000..a48d5b8 --- /dev/null +++ b/src/kaleid/common/types.h @@ -0,0 +1,34 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Essential types for Kaleid // +//----------------------------------------------------------------------------// + + +#ifndef __kaleid_types_h +#define __kaleid_types_h + +typedef _Bool bool; +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +typedef unsigned long ulong; +typedef long double ldouble; +typedef short status_t; +typedef short port_t; +typedef uint wchar_t; +typedef ulong size_t; +typedef long ssize_t; + + +// XXX +typedef int atomic_t; +typedef ulong pid_t; // etc... + +#endif + + + diff --git a/src/kaleid/kernel/folder.desc b/src/kaleid/kernel/folder.desc new file mode 100644 index 0000000..f035c37 --- /dev/null +++ b/src/kaleid/kernel/folder.desc @@ -0,0 +1,44 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Folder description - "kaleid/kernel" // +//----------------------------------------------------------------------------// + +This is the folder containing the source of Kaleid's kernel. + +It contains the following files: + - init.c + The file containing the entry point of Kaleid, the kstart() function + called from the bootloader (see ../../boot). + +This folder also has the following subfolders +(for more information on a particular subfolder, see {name}/folder.desc) + - mm/ + This folder contains all files related to memory management. + + - fs/ + This folder contains Kaleid's virtual filesystem, as well as one + subfolder for each FS supported by Kaleid (e.g. FAT filesystem). + + - io/ + I/O folder. (XXX) + + - ps/ + This folder contains Kaleid's process manager and scheduler, as well as the + implementation of the related syscalls and functions. + + - ex/ + This folder contains the exec()-related functions and syscalls, as well + as one subfolder per executable format supported by Kaleid (e.g. ELF executable) + + - se/ + Security folder. (XXX) + + - sys/ + Syscall folder. (XXX) + + + diff --git a/src/kaleid/kernel/init.c b/src/kaleid/kernel/init.c new file mode 100644 index 0000000..41e2efc --- /dev/null +++ b/src/kaleid/kernel/init.c @@ -0,0 +1,20 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Kernel entry point // +//----------------------------------------------------------------------------// + +#include "kernel/init.h" +#include "kernel/io/terminal.h" + +void _start(void) +{ + assert(strlen("test") == 4); + + kterm_init(); + kterm_print("Hello World!"); +} + diff --git a/src/kaleid/kernel/init.h b/src/kaleid/kernel/init.h new file mode 100644 index 0000000..c4677da --- /dev/null +++ b/src/kaleid/kernel/init.h @@ -0,0 +1,20 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Include file for init.c // +//----------------------------------------------------------------------------// + +#ifndef __kaleid_kernel_init_h +#define __kaleid_kernel_init_h + +#include "common/common.h" +#include "common/string.h" + +// kernel entry point +void kstart(void); + +#endif + diff --git a/src/kaleid/kernel/io/ports.c b/src/kaleid/kernel/io/ports.c new file mode 100644 index 0000000..fa824a0 --- /dev/null +++ b/src/kaleid/kernel/io/ports.c @@ -0,0 +1,13 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Ports I/O // +//----------------------------------------------------------------------------// + +#include "kernel/io/ports.h" + + + diff --git a/src/kaleid/kernel/io/ports.h b/src/kaleid/kernel/io/ports.h new file mode 100644 index 0000000..20d2908 --- /dev/null +++ b/src/kaleid/kernel/io/ports.h @@ -0,0 +1,21 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Ports I/O // +//----------------------------------------------------------------------------// + +#ifndef __kaleid_kernel_io_ports_h +#define __kaleid_kernel_io_ports_h + +#include "common/common.h" + +#define outb(port,val) asm volatile ("outb %1, %0" : : "dN" (port), "a" (value)) + +uchar inb(port_t port); +ushort inw(port_t port); + +#endif + diff --git a/src/kaleid/kernel/io/terminal.c b/src/kaleid/kernel/io/terminal.c new file mode 100644 index 0000000..7062819 --- /dev/null +++ b/src/kaleid/kernel/io/terminal.c @@ -0,0 +1,147 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Early terminal functions // +//----------------------------------------------------------------------------// + +#include "kernel/io/terminal.h" + +// VGA buffer size +static const size_t kterm_width = 80; +static const size_t kterm_height = 25; + +// position in the buffer +static size_t current_row; +static size_t current_col; + +static uchar current_color; + +// each buffer entry is composed of two bytes +// one is the color code, the other the character +static ushort *const buffer = (ushort *)0xB8000; + +#define ComputeColorCode(fg, bg) ((fg) | (bg) << 4) +#define ComputeEntryOffset(x, y) ((y) * kterm_width + (x)) +#define ComputeEntry(ch, cl) (((ushort)(ch)) | (ushort)(cl) << 8) + +void kterm_init(void) +{ + assert_never_used(kterm_init); + + kterm_change_color(ComputeColorCode(KTERM_COLOR_LIGHT_GREY, KTERM_COLOR_BLACK)); + kterm_clear(); +} + +void kterm_clear(void) +{ + size_t x, y; + + assert_used_once(kterm_init); + + for (x = 0; x < kterm_width; x++) { + for (y = 0; y < kterm_height; y++) { + const size_t offset = ComputeEntryOffset(x,y); + buffer[offset] = ComputeEntry(' ', current_color); + } + } + + // go back to beginning + current_row = current_col = 0; + + // XXX cursor update +} + +status_t kterm_change_color(uchar color) +{ + if (color > KTERM_COLOR_WHITE) + return BAD_ARG_RANGE; + + current_color = color; + + return SUCCESS; +} + +void kterm_putchar(char ch) +{ + int i; + size_t prev; + + assert_used_once(kterm_init); + + // carriage return takes us back to the beginning of the line + // no further test should be necessary + if (ch == '\r') { current_col = 0; return; } + + // line feed first takes us to the very end of the line + // later in this function we actually do the line feed + else if (ch == '\n') { current_col = kterm_width - 1; } + + // tabulations account for 4 spaces + else if (ch == '\t') { + prev = current_row; + // compiler will optimize this away + for (i = 0; i < 4; i++) { + // tabulations can't spread over two lines + if (current_row != prev) return; + + kterm_putchar(' '); + } + } + + // XXX check whether we were given a writable character + else { + const size_t offset = ComputeEntryOffset(current_col, current_row); + buffer[offset] = ComputeEntry(ch, current_color); + } + + // end of line? + if (++current_col == kterm_width) { + current_col = 0; + + // end of buffer? + if (++current_row == kterm_height) { + current_row = 0; + // XXX save previous buffer(?) and clear + } + } +} + +void kterm_print(const char *s) +{ + while (*s) { + kterm_putchar(*s); + s++; + } +} + +void panic(const char *s) +{ + cli(); + + panicstr = s; + + kterm_clear(); + + kterm_print("panic! - "); + kterm_print(s); + + while (1) hlt(); + + __builtin_unreachable(); +} + + + + + + + + + + + + + diff --git a/src/kaleid/kernel/io/terminal.h b/src/kaleid/kernel/io/terminal.h new file mode 100644 index 0000000..1ba775a --- /dev/null +++ b/src/kaleid/kernel/io/terminal.h @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Early terminal functions // +//----------------------------------------------------------------------------// + +#ifndef __kaleid_kernel_io_terminal_h +#define __kaleid_kernel_io_terminal_h + +#include "common/common.h" + +// all available colors +enum { + KTERM_COLOR_BLACK, + KTERM_COLOR_BLUE, + KTERM_COLOR_GREEN, + KTERM_COLOR_CYAN, + KTERM_COLOR_RED, + KTERM_COLOR_MAGENTA, + KTERM_COLOR_BROWN, + KTERM_COLOR_LIGHT_GREY, + KTERM_COLOR_DARK_GREY, + KTERM_COLOR_LIGHT_BLUE, + KTERM_COLOR_LIGHT_GREEN, + KTERM_COLOR_LIGHT_CYAN, + KTERM_COLOR_LIGHT_RED, + KTERM_COLOR_LIGHT_MAGENTA, + KTERM_COLOR_LIGHT_BROWN, + KTERM_COLOR_WHITE +}; + +void kterm_init(void); +void kterm_clear(void); +void kterm_putchar(char ch); +void kterm_print(const char *s); + +status_t kterm_change_color(uchar color) ERRS(BAD_ARG_RANGE); + +#endif + diff --git a/src/making.sh b/src/making.sh new file mode 100644 index 0000000..e69de29 diff --git a/src/making.sh~ b/src/making.sh~ new file mode 100644 index 0000000..75f1fff --- /dev/null +++ b/src/making.sh~ @@ -0,0 +1,2 @@ +make +dd if=/dev/zero of=../bin/disk.img bs=1024 count=0 seek=$[1024*1024] diff --git a/src/neox.sh b/src/neox.sh new file mode 100644 index 0000000..e69de29 diff --git a/src/neox.sh~ b/src/neox.sh~ new file mode 100644 index 0000000..9934e8f --- /dev/null +++ b/src/neox.sh~ @@ -0,0 +1,12 @@ +src = $PWD + +scp -Rv ./src/ "/home/neox/Documents/GNU OSK" +cd "/home/neox/Documents/GNU OSK/src/" +make +cd $src +scp -Rv "/home/neox/Documents/GNU OSK/obj" .. +scp -Rv "/home/neox/Documents/GNU OSK/bin" .. + + +qemu-system-x86_64 -drive file="/home/neox/Documents/GNU OSK/bin/bootloader.bin",index=0,media=disk,format=raw -boot a -d cpu_reset +qemu-system-i386 -drive file="/home/neox/Documents/GNU OSK/bin/bootloader.bin",index=0,media=disk,format=raw -boot a -no-reboot -no-shutdown -d cpu_reset diff --git a/src/project-style.txt b/src/project-style.txt new file mode 100644 index 0000000..4ed65ad --- /dev/null +++ b/src/project-style.txt @@ -0,0 +1,19 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Notes on the coding style and // +// conventions used throughout OS/K // +//----------------------------------------------------------------------------// + +To keep naming conventions and code style, we have decided to create this file. +How the code looks isn't the most important, so don't worry too much about this; +making the code conform to this file can be done later. + +Every file within OS/K is written using spaces for tabulation, with each +tabulation being 4 spaces long. + +(naming conventions here) + diff --git a/src/project-tree.txt b/src/project-tree.txt new file mode 100644 index 0000000..24c8e78 --- /dev/null +++ b/src/project-tree.txt @@ -0,0 +1,53 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Authors: spectral` // +// NeoX // +// // +// Desc: Project Tree // +//----------------------------------------------------------------------------// + +src/ + | + + boot/ + | | + | x folder.desc + | | + | - mbr.s + | - func.inc + | | + | - loader.s + | + + kaleid/ + | | + | + kernel/ + | | | + | | x folder.desc + | | | + | | - init.c + | | - init.h + | | | + | | + lib/ + | | | + | | + mm/ + | | | + | | + fs/ + | | | | + | | | + fat/ + | | | + ext2/ + | | | + | | + io/ + | | | + | | + ps/ + | | | + | | + ex/ + | | | | + | | | + aout + | | | + elf + | | | + | | + se/ + | | | + | | + sys/ + | | + | + system/ + 0 diff --git a/src/script.sh b/src/script.sh new file mode 100644 index 0000000..1ef10e1 --- /dev/null +++ b/src/script.sh @@ -0,0 +1,4 @@ +make +cp ../bin/bootloader.bin "~/Documents/GNU OSK/bin/bootloader.bin" +qemu-system-x86_64 -hda "~/Documents/GNU OSK/bin/bootloader.bin" +qemu-system-i386 -hda "~/Documents/GNU OSK/bin/bootloader.bin" diff --git a/src/script.sh~ b/src/script.sh~ new file mode 100644 index 0000000..832eec3 --- /dev/null +++ b/src/script.sh~ @@ -0,0 +1,4 @@ +make && cp ../bin/bootloader.bin "~/Documents/GNU OSK/bin/bootloader.bin" + +qemu-system-x86_64 -hda "~/Documents/GNU OSK/bin/bootloader.bin" +qemu-system-i386 -hda "~/Documents/GNU OSK/bin/bootloader.bin"