parent
6bcc9aef0e
commit
da4e1feaa5
@ -0,0 +1,280 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
@ -1,4 +1,180 @@
|
||||
Genode OS Framework
|
||||
|
||||
This is just the initial version without any code yet. We're on the
|
||||
way to migrate the current released version into Git.
|
||||
=================================
|
||||
Genode Operating System Framework
|
||||
=================================
|
||||
|
||||
|
||||
This is the source tree of the reference implementation of the Genode OS
|
||||
architecture. For a general overview about the architecture, please refer to
|
||||
the project's official website:
|
||||
|
||||
:Official project website for the Genode OS Framework:
|
||||
|
||||
[http://genode.org/documentation/general-overview]
|
||||
|
||||
The current implementation can be compiled for 8 different kernels: Linux,
|
||||
L4ka::Pistachio, L4/Fiasco, OKL4, NOVA, Fiasco.OC, Codezero, and a custom
|
||||
kernel for the MicroBlaze architecture. Whereas the Linux version serves us as
|
||||
development vehicle and enables us to rapidly develop the generic parts of the
|
||||
system, the actual target platforms of the framework are microkernels. There
|
||||
is no "perfect" microkernel - and neither should there be one. If a microkernel
|
||||
pretended to be fit for all use cases, it wouldn't be "micro". Hence, all
|
||||
microkernels differ in terms of their respective features, complexity, and
|
||||
supported hardware architectures.
|
||||
|
||||
Genode allows the use of each of the kernels listed above with a rich set of
|
||||
device drivers, protocol stacks, libraries, and applications in a uniform way.
|
||||
For developers, the framework provides an easy way to target multiple different
|
||||
kernels instead of tying the development to a particular kernel technology. For
|
||||
kernel developers, Genode contributes advanced workloads, stress-testing their
|
||||
kernel, and enabling a variety of application use cases that would not be
|
||||
possible otherwise. For users and system integrators, it enables the choice of
|
||||
the kernel that fits best with the requirements at hand for the particular
|
||||
usage scenario.
|
||||
|
||||
|
||||
Directory overview
|
||||
##################
|
||||
|
||||
The Genode source tree is composed of the following subdirectories:
|
||||
|
||||
:'doc':
|
||||
|
||||
This directory contains general documentation. Please consider the following
|
||||
document for a quick guide to get started with the framework:
|
||||
|
||||
! doc/getting_started.txt
|
||||
|
||||
If you are curious about the ready-to-use components that come with the
|
||||
framework, please review the components overview:
|
||||
|
||||
! doc/components.txt
|
||||
|
||||
:'base':
|
||||
|
||||
This directory contains the source-code repository of the fundamental
|
||||
frameworks and interfaces of Genode. Furthermore, it contains the generic
|
||||
parts of core.
|
||||
|
||||
:'os':
|
||||
|
||||
This directory contains the non-base OS components such as the init process,
|
||||
device drivers, and basic system services.
|
||||
|
||||
:'demo':
|
||||
|
||||
This directory contains the source-code repository of various services and
|
||||
applications that we use for demonstration purposes. For example, a graphical
|
||||
application launcher called Launchpad and the Scout tutorial browser.
|
||||
|
||||
:'base-<platform>':
|
||||
These directories contain platform-specific source-code repositories
|
||||
complementing the 'base' repository. The following platforms are supported:
|
||||
|
||||
:'linux':
|
||||
Linux kernel (both x86_32 and x86_64)
|
||||
|
||||
:'pistachio':
|
||||
L4ka::Pistachio kernel developed at University of Karlsruhe.
|
||||
See [http://genode.org/community/wiki/GenodeOnL4kaPistachio]
|
||||
|
||||
:'fiasco':
|
||||
L4/Fiasco kernel developed at University of Technology Dresden.
|
||||
See [http://genode.org/community/wiki/GenodeOnL4Fiasco]
|
||||
|
||||
:'foc':
|
||||
Fiasco.OC is a modernized version of the Fiasco microkernel with a
|
||||
completely revised kernel interface fostering capability-based
|
||||
security. It is not compatible with L4/Fiasco.
|
||||
See [http://genode.org/community/wiki/GenodeOnFiascoOC]
|
||||
|
||||
:'okl4':
|
||||
OKL4 kernel (x86_32 and ARM) developed at Open-Kernel-Labs.
|
||||
See [http://genode.org/community/wiki/GenodeOnOKL4]
|
||||
|
||||
:'nova':
|
||||
NOVA hypervisor developed at University of Technology Dresden
|
||||
See [http://genode.org/community/wiki/GenodeOnNOVA]
|
||||
|
||||
:'codezero':
|
||||
Codezero microkernel developed by B-Labs
|
||||
See [http://genode.org/community/wiki/GenodeOnCodezero]
|
||||
|
||||
:'mb':
|
||||
Support for running Genode natively on the MicroBlaze softcore CPU.
|
||||
See [http://genode.org/community/wiki/GenodeOnMicroBlaze]
|
||||
|
||||
:'host':
|
||||
Pseudo platform documenting the interface between the generic and
|
||||
platform-specific parts of the base framework. This is not a functional
|
||||
base platform.
|
||||
|
||||
:'tool':
|
||||
|
||||
Source-code management tools and scripts. Please refer to the README file
|
||||
contained in the directory.
|
||||
|
||||
:'hello_tutorial':
|
||||
|
||||
Tutorial for creating a simple client-server scenario with Genode. This
|
||||
repository includes documentation and the complete source code.
|
||||
|
||||
:'libports':
|
||||
|
||||
This source-code repository contains ports of popular open-source libraries
|
||||
to Genode, most importantly the C library. The repository contains no
|
||||
upstream source code but means to download the code and adapt it to Genode.
|
||||
For instructions about how to use this mechanism, please consult the README
|
||||
file at the top level of the repository.
|
||||
|
||||
:'linux_drivers':
|
||||
|
||||
This source-code repository contains the device driver environment for
|
||||
executing Linux device drivers natively on Genode.
|
||||
|
||||
:'dde_ipxe':
|
||||
|
||||
This source-code repository contains the device driver environment for
|
||||
executing drivers of the iPXE project.
|
||||
|
||||
:'qt4':
|
||||
|
||||
This source-code repository contains the Genode version of Qt4 framework.
|
||||
Please find more information about using Qt4 with Genode in the repository's
|
||||
'README' file.
|
||||
|
||||
:'ports':
|
||||
|
||||
This source-code repository hosts ports of 3rd-party applications to
|
||||
Genode. The repository does not contain upstream source code but provides
|
||||
a mechanism for downloading the official source distributions and adapt
|
||||
them to the Genode environment. The used mechanism is roughly the same
|
||||
as used for the 'libports' repository. Please consult 'libports/README'
|
||||
for further information.
|
||||
|
||||
:'ports-<platform>':
|
||||
|
||||
These platform-specific source-code repositories contain software that
|
||||
capitalizes special features of the respective kernel platform. I.e.,
|
||||
for the OKL4 base platform, a port of OKLinux is provided in 'ports-okl4'.
|
||||
For the Fiasco.OC platform, 'ports-foc' hosts a port of the L4Linux
|
||||
kernel. For further information, please refer to the README file at the
|
||||
top level of the respective repository.
|
||||
|
||||
:'gems':
|
||||
|
||||
This source-code repository contains Genode applications that use
|
||||
both native Genode interfaces as well as features of other high-level
|
||||
repositories, in particular shared libraries provided by 'libports'.
|
||||
|
||||
|
||||
Contact
|
||||
#######
|
||||
|
||||
The best way to get in touch with Genode developers and users is the project's
|
||||
mailing list. Please feel welcome to join in!
|
||||
|
||||
:Genode Mailing Lists:
|
||||
|
||||
[http://genode.org/community/mailing-lists]
|
||||
|
||||
|
@ -0,0 +1,44 @@
|
||||
#
|
||||
# \brief Download and prepare the Codezero kernel
|
||||
# \author Norman Feske
|
||||
# \date 2011-08-05
|
||||
#
|
||||
|
||||
VERBOSE ?= @
|
||||
ECHO = @echo
|
||||
GIT_URL = git://git.l4dev.org/codezero.git
|
||||
GIT_REV = 6fa4884a5a1cf6207372f69ae01e5faa6d5a39c8
|
||||
CONTRIB_DIR = contrib
|
||||
PATCHES = $(shell find patches -name *.patch)
|
||||
|
||||
#
|
||||
# Print help information by default
|
||||
#
|
||||
help::
|
||||
|
||||
prepare: $(CONTRIB_DIR)
|
||||
|
||||
help::
|
||||
$(ECHO)
|
||||
$(ECHO) "Check out upstream source code of the Codezero kernel"
|
||||
$(ECHO)
|
||||
$(ECHO) "The source code will be located at the '$(CONTRIB_DIR)/' directory."
|
||||
$(ECHO)
|
||||
$(ECHO) "--- available commands ---"
|
||||
$(ECHO) "prepare - checkout upstream source codes"
|
||||
$(ECHO) "clean - remove upstream source codes"
|
||||
$(ECHO)
|
||||
|
||||
$(CONTRIB_DIR)/.git:
|
||||
$(VERBOSE)git clone $(GIT_URL) $(CONTRIB_DIR)
|
||||
|
||||
$(CONTRIB_DIR): $(CONTRIB_DIR)/.git
|
||||
$(VERBOSE)cd $(CONTRIB_DIR); git reset --hard $(GIT_REV)
|
||||
$(ECHO) "applying patches to '$(CONTRIB_DIR)/'"
|
||||
$(VERBOSE)for i in $(PATCHES); do patch -d $@ -p1 < $$i; done
|
||||
|
||||
.PHONY: $(CONTRIB_DIR)
|
||||
|
||||
clean::
|
||||
$(VERBOSE)rm -rf $(CONTRIB_DIR)
|
||||
|
@ -0,0 +1,3 @@
|
||||
This repository contains the port of Genode to the Codezero microkernel
|
||||
For instructions about using Genode with Codezero, please refer to
|
||||
'doc/codezero.txt'.
|
@ -0,0 +1,240 @@
|
||||
#
|
||||
# Automatically generated, don't edit
|
||||
#
|
||||
# Generated on: furnace
|
||||
# At: Fri, 05 Aug 2011 21:48:00 +0000
|
||||
# Linux version 2.6.32-33-generic (buildd@rothera) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011
|
||||
|
||||
#
|
||||
# Codezero Microkernel Configurator
|
||||
#
|
||||
|
||||
#
|
||||
# Main architecture
|
||||
#
|
||||
CONFIG_ARCH_ARM=y
|
||||
|
||||
|
||||
#
|
||||
# ARM Architecture Configuration
|
||||
#
|
||||
|
||||
#
|
||||
# ARM Platform Type
|
||||
#
|
||||
CONFIG_PLATFORM_PB926=y
|
||||
CONFIG_PLATFORM_PBA9=n
|
||||
CONFIG_PLATFORM_BEAGLE=n
|
||||
CONFIG_PLATFORM_EB=n
|
||||
|
||||
|
||||
#
|
||||
# ARM Processor Type
|
||||
#
|
||||
CONFIG_CPU_ARM926=y
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Generic Processor Properties
|
||||
#
|
||||
CONFIG_ICACHE_DISABLE=n
|
||||
CONFIG_DCACHE_DISABLE=n
|
||||
|
||||
|
||||
#
|
||||
# Generic Kernel Properties
|
||||
#
|
||||
CONFIG_PREEMPT_DISABLE=n
|
||||
CONFIG_DEBUG_ACCOUNTING=n
|
||||
CONFIG_DEBUG_SPINLOCKS=n
|
||||
CONFIG_SCHED_TICKS=1000
|
||||
|
||||
|
||||
#
|
||||
# Toolchain Prefix
|
||||
#
|
||||
CONFIG_TOOLCHAIN_USERSPACE="arm-none-linux-gnueabi-"
|
||||
CONFIG_TOOLCHAIN_KERNEL="arm-none-eabi-"
|
||||
|
||||
|
||||
#
|
||||
# Container Setup
|
||||
#
|
||||
CONFIG_CAPABILITIES=n
|
||||
CONFIG_CONTAINERS=1
|
||||
|
||||
#
|
||||
# Container 0 Parameters
|
||||
#
|
||||
|
||||
#
|
||||
# Container 0 Type
|
||||
#
|
||||
CONFIG_CONT0_TYPE_BAREMETAL=y
|
||||
CONFIG_CONT0_TYPE_POSIX=n
|
||||
CONFIG_CONT0_TYPE_LINUX=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Options
|
||||
#
|
||||
CONFIG_CONT0_OPT_NAME="empty0"
|
||||
|
||||
#
|
||||
# Baremetal Project Type
|
||||
#
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_EMPTY=y
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_HELLO_WORLD=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_THREADS_DEMO=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_TEST_SUITE=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_UART_SERVICE=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_TIMER_SERVICE=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_KMI_SERVICE=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_MUTEX_DEMO=n
|
||||
CONFIG_CONT0_BAREMETAL_PROJ_IPC_DEMO=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Pager Linker Parameters
|
||||
#
|
||||
CONFIG_CONT0_PAGER_LMA=0x40000
|
||||
CONFIG_CONT0_PAGER_VMA=0x100000
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Pager Physical Memory Regions (Capabilities)
|
||||
#
|
||||
CONFIG_CONT0_PAGER_PHYSMEM_REGIONS=1
|
||||
CONFIG_CONT0_PAGER_PHYS0_START=0x40000
|
||||
CONFIG_CONT0_PAGER_PHYS0_END=0x4000000
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Pager Virtual Memory Regions (Capabilities)
|
||||
#
|
||||
CONFIG_CONT0_PAGER_VIRTMEM_REGIONS=1
|
||||
CONFIG_CONT0_PAGER_VIRT0_START=0x0
|
||||
CONFIG_CONT0_PAGER_VIRT0_END=0x50000000
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Pager Capabilities
|
||||
#
|
||||
|
||||
#
|
||||
# Container 0 Thread Pool Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_THREADPOOL_USE=y
|
||||
CONFIG_CONT0_PAGER_CAP_THREADPOOL_SIZE=64
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Space Pool Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_SPACEPOOL_USE=y
|
||||
CONFIG_CONT0_PAGER_CAP_SPACEPOOL_SIZE=64
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Mutex Pool Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_MUTEXPOOL_USE=y
|
||||
CONFIG_CONT0_PAGER_CAP_MUTEXPOOL_SIZE=100
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Map Pool Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_MAPPOOL_USE=y
|
||||
CONFIG_CONT0_PAGER_CAP_MAPPOOL_SIZE=800
|
||||
|
||||
|
||||
#
|
||||
# Container 0 IPC Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_IPC_USE=y
|
||||
CONFIG_CONT0_PAGER_CAP_IPC_TARGET_CURRENT_CONTAINER=y
|
||||
CONFIG_CONT0_PAGER_CAP_IPC_TARGET_CURRENT_PAGER_SPACE=n
|
||||
CONFIG_CONT0_PAGER_CAP_IPC_TARGET_OTHER_CONTAINER=n
|
||||
CONFIG_CONT0_PAGER_CAP_IPC_TARGET_OTHER_PAGER=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 IRQ Control Capability
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_IRQCTRL_USE=y
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Custom Capability 0 Parameters
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_CUSTOM0_USE=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Custom Capability 1 Parameters
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_CUSTOM1_USE=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Custom Capability 2 Parameters
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_CUSTOM2_USE=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Custom Capability 3 Parameters
|
||||
#
|
||||
CONFIG_CONT0_PAGER_CAP_CUSTOM3_USE=n
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Global Capabilities
|
||||
#
|
||||
|
||||
#
|
||||
# Container 0 IPC Capability
|
||||
#
|
||||
CONFIG_CONT0_CAP_IPC_USE=y
|
||||
CONFIG_CONT0_CAP_IPC_TARGET_CURRENT_CONTAINER=y
|
||||
CONFIG_CONT0_CAP_IPC_TARGET_CURRENT_PAGER_SPACE=n
|
||||
CONFIG_CONT0_CAP_IPC_TARGET_OTHER_CONTAINER=n
|
||||
CONFIG_CONT0_CAP_IPC_TARGET_OTHER_PAGER=n
|
||||
|
||||
|
||||
#
|
||||
# Container 0 Mutex Pool Capability
|
||||
#
|
||||
CONFIG_CONT0_CAP_MUTEXPOOL_USE=y
|
||||
CONFIG_CONT0_CAP_MUTEXPOOL_SIZE=100
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Derived symbols
|
||||
#
|
||||
CONFIG_CONT3_START_PC_ADDR=0xd0000000
|
||||
CONFIG_DEBUG_PERFMON_KERNEL=n
|
||||
CONFIG_CONT1_PAGER_LOAD_ADDR=0x1100000
|
||||
CONFIG_CONT2_START_PC_ADDR=0xc0000000
|
||||
CONFIG_CONT2_PAGER_VIRT_ADDR=0xc0000000
|
||||
CONFIG_RAM_BASE_PLAT=0
|
||||
CONFIG_CONT2_PAGER_LOAD_ADDR=0x2100000
|
||||
CONFIG_CONT1_PAGER_VIRT_ADDR=0xb0000000
|
||||
CONFIG_CONT3_PAGER_LOAD_ADDR=0x3100000
|
||||
CONFIG_SUBARCH_V5=y
|
||||
CONFIG_SUBARCH_V7=n
|
||||
CONFIG_SUBARCH_V6=n
|
||||
CONFIG_CONT0_PAGER_LOAD_ADDR=0x40000
|
||||
CONFIG_CONT0_PAGER_VIRT_ADDR=0x100000
|
||||
CONFIG_CONT3_PAGER_VIRT_ADDR=0xd0000000
|
||||
CONFIG_CONT0_START_PC_ADDR=0x100000
|
||||
CONFIG_CONT1_START_PC_ADDR=0xb0000000
|
||||
#
|
||||
# That's all, folks!
|
@ -0,0 +1,274 @@
|
||||
|
||||
==================================
|
||||
Genode on the Codezero microkernel
|
||||
==================================
|
||||
|
||||
|
||||
Norman Feske
|
||||
|
||||
|
||||
Codezero is a microkernel primarily targeted at ARM-based embedded systems.
|
||||
It is developed by the British company B-Labs.
|
||||
|
||||
:B-Labs website:
|
||||
|
||||
[http://b-labs.co.uk]
|
||||
|
||||
The Codezero kernel was first made publicly available in summer 2009. The
|
||||
latest version, documentation, and community resources are available at the
|
||||
project website:
|
||||
|
||||
:Codezero project website:
|
||||
|
||||
[http://l4dev.org]
|
||||
|
||||
As highlighted by the name of the project website, the design of the kernel is
|
||||
closely related to the family of L4 microkernels. In short, the kernel provides
|
||||
a minimalistic set of functionality for managing address spaces, threads, and
|
||||
communication between threads, but leaves complicated policy and device access
|
||||
to user-level components.
|
||||
|
||||
|
||||
Using Genode with Codezero
|
||||
##########################
|
||||
|
||||
For using Codezero, please ensure to have Git, SCons, and Python installed as
|
||||
these tools are required for downloading and building the kernel. Furthermore,
|
||||
you will need to install the tool chain for ARM. For instructions on how to
|
||||
download and install the tool chain, please refer to:
|
||||
|
||||
:[http://genode.org/download/tool-chain]:
|
||||
Genode tool-chain
|
||||
|
||||
To download the Codezero kernel and integrate it with Genode, issue
|
||||
|
||||
! make prepare
|
||||
|
||||
from the 'base-codezero/' directory. The Codezero kernel is fully supported by
|
||||
Genode's run mechanism. Therefore, you can run Genode scenarios using Qemu
|
||||
directly from the build directory. For a quick test, let's create a build
|
||||
directory for Codezero on the VersatilePB926 platform using Genode's
|
||||
'create_builddir' tool:
|
||||
|
||||
! <genode-dir>/tool/create_builddir codezero_vpb926 BUILD_DIR=<build_dir>
|
||||
|
||||
To execute the graphical Genode demo, change to the new created build directory
|
||||
and issue:
|
||||
|
||||
! make run/demo
|
||||
|
||||
|
||||
Characteristics of the kernel
|
||||
#############################
|
||||
|
||||
To put Codezero in relation to other L4 kernels, here is a quick summary on the
|
||||
most important design aspects as implemented with the version 0.3, and on how
|
||||
our port of Genode relates to them:
|
||||
|
||||
* In the line of the original L4 interface, the kernel uses global name spaces
|
||||
for kernel objects such as threads and address spaces.
|
||||
|
||||
* For the interaction between a user thread and the kernel, the concept of
|
||||
user-level thread-control blocks (UTCB) is used. A UTCB is a small
|
||||
thread-specific region in the thread's virtual address space, which is
|
||||
always mapped. Hence the access to the UTCB can never raise a page fault,
|
||||
which makes it perfect for the kernel to access system-call arguments,
|
||||
in particular IPC payload copied from/to user threads. In contrast to other
|
||||
L4 kernels, the location of UTCBs within the virtual address space is managed
|
||||
by the user land.
|
||||
|
||||
On Genode, core keeps track of the UTCB locations for all user threads.
|
||||
This way, the physical backing store for the UTCB can be properly accounted
|
||||
to the corresponding protection domain.
|
||||
|
||||
* The kernel provides three kinds of synchronous inter-process communication
|
||||
(IPC): Short IPC carries payload in CPU registers only. Full IPC copies
|
||||
message payload via the UTCBs of the communicating parties. Extended IPC
|
||||
transfers a variable-sized message from/to arbitrary locations of the
|
||||
sender/receiver address spaces. During an extended IPC, page fault may
|
||||
occur.
|
||||
|
||||
Genode solely relies on extended IPC, leaving the other IPC mechanisms to
|
||||
future optimizations.
|
||||
|
||||
* The scheduling of threads is based on hard priorities. Threads with the
|
||||
same priority are executed in a round-robin fashion. The kernel supports
|
||||
time-slice-based preemption.
|
||||
|
||||
Genode does not support Codezero priorities yet.
|
||||
|
||||
* The original L4 interface leaves open the question on how to manage
|
||||
and account kernel resources such as the memory used for page tables.
|
||||
Codezero makes the accounting of such resources explicit, enables the
|
||||
user-land to manage them in a responsible way, and prevent kernel-resource
|
||||
denial-of-service problems.
|
||||
|
||||
* In contrast to the original L4.v2 and L4.x0 interfaces, the kernel provides
|
||||
no time source in the form of IPC timeouts to the user land. A time source
|
||||
must be provided by a user-space timer driver. Genode employs such a timer
|
||||
services on all platforms so that it is not effected by this limitation.
|
||||
|
||||
In several ways, Codezero goes beyond the known L4 interfaces. The most
|
||||
noticeable addition is the support for so-called containers. A container is
|
||||
similar to a virtual machine. It is an execution environment that holds a set
|
||||
of physical resources such as RAM and devices. The number of containers and the
|
||||
physical resources assigned to them is static and is to be defined at build
|
||||
time. The code executed inside a container can be roughly classified into two
|
||||
cases. First, there are static programs that require strong isolation from the
|
||||
rest of the system but no classical operating-system infrastructure, for
|
||||
example special-purpose telecommunication stacks or cryptographic functionality
|
||||
of an embedded device. Second, there a kernel-like workload, which use the L4
|
||||
interface to substructure the container into address spaces, for example a
|
||||
paravirtualized Linux kernel that uses Codezero address spaces to protect Linux
|
||||
processes. Genode runs inside a container and facilitates Codezero's L4
|
||||
interface to implement its multi-server architecture.
|
||||
|
||||
|
||||
Behind the scenes
|
||||
#################
|
||||
|
||||
The 'make prepare' mechanism checks out the kernel source code from the
|
||||
upstream Git repository to 'base-codezero/contrib'. When building the kernel
|
||||
from within a Genode build directory via 'make kernel', this directory won't be
|
||||
touched by the Genode build system. Instead, a snapshot of the 'contrib'
|
||||
directory is taken to '<build-dir>/kernel/codezero'. This is the place where
|
||||
the Codezero configuration and build processes are executed. By working with a
|
||||
build-directory-local snapshot, we ensure that the source tree remains
|
||||
untouched at all times. After having taken the snapshot, the Codezero kernel is
|
||||
configured using a configuration template specific for the hardware platform.
|
||||
The configuration comes in the form of a CML file located at
|
||||
'base-codezero/config/'. There is one CML file per supported platform named
|
||||
'<platform>.cml'. The configured Codezero build directory will reside at
|
||||
'<build-dir>/kernel/codezero/build/'. Finally, the Codezero build system is
|
||||
invoked to build the kernel.
|
||||
|
||||
The two stages of building Codezero
|
||||
===================================
|
||||
|
||||
The Codezero build system always performs the compilation of the kernel and the
|
||||
so-called containers as well as the integration of all these components into a
|
||||
final ELF image as one operation. When building just the kernel via 'make
|
||||
kernel', the final image will contain the default container0 that comes with
|
||||
the Codezero distribution. For integrating Genode into the final image, the
|
||||
content of the container0 must be replaced by the Genode binaries followed by
|
||||
another execution of 'kernel/codezero/build.py'. Now, the single-image will be
|
||||
re-created, including the Genode binaries. When using Genode's run mechanism,
|
||||
these steps are automated for you. For reference, please review the Codezero
|
||||
run environment at 'base-codezero/run/env'.
|
||||
|
||||
By first building the kernel with Codezero's default container ('make kernel')
|
||||
and later replacing the container's content with Genode binaries, we
|
||||
optimize the work flow for building Genode components. The kernel is compiled
|
||||
only once, but the (quick) re-linking of the final image is done every time a
|
||||
run script is executed.
|
||||
|
||||
In the run environment, you will see that we forcefully remove a file called
|
||||
'cinfo.c' from the build-directory-local snapshot of the Codezero source tree.
|
||||
This file is generated automatically by the Codezero build system and linked
|
||||
against the kernel. It contains the parameters of the containers executed on
|
||||
the kernel. Because we change the content of container0 each time when
|
||||
executing a run script, those parameter change. So we have to enforce to
|
||||
re-generation of the 'cinfo.c' file.
|
||||
|
||||
How Genode ROM modules are passed into the final image
|
||||
======================================================
|
||||
|
||||
The Codezero build system picks up any ELF files residing the container's
|
||||
directory wheres the file called 'main.elf' is considered to be the roottask
|
||||
(in Codezero speak called pager) of the container. For Genode, 'main.elf'
|
||||
corresponds to the core executable. All other boot modules are merged into an
|
||||
ELF file, which we merely use as a container for these binary data. This ELF
|
||||
file is linked such that it gets loaded directly after the core image (this is
|
||||
how core finds the boot modules). The process of archiving all boot modules
|
||||
into the single ELF file is automated via the 'base-codezero/tool/gen_romfs'
|
||||
tool. In the container's directory, the merged file is called 'modules.elf'.
|
||||
|
||||
Adapting the source code of the kernel
|
||||
======================================
|
||||
|
||||
For debugging and development you might desire to change the kernel code
|
||||
at times. You can safely do so within the 'base-codezero/contrib/' directory.
|
||||
When issuing the next 'make kernel' from the Genode build directory, your
|
||||
changes will be picked up. However, when working with run scripts, the kernel
|
||||
is not revisited each time. The kernel gets built only once if the
|
||||
'<build-dir>/kernel' directory does not exist, yet. If you work on the kernel
|
||||
source tree and wish to conveniently test the kernel with a run script, use
|
||||
|
||||
! make kernel run/<run-script>
|
||||
|
||||
This way, you make sure to rebuild the kernel prior executing the steps
|
||||
described in the run script.
|
||||
|
||||
Tweaking the kernel configuration
|
||||
=================================
|
||||
|
||||
The kernel configuration can be tweaked within '<build-dir>/kernel/codezero'.
|
||||
Just change to this directory and issue './build.py -C'. The next time you
|
||||
build the kernel via 'make kernel' your configuration will be applied.
|
||||
If you want to conserve your custom configuration, just copy the file
|
||||
'<build-dir>/kernel/codezero/build/config.cml'.
|
||||
|
||||
Parameters of 'vpb926.cml' explained
|
||||
====================================
|
||||
|
||||
The default configuration for the VersatilePB926 platform as found at
|
||||
'base-codzero/config/vpb926.cml' is paramaterized as follows:
|
||||
|
||||
:Default pager parameters:
|
||||
! 0x40000 Pager LMA
|
||||
! 0x100000 Pager VMA
|
||||
These values are important because they are currently hard-wired in the
|
||||
linker script used by Genode. If you need to adopt these values, make
|
||||
sure to also update the Genode linker script located at
|
||||
'base-codezero/src/platform/genode.ld'.
|
||||
|
||||
:Physical Memory Regions:
|
||||
! 1 Number of Physical Regions
|
||||
! 0x40000 Physical Region 0 Start Address
|
||||
! 0x4000000 Physical Region 0 End Address
|
||||
We only use 64MB of memory. The physical memory between 0 and 0x40000 is
|
||||
used by the kernel.
|
||||
|
||||
:Virtual Memory Regions:
|
||||
! 1 Number of Virtual Regions
|
||||
! 0x0 Virtual Region 0 Start Address
|
||||
! 0x50000000 Virtual Region 0 End Address
|
||||
It is important to choose the end address such that the virtual memory
|
||||
covers the thread context area. The context area is defined at
|
||||
'base/include/base/thread.h'.
|
||||
|
||||
|
||||
Limitations
|
||||
###########
|
||||
|
||||
At the current stage, the Genode version for Codezero is primarily geared
|
||||
towards the developers of Codezero as a workload to stress their kernel. It
|
||||
still has a number of limitations that would affect the real-world use:
|
||||
|
||||
* Because the only platform supported out of the box by the official Codezero
|
||||
source tree is the ARM-based Versatilebp board, Genode is currently tied to
|
||||
this hardware platform.
|
||||
|
||||
* The current timer driver at 'os/src/drivers/timer/codezero/' is a dummy
|
||||
driver that just yields the CPU time instead of blocking. Is is not
|
||||
suitable as time source.
|
||||
|
||||
* The PL110 framebuffer driver at 'os/src/drivers/framebuffer/pl110/'
|
||||
does only support the LCD display as provided by Qemu but it is not tested on
|
||||
real hardware.
|
||||
|
||||
* Even though Codezero provides priority-based scheduling, Genode does not
|
||||
allow assigning priorities to Codezero processes, yet.
|
||||
|
||||
As always, these limitations will be addressed as needed.
|
||||
|
||||
|
||||
Thanks
|
||||
######
|
||||
|
||||
We want to thank the main developer of Codezero Bahadir Balban for his great
|
||||
responsiveness to our feature requests and questions. Without his help, the
|
||||
porting effort would have taken much more effort. We hope that our framework
|
||||
will be of value to the Codezero community.
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
SPECS = genode
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* \brief Atomic operations for ARM on codezero
|
||||
* \author Norman Feske
|
||||
* \date 2009-10-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2009-2011 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__ARM__CPU__ATOMIC_H_
|
||||
#define _INCLUDE__ARM__CPU__ATOMIC_H_
|
||||
|
||||
namespace Genode {
|
||||
|
||||
/**
|
||||
* Atomic compare and exchange
|
||||
*
|
||||
* This function compares the value at dest with cmp_val.
|
||||
* If both values are equal, dest is set to new_val. If
|
||||
* both values are different, the value at dest remains
|
||||
* unchanged.
|
||||
*
|
||||
* \return 1 if the value was successfully changed to new_val,
|
||||
* 0 if cmp_val and the value at dest differ.
|
||||
*/
|
||||
int cmpxchg(volatile int *dest, int cmp_val, int new_val);
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__ARM__CPU__ATOMIC_H_ */
|
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* \brief IPC message buffer
|
||||
* \author Norman Feske
|
||||
* \date 2009-10-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2009-2011 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__BASE__IPC_MSGBUF_H_
|
||||
#define _INCLUDE__BASE__IPC_MSGBUF_H_
|
||||
|
||||
namespace Genode {
|
||||
|
||||
/**
|
||||
* IPC message buffer layout
|
||||
*/
|
||||
class Msgbuf_base
|
||||
{
|
||||
protected:
|
||||
|
||||
size_t _size;
|
||||
char _msg_start[]; /* symbol marks start of message */
|
||||
|
||||
public:
|
||||
|
||||
/*
|
||||
* Begin of actual message buffer
|
||||
*/
|
||||
char buf[];
|
||||
|
||||
/**
|
||||
* Return size of message buffer
|
||||
*/
|
||||
inline size_t size() const { return _size; };
|
||||
|
||||
/**
|
||||
* Return address of message buffer
|
||||
*/
|
||||
inline void *addr() { return &_msg_start[0]; };
|
||||
|
||||
} __attribute__((aligned(4)));
|
||||
|
||||
/**
|
||||
* Instance of IPC message buffer with specified buffer size
|
||||
*/
|
||||
template <unsigned BUF_SIZE>
|
||||
class Msgbuf : public Msgbuf_base
|
||||
{
|
||||
public:
|
||||
|
||||
char buf[BUF_SIZE];
|
||||
|
||||
Msgbuf() { _size = BUF_SIZE; }
|
||||
|
||||
} __attribute__((aligned(4)));
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__BASE__IPC_MSGBUF_H_ */
|
@ -0,0 +1,169 @@
|
||||
/*
|
||||
* \brief Dummy pager support for Genode
|
||||
* \author Norman Feske
|
||||
* \date 2009-10-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2009-2011 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__BASE__IPC_PAGER_H_
|
||||
#define _INCLUDE__BASE__IPC_PAGER_H_
|
||||
|
||||
#include <base/ipc.h>
|
||||
#include <base/stdint.h>
|
||||
#include <base/native_types.h>
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Mapping
|
||||
{
|
||||
private:
|
||||
|
||||
addr_t _from_phys_addr;
|
||||
addr_t _to_virt_addr;
|
||||
size_t _num_pages;
|
||||
bool _writeable;
|
||||
|
||||
enum { PAGE_SIZE_LOG2 = 12 };
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Mapping(addr_t dst_addr, addr_t src_addr,
|
||||
bool write_combined, unsigned l2size = PAGE_SIZE_LOG2,
|
||||
bool rw = true)
|
||||
:
|
||||
_from_phys_addr(src_addr),
|
||||
_to_virt_addr(dst_addr),
|
||||
_num_pages(1 << (l2size - PAGE_SIZE_LOG2)),
|
||||
_writeable(rw)
|
||||
{ }
|
||||
|
||||
/**
|
||||
* Construct invalid mapping
|
||||
*/
|
||||
Mapping() : _num_pages(0) { }
|
||||
|
||||
/**
|
||||
* Prepare map operation
|
||||
*
|
||||
* No preparations are needed on Codezero because all mapping
|
||||
* originate from the physical address space.
|
||||
*/
|
||||
void prepare_map_operation() { }
|
||||
|
||||
addr_t from_phys() const { return _from_phys_addr; }
|
||||
addr_t to_virt() const { return _to_virt_addr; }
|
||||
size_t num_pages() const { return _num_pages; }
|
||||
bool writeable() const { return _writeable; }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Special paging server class
|
||||
*/
|
||||
class Ipc_pager : public Native_capability
|
||||
{
|
||||
private:
|
||||
|
||||
Native_thread_id _last; /* faulted thread */
|
||||
addr_t _pf_addr; /* page-fault address */
|
||||
addr_t _pf_ip; /* instruction pointer of faulter */
|
||||
bool _pf_write; /* true on write fault */
|
||||
|
||||
Mapping _reply_mapping;
|
||||
|
||||
// protected:
|
||||
//
|
||||
// /**
|
||||
// * Wait for pagefault
|
||||
// */
|
||||
// void _wait();
|
||||
//
|
||||
// /**
|
||||
// * Send page-fault reply and wait for next page fault
|
||||
// */
|
||||
// void _reply_and_wait();
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
Ipc_pager();
|
||||
|
||||
/**
|
||||
* Wait for a new page fault received as short message IPC
|
||||
*/
|
||||
void wait_for_fault();
|
||||
|
||||
/**
|
||||
* Reply current page-fault and wait for a new one
|
||||
*/
|
||||
void reply_and_wait_for_fault();
|
||||
|
||||
/**
|
||||
* Request instruction pointer of current page fault
|
||||
*/
|
||||
addr_t fault_ip() { return _pf_ip; }
|
||||
|
||||
/**
|
||||
* Request fault address of current page fault
|
||||
*/
|
||||
addr_t fault_addr() { return _pf_addr; }
|
||||
|
||||
/**
|
||||
* Set parameters for next reply
|
||||
*/
|
||||
void set_reply_mapping(Mapping m) { _reply_mapping = m; }
|
||||
|
||||
/**
|
||||
* Set destination for next reply
|
||||
*/
|
||||
void set_reply_dst(Native_capability pager_object) {
|
||||
_last = pager_object.local_name(); }
|
||||
|
||||
/**
|
||||
* Answer call without sending a mapping
|
||||
*
|
||||
* This function is used to acknowledge local calls from one of
|
||||
* core's region-manager sessions.
|
||||
*/
|
||||
void acknowledge_wakeup();
|
||||
|
||||
/**
|
||||
* Return thread ID of last faulter
|
||||
*/
|
||||
Native_thread_id last() const { return _last; }
|
||||
|
||||
/**
|
||||
* Return badge for faulting thread
|
||||
*/
|
||||
unsigned long badge() const { return _last.tid; }
|
||||
|
||||
/**
|
||||
* Return true if page fault was a write fault
|
||||
*/
|
||||
bool is_write_fault() const { return _pf_write; }
|
||||
|
||||
/**
|
||||
* Return true if last fault was an exception
|
||||
*/
|
||||
bool is_exception() const
|
||||
{
|
||||
/*
|
||||
* Reflection of exceptions is not supported on this platform.
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__BASE__IPC_PAGER_H_ */
|
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* \brief Dummy definitions for native types used for compiling unit tests
|
||||
* \author Norman Feske
|
||||
* \date 2009-10-02
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2009-2011 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__BASE__NATIVE_TYPES_H_
|
||||
#define _INCLUDE__BASE__NATIVE_TYPES_H_
|
||||
|
||||
namespace Codezero {
|
||||
|
||||
struct l4_mutex;
|
||||
|
||||
enum { NILTHREAD = -1 };
|
||||
}
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Platform_thread;
|
||||
|
||||
struct Native_thread_id
|
||||
{
|
||||
int tid;
|
||||
|
||||
/**
|
||||
* Pointer to thread's running lock
|
||||
*
|
||||
* Once initialized (see 'lock_helper.h'), it will point to the
|
||||
* '_running_lock' field of the thread's 'Native_thread' structure,
|
||||
* which is part of the thread context. This member variable is
|
||||
* used by the lock implementation only.
|
||||
*/
|
||||
struct Codezero::l4_mutex *running_lock;
|
||||
|
||||
Native_thread_id() { }
|
||||
|
||||
/**
|
||||
* Constructor (used as implicit constructor)
|
||||
*/
|
||||
Native_thread_id(int l4id) : tid(l4id), running_lock(0) { }
|
||||
|
||||
Native_thread_id(int l4id, Codezero::l4_mutex *rl) : tid(l4id), running_lock(rl) { }
|
||||
};
|
||||
|
||||
struct Native_thread
|
||||
{
|
||||
Native_thread_id l4id;
|
||||
|
||||
/**
|
||||
* Only used in core
|
||||
*
|
||||
* For 'Thread' objects created within core, 'pt' points to the
|
||||
* physical thread object, which is going to be destroyed on
|
||||
* destruction of the 'Thread'.
|
||||
*/
|
||||
Platform_thread *pt;
|
||||
};
|
||||
|
||||
/**
|
||||
* Empty UTCB type expected by the thread library
|
||||
*
|
||||
* On this kernel, UTCBs are not placed within the the context area. Each
|
||||
* thread can request its own UTCB pointer using the kernel interface.
|
||||
* However, we use the 'Native_utcb' member of the thread context to
|
||||
* hold thread-specific data, i.e. the running lock used by the lock
|
||||
* implementation.
|
||||
*/
|
||||
struct Native_utcb
|
||||
{
|
||||
private:
|
||||
|
||||
/**
|
||||
* Prevent construction
|
||||
*
|
||||
* A UTCB is never constructed, it is backed by zero-initialized memory.
|
||||
*/
|
||||
Native_utcb();
|
||||
|
||||
/**
|
||||
* Backing store for per-thread running lock
|
||||
*
|
||||
* The size of this member must equal 'sizeof(Codezero::l4_mutex)'.
|
||||
* Unfortunately, we cannot include the Codezero headers here.
|
||||
*/
|
||||
int _running_lock;
|
||||
|
||||
public:
|
||||
|
||||
Codezero::l4_mutex *running_lock() {
|
||||
return (Codezero::l4_mutex *)&_running_lock; }
|
||||
};
|
||||
|
||||
inline bool operator == (Native_thread_id t1, Native_thread_id t2) { return t1.tid == t2.tid; }
|
||||
inline bool operator != (Native_thread_id t1, Native_thread_id t2) { return t1.tid != t2.tid; }
|
||||
|
||||
/*
|
||||
* Because Codezero does not support local names for capabilities, a Genode
|
||||
* capability consists of the global thread ID and a global object ID, not
|
||||
* protected by the kernel when transmitted as IPC payloads.
|
||||
*/
|
||||
class Native_capability
|
||||
{
|
||||
private:
|
||||
|
||||
Native_thread_id _tid; /* global thread ID */
|
||||
int _local_name; /* global unique object ID */
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Default constructor creates invalid capability
|
||||
*/
|
||||
Native_capability()
|
||||
: _local_name(0) { _tid.tid = Codezero::NILTHREAD; }
|
||||
|
||||
/**
|
||||
* Constructor for hand-crafting capabilities
|
||||
*
|
||||
* This constructor is only used internally be the framework.
|
||||
*/
|
||||
Native_capability(Native_thread_id tid, int local_name)
|
||||
: _tid(tid), _local_name(local_name) { }
|
||||
|
||||
bool valid() const { return _tid.tid != Codezero::NILTHREAD; }
|
||||
|
||||
int local_name() const { return _local_name; }
|
||||
int dst() const { return _tid.tid; }
|
||||
|
||||
Native_thread_id tid() const { return _tid; }
|
||||
};
|
||||
|
||||
typedef int Native_connection_state;
|
||||
}
|
||||
|
||||
|
||||
#endif /* _INCLUDE__BASE__NATIVE_TYPES_H_ */
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* \brief Aggregate Codezero syscall bindings
|
||||
* \author Norman Feske
|
||||
* \date 2010-02-16
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2010-2011 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE__CODEZERO__SYSCALLS_H_
|
||||
#define _INCLUDE__CODEZERO__SYSCALLS_H_
|
||||
|
||||
/*
|
||||
* Codezero headers happen to include the compiler's 'stdarg.h'. If this
|
||||
* happened within the 'Codezero' namespace below, we would not be able to
|
||||
* include 'stdarg.h' later on into the root namespace (stdarg's include guards
|
||||
* would prevent this. Therefore, we make sure to include the file into the
|
||||
* root namespace prior processing any Codezero headers.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
namespace Codezero { extern "C" {
|
||||
|
||||
/* make Codezero includes happy */
|
||||
extern char *strncpy(char *dest, const char *src, __SIZE_TYPE__);
|
||||
extern void *memcpy(void *dest, const void *src, __SIZE_TYPE__);
|
||||
|
||||
/*
|
||||
* Work around the problem of C++ keywords being used as
|
||||
* argument names in the Codezero API headers.
|
||||
*/
|
||||
#define new _new_
|
||||
#define virtual _virtual_
|
||||
#define printf(A, ...)
|
||||
|
||||
#include <l4lib/macros.h>
|
||||
#include <l4lib/arch/arm/syscalls.h>
|
||||
#include <l4lib/arch/arm/syslib.h>
|
||||
#include <l4lib/ipcdefs.h>
|
||||
#include <l4lib/init.h>
|
||||
#include <l4lib/mutex.h>
|
||||
#include <l4/api/thread.h>
|
||||
#include <l4/api/irq.h>
|
||||
#include <l4lib/exregs.h>
|
||||
#include <l4/lib/list.h> /* needed for capability.h */
|
||||
#include <l4/generic/capability.h>
|
||||
#include <l4/generic/cap-types.h>
|
||||
#include <l4/arch/arm/exception.h>
|
||||
#include <l4/arch/arm/io.h>
|
||||
|
||||
#undef new
|
||||
#undef virtual
|
||||
#ifdef max
|
||||
#undef max
|
||||
#endif
|
||||
#undef printf
|
||||
} }
|
||||
|
||||
namespace Codezero {
|
||||
|
||||
/**
|
||||
* Return thread ID of the calling thread
|
||||
*/
|
||||
inline int thread_myself()
|
||||
{
|
||||
struct task_ids ids = { 0, 0, 0 };
|
||||
l4_getid(&ids);
|
||||
return ids.tid;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__CODEZERO__SYSCALLS_H_ */
|
@ -0,0 +1,9 @@
|
||||
LIBS = cxx lock l4
|
||||
SRC_S = crt0.s
|
||||
SRC_CC = _main.cc
|
||||
INC_DIR += $(REP_DIR)/src/platform
|
||||
INC_DIR += $(BASE_DIR)/src/platform
|
||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||
|
||||
vpath crt0.s $(BASE_DIR)/src/platform/arm
|
||||
vpath _main.cc $(dir $(call select_from_repositories,src/platform/_main.cc))
|
@ -0,0 +1,3 @@
|
||||
LIBS += l4_arm_v5
|
||||
|
||||
include $(REP_DIR)/lib/mk/l4.inc
|
@ -0,0 +1,9 @@
|
||||
LIBL4_DIR = $(CODEZERO_DIR)/conts/userlibs/libl4
|
||||
|
||||
INC_DIR += $(CODEZERO_DIR)/conts/userlibs/libc/include
|
||||
|
||||
SRC_C += $(notdir $(wildcard $(LIBL4_DIR)/src/arch/arm/v5/*.c))
|
||||
SRC_S += $(notdir $(wildcard $(LIBL4_DIR)/src/arch/arm/v5/*.S))
|
||||
|
||||
vpath %.c $(LIBL4_DIR)/src/arch/arm/v5
|
||||
vpath %.S $(LIBL4_DIR)/src/arch/arm/v5
|
@ -0,0 +1,3 @@
|
||||
ifeq ($(filter-out $(SPECS),platform_vpb926),)
|
||||
CODEZERO_CML = $(REP_DIR)/config/vpb926.cml
|
||||
endif
|
@ -0,0 +1,13 @@
|
||||
#
|
||||
# Additional symbols we need to keep when using the arm-none-linux-gnueabi
|
||||
# tool chain
|
||||
#
|
||||
KEEP_SYMBOLS += __aeabi_ldivmod __aeabi_uldivmod __dynamic_cast
|
||||
KEEP_SYMBOLS += _ZN10__cxxabiv121__vmi_class_type_infoD0Ev
|
||||
|
||||
#
|
||||
# Override sources of the base repository with our changed version
|
||||
#
|
||||
vpath exception.cc $(REP_DIR)/src/base/cxx
|
||||
|
||||
include $(BASE_DIR)/lib/mk/cxx.mk
|
@ -0,0 +1,4 @@
|
||||
SRC_CC = ipc.cc pager.cc
|
||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||
|
||||
vpath %.cc $(REP_DIR)/src/base/ipc
|
@ -0,0 +1,43 @@
|
||||
LIBL4_DIR = $(CODEZERO_DIR)/conts/userlibs/libl4
|
||||
|
||||
SRC_C += init.c irq.c mutex.c
|
||||
SRC_C += arch/arm/exregs.c
|
||||
SRC_S += $(addprefix arch/arm/,syscalls.S new_thread.S)
|
||||
SRC_C += $(addprefix lib/,addr.c bit.c idpool.c)
|
||||
SRC_C += $(addprefix lib/thread/,init.c thread.c)
|
||||
SRC_C += $(addprefix lib/cap/,cap.c read.c)
|
||||
|
||||
INC_DIR += $(CODEZERO_DIR)/conts/userlibs/libc/include
|
||||
INC_DIR += $(CODEZERO_DIR)/conts/userlibs/libmem/include
|
||||
INC_DIR += $(CODEZERO_DIR)/conts/userlibs/libmem
|
||||
|
||||
vpath % $(LIBL4_DIR)/src
|
||||
|
||||
#
|
||||
# The libl4 source files uses macros defined in macros.h but do not
|
||||
# explicitly include the 'macros.h' header file.
|
||||
#
|
||||
CC_OPT += -include $(LIBL4_DIR)/include/l4lib/macros.h
|
||||
|
||||
#
|
||||
# Resolve conflicts with built-in functions
|
||||
#
|
||||
CC_OPT += -fno-builtin-pow
|
||||
|
||||
#
|
||||
# During the compilation of the libl4 file 'thread.c', the 'l4id_t' type
|
||||
# is used without prior inclusion of 'types.h'. Furthermore, 'types.h'
|
||||
# has a wrong include guard, so we take care of this problem using a
|
||||
# wrapper.
|
||||
#
|
||||
CC_OPT_lib_thread_thread += -include fix_include_types.h
|
||||
CC_OPT_arch_arm_exregs += -include fix_include_types.h
|
||||
|
||||
lib/thread/thread.o arch/arm/exregs.o: fix_include_types.h
|
||||
|
||||
fix_include_types.h:
|
||||
@echo "#include <l4lib/arch/arm/types.h>" > $@
|
||||
@echo "#define __L4LIB_ARM_TYPES_H___" >> $@
|
||||
|
||||
CC_OPT += -std=gnu99
|
||||
|
@ -0,0 +1,7 @@
|
||||
SRC_CC = lock.cc cmpxchg.cc
|
||||
|
||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||
INC_DIR += $(REP_DIR)/src/base/lock
|
||||
|
||||
vpath lock.cc $(BASE_DIR)/src/base/lock
|
||||
vpath cmpxchg.cc $(REP_DIR)/src/base/lock
|
@ -0,0 +1,4 @@
|
||||
SRC_CC = pager.cc
|
||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||
|
||||
vpath pager.cc $(REP_DIR)/src/base/pager
|
@ -0,0 +1,6 @@
|
||||
SRC_CC = core_printf.cc
|
||||
LIBS = cxx console
|
||||
INC_DIR += $(REP_DIR)/src/base/console/pl011
|
||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||
|
||||
vpath core_printf.cc $(BASE_DIR)/src/base/console
|
@ -0,0 +1,33 @@
|
||||
#
|
||||
# Create prerequisites for building Genode for Codezero
|
||||
#
|
||||
|
||||
#
|
||||
# Execute the rules in this file only at the second build stage when we know
|
||||
# about the complete build settings, e.g., the 'CROSS_DEV_PREFIX'.
|
||||
#
|
||||
ifeq ($(called_from_lib_mk),yes)
|
||||
|
||||
include $(REP_DIR)/lib/mk/codezero_cml.inc
|
||||
|
||||
all: $(BUILD_BASE_DIR)/include/l4/config.h
|
||||
|
||||
$(BUILD_BASE_DIR)/include/l4/config.h: $(CODEZERO_CML)
|
||||
$(VERBOSE)mkdir -p $(dir $@)
|
||||
$(VERBOSE)$(CODEZERO_DIR)/tools/cml2header.py -i $^ -o $@
|
||||
|
||||
#
|
||||
# Codezero's 'macros.h' includes the file "config.h", expected to be located in
|
||||
# the same directory (using #include "config.h"). However, 'config.h' is
|
||||
# generated into the source tree by the Codezero configuration system. Since we
|
||||
# do not want to pollute the source tree, we create a shadow copy of 'macros.h'
|
||||
# in the same directory as our generated 'config.h'.
|
||||
#
|
||||
all: $(BUILD_BASE_DIR)/include/l4/macros.h
|
||||
|
||||
$(BUILD_BASE_DIR)/include/l4/macros.h: $(CODEZERO_DIR)/include/l4/macros.h
|