nova: update to kernel revision r3

r3 contains the recent Nova upstream kernel version plus the Genode specific
extensions and changes as known from r2.

Additionally, the r3 branch

* contains the assign_pci patch now directly,
* adds support for cross CPU IPC,
* fixes some issues with freeing up kernel memory part of r2 and
* update the documentation a bit.

Fixes #814
This commit is contained in:
Alexander Boettcher 2013-07-22 10:26:44 +02:00 committed by Norman Feske
parent 071ca39407
commit 70d0b00dde
5 changed files with 22 additions and 63 deletions

View File

@ -9,7 +9,7 @@ VERBOSE ?= @
ECHO = @echo
GIT_URL = https://github.com/alex-ab/NOVA.git
GIT_REV = HEAD
GIT_BRANCH = r2
GIT_BRANCH = r3
CONTRIB_DIR = contrib
PATCHES = $(shell find patches -name '*.patch')

View File

@ -72,7 +72,7 @@ directory:
For creating a preconfigured build directory prepared for compiling Genode for
NOVA, use the 'create_builddir' tool:
! <genode-dir>/tool/create_builddir nova_x86 BUILD_DIR=<build-dir>
! <genode-dir>/tool/create_builddir nova_x86_32 BUILD_DIR=<build-dir>
This tool will create a fresh build directory at the location specified
as 'BUILD_DIR'. Provided that you have installed the
@ -120,11 +120,7 @@ on NOVA:
All other Genode programs use Genode's generic linker script.
* The Genode 'Capability' type consists of a portal selector expressing the
destination of a capability invocation and a global object ID expressing
the identity of the object when the capability is specified as an invocation
argument. In the latter case, the global ID is needed because of a limitation
of the current system-call interface. In the future, we are going to entirely
remove the global ID.
destination of a capability invocation.
* Thread-local data such as the UTCB pointer is provided by the new thread
context management introduced with the Genode release 10.02. It enables
@ -132,7 +128,7 @@ on NOVA:
pointer.
* NOVA provides threads without time called local execution contexts (EC).
Local ECs are intended as server-side RPC handlers. The processing time
Local ECs are used as server-side RPC handlers. The processing time
needed to perform RPC requests is provided by the client during the RPC call.
This way, RPC semantics becomes very similar to function call semantics with
regard to the accounting of CPU time. Genode already distinguishes normal
@ -184,9 +180,6 @@ on NOVA:
code for the signal interface and remains completely transparent at API
level.
For the timer service, we currently use one thread per client to avoid the need
for out-of-order RPC processing.
* Because NOVA provides no time source, we use the x86 PIT as user-level time
source, similar as on OKL4.
@ -206,26 +199,24 @@ Manually booting Genode on NOVA
NOVA supports multi-boot-compliant boot loaders such as GRUB, Pulsar, or gPXE.
For example, a GRUB configuration entry for booting the Genode demo scenario
with NOVA looks as follows, whereas 'genode/' is a symbolic link to the 'bin/'
subdirectory of the Genode build directory and the 'config' file is a copy of
'os/config/demo'.
with NOVA looks as follows, whereas 'genode/' is a symbolic link to the
'var/run/demo/genode' directory created by invoking the 'demo' run script.
! title Genode demo scenario
! kernel /hypervisor noapic
! kernel /hypervisor iommu serial
! module /genode/core
! module /genode/config
! module /genode/init
! module /config/demo/config
! module /genode/timer
! module /genode/ps2_drv
! module /genode/pci_drv
! module /genode/fb_drv
! module /genode/launchpad
! module /genode/nitpicker
! module /genode/liquid_fb
! module /genode/nitlog
! module /genode/testnit
! module /genode/launchpad
! module /genode/scout
! module /genode/testnit
! module /genode/nitlog
! module /genode/pci_drv
! module /genode/ps2_drv
! module /genode/fb_drv
Limitations
###########
@ -235,26 +226,10 @@ scenario including several device drivers (PIT, PS/2, VESA, PCI) and the GUI.
Still the NOVA support is not on par with some of the other platforms.
The current limitations are:
* No real-time priority support: NOVA supports priority-based scheduling
but, in the current version, it allows each thread to create scheduling
contexts with arbitrary scheduling parameters. This makes it impossible
to enforce priority assignment from a central point as facilitated with
Genode's priority concept.
* No multi-processor support: NOVA supports multi-processor CPUs through
binding each execution context (ECs) to a particular CPU. Because everyone
can create ECs, every process could use multiple CPUs. However, Genode's API
devises a more restrictive way of allocating and assigning resources. In
short, physical resource usage should be arbitrated by core and the creation
of physical ECs should be performed by core only. However, Remote EC creation
is not yet supported by NOVA. Even though, multiple CPU can be used with
Genode on NOVA right now by using NOVA system calls directly, there is no
support at the Genode API level.
* No cancel-blocking semantics: The cancellation of locks is not support,
yet. Because of this missing functionality, applications can freeze
in situations where a subsystems that blocks for a service is attempted
to get destroyed.
* Threads (ECs) can not be migrated to another CPU once started.
* For portals used as exception vectors for threads, the thread causing the
exception and the handler thread which is bound to the exception portal must
be on the same CPU.
* Priorities for Genode threads are not supported.

View File

@ -77,7 +77,7 @@ namespace Nova {
NOVA_INV_SELECTOR = 4,
NOVA_INV_PARAMETER = 5,
NOVA_INV_FEATURE = 6,
NOVA_INV_CPU_NUMBER = 7,
NOVA_INV_CPU = 7,
NOVA_INVD_DEVICE_ID = 8,
};

View File

@ -1,2 +1,2 @@
This directory contains patches for the NOVA microhypervisor @ github
required for using this kernel with Genode.
This directory contains patches for the Genode adjusted version of the NOVA
microhypervisor @ github required for using this kernel with Genode.

View File

@ -1,16 +0,0 @@
diff --git a/src/syscall.cpp b/src/syscall.cpp
index ee6dc42..9d5eba3 100644
--- a/src/syscall.cpp
+++ b/src/syscall.cpp
@@ -462,8 +487,10 @@ void Ec::sys_assign_pci()
sys_finish<Sys_regs::BAD_CAP>();
}
+ Pd * pd = static_cast<Pd *>(obj);
+
Paddr phys; unsigned rid;
- if (EXPECT_FALSE (!Pd::current->Space_mem::lookup (r->dev(), phys) || (rid = Pci::phys_to_rid (phys)) == ~0U)) {
+ if (EXPECT_FALSE (!pd->Space_mem::lookup (r->dev(), phys) || (rid = Pci::phys_to_rid (phys)) == ~0U)) {
trace (TRACE_ERROR, "%s: Non-DEV CAP (%#lx)", __func__, r->dev());
sys_finish<Sys_regs::BAD_DEV>();
}