diff --git a/doc/release_notes-16-05.txt b/doc/release_notes-16-05.txt new file mode 100644 index 000000000..cc366ccc0 --- /dev/null +++ b/doc/release_notes-16-05.txt @@ -0,0 +1,1315 @@ + + + =============================================== + Release notes for the Genode OS Framework 16.05 + =============================================== + + Genode Labs + + + +After ten years of developing and refining the Genode OS Framework and +conducting countless experiments, it is time to condense the gathered body of +experience into a fundamentally revised API. Version 16.05 marks the most +profound API change in the project's history. The underlying motivation is to +reduce complexity while preserving the flexibility of the framework. With a +narrow and orthogonal API, components become easier to develop, to evaluate, +and to maintain. The second motivation is our aspiration to ultimately attain +a stable binary interface that works across different kernels. The new API is +a significant step in this direction. +Section [The great API renovation] presents the rationale behind these changes, +and outlines the steps for migrating to the new API. It is complemented by +technical details given in Section [Base framework] and a comprehensive +documentation update (Section [New revision of the Genode Foundations book]). + +The second focus of the current release is the update of Genode's arsenal +of device drivers, in particular the driver stacks ported from Linux. Those +drivers comprise the Intel wireless stack, the Intel graphics driver, the +Linux TCP/IP stack, and the Linux USB stack. Genode scenarios can now take +advantage of the +same drivers as modern Linux distributions based on the Linux kernel version +4.4.3. Furthermore, the audio driver ported from OpenBSD received an update. +Section [Device drivers] describes this line of work in detail. The +device-driver topic is nicely complemented with a greatly improved ACPI +support presented in Section [Enhanced ACPI support]. + +With respect to the framework's feature set, version 16.05 introduces +the ability to use the Rust programming language for Genode components +(Section [New support for the Rust programming language]), and allows the +GNU debugger to be used on top of 64-bit NOVA +(Section [Enhanced GDB support on NOVA]). + +According to the [https://genode.org/about/road-map - road map], we originally +planned a few more functional additions that did not make it into the +release. Even through the work on the package-management topic +[https://github.com/nfeske/genode-pkg - progresses], we are still at an +experimental stage. We decided to defer the work on the NAT component and +instead focused on improvements of the base-hw kernel +(Section [Execution on bare hardware (base-hw)]) that are highly anticipated +by the developers of the Muen separation kernel. Speaking of +[https://muen.sk - Muen], the support for running Genode on this kernel has +reached the state where Virtualbox can be executed inside a Muen partition. +However, we decided to not rush the integration of this feature into Genode's +mainline. Right now, it still resides on a topic branch. If you are eager to +try it out right now, please get in touch via the +[https://genode.org/community/mailing-lists - mailing list]. + + +The great API renovation +######################## + +Genode's base API evolved over the years. When we started in 2006, our mindset +was very much influenced by L4, which regarded synchronous IPC as the only +mechanism required. We used to implement components ("servers") in a procedural +programming style with a fully synchronous control flow within +and across components (IPC). + +We eventually realized that the restriction to synchronous IPC was misguided +(see Section 3.6.2. "Asynchronous notifications" in +[https://genode.org/documentation/genode-foundations-16-05.pdf - the Genode Foundations book] +for a detailed discussion of the problems). +When we started to embrace the use of asynchronous +notifications and to disregard blocking RPC between components, we found +ourselves designing components as state machines rather than procedural +programs. To promote this programming style, we introduced the so-called +server API (_os/server.h_). See +[https://github.com/genodelabs/genode/blob/master/repos/os/src/server/nic_loopback/main.cc - NIC loopback server] +for a canonical example of such a component. + +We found that this new style greatly increased the robustness and flexibility +of the components. In particular, it completely alleviates race conditions, +which constantly troubled us in the past. Now, following the new paradigm, we +may end up in a deadlock, but such a situation is easy to debug compared to +sporadic race conditions. Over the past two years, we have redesigned all +Genode session interfaces to avoid blocking RPC. The only remains are the +parent and root interfaces, which we still need to address. + +Still, the Genode API retained compatibility to the old (= wrong) style of +developing components. We take the current release as an opportunity to +finally clean the API from our past mistakes. + + +High-level overview of the changes +================================== + +Removal of side effects +----------------------- + +Up to now, most components rely on the globally available 'Genode::env()' +singleton object for interacting with its environment. When calling a function +or method, one never knows for sure if the called code interacts with the +'env'. E.g., we can simply create an instance of 'Timer::Connection' without +any arguments. Under the hood, the 'Connection' object accesses the 'env' to +open a timer session at the parent. In the spirit of capability-based +security, we should shun the reliance on side effects like the global 'env'. +Instead, we should pass all materials that are needed by the called code +explicitly to the called code (e.g., by passing a reference to a 'Parent &' as +argument). This way, someone inspecting the calling code can immediately see +the possible reach of the called code. Another prominent example is the latent +use of 'env()->heap()', which allows any code to arbitrary consume memory. +Instead, we should better pass an 'Allocator &' to the called code. This way, +we re-enforce that library code stays clean from the policy where memory is +allocated from. If no 'Allocator &' is passed, we know that no dynamic memory +allocation can be performed. If an 'Allocator &' is required, the called code +needs to explain (in the form of its documentation) why the allocator is +actually needed. Moreover, by passing an 'Allocator_guard', the calling code +can impose a limit of the memory consumption on the called code. + + +Component API +------------- + +Traditionally, components started their execution at a 'main' function +because, well, this is how it's supposed to be, right? The program exits as +soon as main returns. With the introduction of the server API mentioned above, +we explored a different approach: The execution of a component starts at a +'construct' function that takes a form of the Genode environment as argument. +The function is expected to initialize the component. Upon completion of the +initialization, the function returns. At this point, the component becomes +ready to respond to incoming RPC requests or signals. Each time such a +request/signal comes in, a handler is executed. The handler applies the +component-internal state changes and returns immediately. No blocking call is +performed. We have essentially a state machine. + +Over the past two years, we have applied this new approach to all new +components - to a great success. So it is time to promote this API to become +Genode's base API. The major benefits are: + +* Servers become easier to develop as the API is much simpler. + Previously, a server had to manually create a CAP connection and an RPC + entrypoint. Now, each component has a ready-to-use entrypoint. + +* Signals and RPC requests are handled in the context of the same thread, + which alleviates the need for locking as long as the component is single + threaded, which is actually the case for most components. + +* The notions of 'Thread', 'Signal_receiver', 'Rpc_entrypoint' are no longer + needed by the developer of a component. There is simply an 'Entrypoint', + which is able to handle both RPC requests and signals. + + +Shunning pointers +----------------- + +The Genode API has still a lot of places where pointers are taken as arguments +or exposed from objects. We didn't know better when we started with Genode. +Now we do. With the current release, we streamline the base API in this +respect. Just as one simple example, the 'Heap' used to take an RM-session +pointer and an RAM-session pointer as arguments. These should be references. +Pointers should be used only in situations where a nullptr is a reasonable +argument, or when dealing with string literals as 'char const *'. + + +We are not there yet +-------------------- + +Whereas we find designing an API that successfully strikes the balance between the +lowest possible API complexity and highest possible flexibility extremely +challenging, we find ourselves even more challenged with the execution of the +transition from one API to another. The order of steps must be planned carefully +and interim solutions must be designed as migration paths. We hope that the +current release does not induce too much pain for the users of the framework. +Wherever we found a way to smoothen the migration path, we took it. But there +are a few disruptive changes that are explained in detail in Section [Base +framework]. + +There are still a few loose ends that we will address in the subsequent +release, in particular the redesign of the parent interface to become +completely asynchronous. + + +New revision of the Genode Foundations book +=========================================== + +The profound changes of the Genode API prompted us to update the Genode +Foundations book accordingly. Whereas the principle architecture remained +unchanged, many details needed an adjustment. +The changes between the last year's edition and the current revision are: + +:
+:

+:

+: +: +: +:
+:

+ +* Consolidation and interface changes of core services + (CAP, SIGNAL, RM, CPU, PD), +* Architectural changes related to the management of virtual-memory regions + (region maps), +* Updated functional specification matching the new API + (e.g., 'Entrypoint', 'Env', 'Component', 'Thread', log API, IPC), +* Updated NOVA modifications and limitations + (kernel-memory quotas, remote unmap, 64-bit guests, write-combining), +* Label-dependent session routing / policy selection + +:
+ +To see the changes in detail, please refer to the book's +[https://github.com/nfeske/genode-manual/commits/master - revision history]. + +As another useful resource to get acquainted with the new API, +please also consider the +[https://genode.org/documentation/developer-resources/client_server_tutorial - updated client-server tutorial]. + +API migration guide +=================== + +In the current release we promote the former "server API" to the general +"component API", which should solely be used for new components. The old API +is now considered as deprecated. This short guide provides the list of +steps one has to take to adapt an existing server-API-style component to the +new API. + +The steps are as follows: + +# Replace include directives + + The 'Server' namespace is superseded by the 'Component' namespace and the + 'Entrypoint' class has moved to the Genode namespace. Therefore, instead + of including the _os/server.h_ header, the _base/component.h_ header must + be included. + +# Replace server definition + + Where the old API used the Server hook functions + + !char const *Server::name() { return "server_ep"; } + !size_t Server::stack_size() { return 8*1024*sizeof(long); } + !void Server::construct(Entrypoint &ep) { static Main main(ep); } + + the new API uses the Component hook functions + + !size_t Component::stack_size() { return 8*1024*sizeof(long); } + !void Component::construct(Genode::Env &env) { static Main main(env); } + + Note that the 'name()' function ceased to exist. + +# Use 'Env' reference + + Whereas the old API passes a reference to an 'Entrypoint', the new API + passes a reference of the 'Genode::Env' to the component's 'construct' + function. + The initial entrypoint of the component can be accessed through the 'Env' + reference by calling the 'ep()' method. As intermediate step while doing the + migration work, it is sufficient to call this method in the 'construct()' + method, e.g.: + + !void Component::construct(Genode::Env &env) { static Main main(env.ep()); } + +# Replace 'Signal_rpc_member' + + The 'Signal_rpc_member' class is considered deprecated and superseded by the + 'Signal_handler' class (see _base/signal.h_). Note that the actual + signal-handling method as passed to a 'Signal_handler' has no argument, as + opposed to the old API where the handler was called with a counter value. + +# Replace global 'Genode::env()' accessor + + The most cutting change is the discontinuation of the global 'Genode::env()' + accessor function. Typically, this accessor was used throughout a component + to access its environment, e.g. use 'Genode::env()->heap()' as allocator or + 'Genode::env()->rm_session()->attach()' to attach a dataspace. + + Since a component starts its life now at the execution of the 'construct' + function, the component has to pass a reference to its 'Env' interface or + rather a reference to the needed part of the 'Env' interface on. This + explicit way of handling access to the component's environment will require + a restructuring of the component. It is good practice to focus on the need + at hand rather than to always pass the 'Env' reference on. On that account, + it is important to note that the 'Rm_session' is no longer accessible and + its place is taken by the 'Region_map'. Where one would have called + 'env()->rm_session()->attach' to attach a given dataspace, + 'env.rm().attach' has now to be used. + + Furthermore, the global heap allocator object was removed. Components that + want to use a heap like allocator have to create such an allocator + manually: + + !Genode::Heap heap { &env.ram(), &env.rm() }; + +# Use new log facilities + + Instead of relying on the old print macros (PDBG, PERR, PINF, PLOG, PWRN) + and thereby 'Genode::printf()', a component should use the new 'Log' class to + produce diagnostic LOG output. There are a few convenient template functions, + namely 'Genode::error()', 'Genode::log()' and 'Genode::warning()' that can be + used. Note that these functions do not use a format string to print various + different data types but just a list of arguments, e.g.: + + !int const i = 42; + !char const * str = "world"; + !Genode::log("Hello ", str, "! ", i); + + produces 'Hello world! 42'. + + Note that certain data types, e.g. 'enum' and 'char', might have to be + casted, e.g.: + + !enum { FOO, BAR }; + !Genode::log("enum: ", (int)FOO, " ", (int)BAR); + + +Base framework +############## + +New component API +================= + +Each component is a composition of a protection domain (PD session), a +memory budget (RAM session), and a CPU session, from which the initial thread +is created. These sessions form the _environment_ of the component, which is +represented by the 'Env' interface class (_base/env.h_). The environment is +provided to the component as argument to the 'Component::construct' +(_base/component.h_) function. + +:deprecated global 'env()' accessor function: + + During the migration phase to the new API, the 'Genode::env()' is still + available. But it will ultimately vanish from the API. + +Each component is equipped with an initial 'Entrypoint' (_base/entrypoint.h_) +that is accessible via 'Env::ep()'. Each entrypoint is able to respond to +both RPC requests and signals. The 'Component::construct' function is +executed in the context of the entrypoint. None of the entrypoint's RPC +objects or signal handlers will be called before returning from the +'Component::construct' function. + +:deprecated 'Rpc_entrypoint': + + The 'Rpc_entrypoint' should no longer be used by components directly. + Internally, the 'Entrypoint' is still using an 'Rpc_entrypoint' as + underlying mechanism for now, but the 'Rpc_entrypoint' will eventually + be removed from the API. + +:deprecated _os/signal_rpc_dispatcher.h_: + + The former 'Signal_rpc_member' is superseded by the new 'Signal_handler' + (_base/signal.h_). + + Signal-handling methods receive no longer a signal counter value as + arguments as there haven't been any convincing use cases for this + feature. In the contrary, it actually led to wrong design choices in the + past where the rate of signals carried information (such as the progress + of time) that should better be obtained via an explicit RPC call. + +:deprecated connection constructors without 'Env' argument: + + To eliminate the reliance on the deprecated global 'env()', all connection + objects have to take a reference to the component's environment as + argument. The original constructors are marked as deprecated. Once we have + completely abolished the use of the global 'env()', we will remove them. + + +Consolidation of core's SIGNAL, CAP, RM, and PD services +======================================================== + +With the new API, each component implicitly requires a session to core's CAP +service (to be able to handle RPC requests by the entrypoint) and a session to +the SIGNAL service (to dispatch signals by the entrypoint). Therefore, the +separation of these services serves no purpose any longer. To simplify the +API, the former SIGNAL, CAP, RM, and PD services are now integrated into the +PD service. This change has several benefits: + +* It reduces the API complexity, +* It reduces the component-startup costs because only one session must + be created instead of four. +* It reduces policy with respect to the dimensioning of the various + session quotas. + +In order to unify the API across all different base platforms, the PD +session interface contains no kernel-specific parts any longer. There +is now a dedicated sub interface called 'Native_pd' that accommodates +such needs. A capability to this kernel-specific interface can by +requested via the 'Pd_session::native_pd' accessor method. The kernel-specific +interfaces are named 'Nova_native_pd', 'Foc_native_pd', and 'Linux_native_pd'. + +:deprecated _cap_session_: + + With the integration of the CAP service into the PD service, the CAP session + interface ceased to exist. However, there are still old-style components + that manually create a 'Cap_connection' to be passed as argument to an + 'Rpc_entrypoint'. To avoid breaking those components, we keep a pseudo + 'Cap_connection' around. But the implementation does not actually create + a session but merely returns the PD session interface of the component, + which coincidentally matches the argument type of the 'Rpc_entrypoint'. + +:new _region maps_ replace former RM sessions: + + The functionality of the former RM sessions has moved to the region-map + interface, which is an RPC interface but not a session. + Each PD session contains 3 region maps, one for the entire virtual + address space, one for the stack area (formerly called thread-context + area), and one for the linker area. The new RM service is merely + responsible for the provisioning of managed dataspaces but is no longer + used by regular components. + + As a minor refinement, the 'Fault_type' enum values are now part of the + 'Region_map::State' struct. + + +New log-output facilities +========================= + +Throughout Genode, we used to rely on C-style format strings for the output of +diagnostic information and for the assembly of strings. There are many +shortcomings of this approach such as the limitation of the printable types to +the built-in format-string specifiers, the lack of type safety, and the +mismatch between the implementation and the intuitive expectations by the API +users (who usually expect POSIX compliance). + +With the current release, we introduce the new log-output facility _base/log.h_ +that will ultimately replace the original set of convenience macros PDBG, +PWRN, PERR, PINF by C++ function templates using variadic template arguments. +The function templates are plainly called 'log', 'error', and 'warning' +residing in the 'Genode::' namespace. The replacement for 'PDBG' must be a +macro in order to encode the calling function name into the string. As of now, +this functionality is not yet covered by _base/log.h_. + +The header _base/output.h_ contains the mechanics for the extraction of a textual +representation from values and object instances. It provides the abstract +'Output' interface to be implemented by a consumer of text. +Functions for generating output for different types are named 'print' and +take an 'Output &' as first argument. The second argument is a 'const &' +to the value to print. Overloads of the 'print' function for commonly +used basic types are readily provided. The following example illustrates how +'print' functions for custom types may be used. + +! enum Test_state { STATE_0, STATE_1 }; +! static void print(Genode::Output &output, Test_state const &state) +! { +! switch (state) { +! case STATE_0: output.out_string("STATE_0"); break; +! case STATE_1: output.out_string("STATE_1"); break; +! } +! } +! ... +! Test_state state; +! state = STATE_0; Genode::log("test: ", state, " = ", (int)state); +! state = STATE_1; Genode::log("test: ", state, " = ", (int)state); + +Furthermore, there is a function template that is used if none of the +type-specific overloads match. This function template expects the argument to +be an object with a 'print' method. In contrast to a plain 'print' function +overload, such a method is able to incorporate private object state into the +output. + +The component's execution environment provides an implementation of the +'Output' interface that targets a LOG session. This output back end is +offered to the component in the form of the 'log', 'warning', and 'error' +functions that accept an arbitrary number of arguments that are printed +in a concatenated fashion. Each messages is implicitly finalized with a +newline character. + +:deprecated _base/printf.h_, _base/console.h_, and _base/snprintf.h_: + + The goal of the new output facilities is the complete removal of format + strings from the Genode API. Hence, the listed headers should be + avoided. + + +XML processing +============== + +Since the first version, Genode's init component relied on configurations in +an XML-like syntax. For a long time, however, we remained hesitant to make the +base system (core and the base API) inherently dependent on XML. For the most +part, this hesitance was founded on our observation that XML tends to be +disliked in systems-programmers circles. However, over the years, XML +organically became the predominant syntax for component configuration as well +as for the propagation of state between components. Whereas the syntactical +merits of XML are highly subjective and perhaps debatable, the beauty of using +XML within Genode lies in its consistent application. For example, it allows +us to naturally embed a component configuration in another component's +configuration without even thinking about it. Much of Genode's flexibility +that we enjoy today can be attributed to this coherency. Granted, this +argument would apply just as well to alternatives such as JSON or +s-expressions. But we have to take one choice and stick to it. +Whereas we found that XML satisfies our needs and actually never stands +in the way, the impact on the code complexity is negligibly. Our XML parsing +and generating utilities are in the order of 700 lines of code. + +With this perspective, we take now the deliberate decision to make XML mandatory +for even the lowest-level parts of the framework. For example, even the +dynamic linker obtains the policy for diagnostic output from an XML-formatted +configuration. Consequently, we moved the XML utilities to +_base/include/util/_. + +To ease the use of the XML parsing utilities, we also added the accessors +'Xml_node::type' and 'Xml_attribute::name' that return 'Genode::String' +objects. + +:changed constructor of 'Reporter': + + One prominent use of XML is the reporting of state information from + components to a report service. Most components facilitate the + 'Genode::Reporter' for this job. Originally, the report name was used + implicitly as the top-level XML node type of the report. This is inconvenient + if one component needs to generate various XML reports under various names + (e.g., to steer consumers/clients slightly differently) but with the same XML + node tree structure. To accommodate those needs, the 'Reporter' now takes the XML + node type and the report label as two distinct arguments. + + +Dataspace helpers +================= + +The use of dataspaces, e.g., for setting up shared memory between components, +involves typical sequences of operations, e.g., for attaching the dataspace to +the local address space. The 'Attached_*_dataspace' +utilities located at _os/include/os/_ take care of these technicalities. +With the current release, we promote them to become part of the base API. +Thereby, we can leverage those utilities even for the lowest-level +components and internally within the framework. On that account, the +corresponding header files were moved to _base/include/base/_. + +:changed constructors of 'Attached_*_dataspace' utilities: + + Originally, the dataspace utilities relied on side effects via the + 'Genode::env()' accessor. To break away from this bad practice, the + new versions have constructors that take all needed resources as explicit + arguments. The original constructors are scheduled for removal. + +The most common use case of 'Attached_rom_dataspace' is the consumption +of XML-formatted data. To accommodate this common pattern, we equipped +the 'Attached_rom_dataspace' with an accessor plainly named 'xml'. +It always returns a valid 'Xml_node' even in the event +where the dataspace is invalid or contains no XML. In such cases, the returned +XML node is ''. This way, we spare the caller the handling of +exceptions that may occur during XML parsing. +With this change in place, a configuration attribute can be obtained as follows: + +!Genode::Attached_rom_dataspace config(env, "config"); +!... +!bool const verbose = config.xml().attribute_value("verbose", false); + +:deprecated _os/config.h_: + + Since it has become so easy to consume XML from ROM sessions, the role of the + former 'Genode::config()' interface has become largely obsolete. In line + with our goal to eliminate global side effects, the _os/config.h_ has + become deprecated. + + +Thread API and CPU-session interface +==================================== + +The thread API and the CPU-session interface underwent a major revision. + + +CPU session interface +--------------------- + +:Assigning threads to a PD at their creation time: + + We replaced the former 'Pd_session::bind_thread' method by a + PD-capability argument of the 'Cpu_session::create_thread' method, and + removed the ancient thread-start protocol via 'Rm_session::add_client' and + 'Cpu_session::set_pager'. Threads are now bound to PDs at their creation + time and implicitly paged according to the address space of the PD. + +:New 'Cpu_session::Weight' type: + + The new type replaces a formerly used plain integer value to prevent the + accidental mix-up of arguments. + The enum definition of 'Cpu_session::DEFAULT_WEIGHT' moved to + 'Cpu_session::Weight::DEFAULT_WEIGHT'. + +:Separation of platform-specific operations from generic CPU session: + + The CPU session interface has been unified across all platforms. The + former differences were moved to respective "native-CPU" interfaces + analogously to how the 'Native_pd' interface is separated from the + 'Pd_session' interface. + +:Separation of thread operations from CPU session: + + The former CPU-session interface contained a number of operations + that took a thread capability as first argument. Those thread-manipulation + operations are now accessible as RPC functions on the thread capability + directly. + + A noteworthy semantic change is the meaning of the former + 'exception_handler' RPC function, which used to define both the default + exception handler or a thread-specific signal handler. Now, the + 'Cpu_session::exception_sigh' function defines the CPU-session-wide + default handler whereas the 'Cpu_thread::exception_sigh' function + defines the thread-specific one. + + +Thread API +---------- + +Most regular components no longer need to use the thread API directly. +Instead, the 'Entrypoint' (which is a thread) should be used whenever possible. + +:removed details from _base/thread.h_: + + We moved the details about the stack allocation and organization from the + public API to framework-internal headers and replaced the notion of + "thread contexts" by "stacks" as this term is more intuitive. + +:renamed and removed classes, new constructors: + + The former 'Thread<>' class template has been renamed to + 'Thread_deprecated'. Threads with the stack supplied as template argument + should no longer be used. The stack size should always be passed as + constructor argument. + + The former 'Thread_base' class is now called 'Thread'. + + The new Thread constructor takes an 'Env &' as first argument, followed + by the thread's parameters such as the affinity and scheduling weight. + The original constructors are now marked as deprecated. For the + common use case where the default 'Weight' and 'Affinity' are + used, a shortcut is provided. In the long term, those two + constructors should be the only ones to remain. + + A new 'name()' accessor returns the thread's name as 'Name' + object as centrally defined via 'Cpu_session::Name'. It is meant to + replace the old-fashioned 'name' method that takes a buffer and size + as arguments. + + +Child management +================ + +The 'Child' class has been adapted to the changed core services and partially +redesigned to enable the implementation of single-threaded runtime +environments that virtualize the CPU, PD, and RAM services. It thereby has +become free from side effects. I.e., instead of implicitly using +'Genode::env()->rm_session()', it takes the reference to the local region map +as argument. Also, the handling of the dynamic linker via global variables is +gone. Now, the linker binary must be provided as constructor argument. + + +Stylistic changes +================= + +:'Heap', 'Sliced_heap', 'Root_component': + + We added new constructors to these classes that take references, not + pointers, as arguments. The old constructors will be removed with the + next release. + +:Naming of boolean getter methods: + + We already follow a convention about the naming of accessor methods (not + using any get_ or set_ prefixes). However, we sometimes used an "is_" prefix + for getter functions of boolean values, but not always. Examples are + 'Capability::valid()' and 'Weak_ptr::is_valid()'. + + In the name of the principle of least surprise, we introduced the convention + to not use an "is_" prefix for such methods. We adjusted all occurrences + within the Genode code base accordingly. To maintain API compatibility + during the transitional phase, we also keep the original methods until the next + release. + +:Alleviating the need for manually constructed type lists: + + The 'GENODE_RPC_INTERFACE' macro of the RPC framework had a limitation + with respect to the number of RPC functions per RPC interface. As a + workaround for this limitation, large session interfaces had to manually + define the type list of RPC functions out of nested type tuples. With the + current release, we removed this limitation. + + +Removed and to-be-removed APIs +============================== + +:removed _base/crt0.h_ and _base/elf.h_: + + Those headers are internally needed by the framework but contain no + actual value at the API level. Therefore we removed them from the + public API. + +:removed _base/process.h_: + + The 'Process' class encapsulated the platform-specific steps to start + a Genode component from a given ELF file. The original intention of + placing this low-level functionality into a dedicated class was to allow + for different flavours of child-management policies. In practice, however, + the 'Process' remained solely being used by the 'Genode::Child'. Since + the core-interface changes of Section + [Consolidation of core's SIGNAL, CAP, RM, and PD services] + required us to rewrite the component-creation code anyway and we aspire to + narrow the API, we took the chance to make 'Process' private to the 'Child'. + Thereby, the rather ambiguous term "process", which we avoid in the context + of Genode by speaking of "components" instead, is eliminated from the public + API. + +:discourage use of _util/arg_string.h_: + + The 'Arg_string' utilities are used to generate and parse session-argument + strings. However, to make Genode more coherent and session arguments more + flexible and robust, we plan to replace the current argument-string + syntax with XML, eventually removing the argument-string support. Hence, + we discourage the use of 'util/arg_string.h'. + +:discourage use of _base/signal.h_: + + The introduction of the new 'Entrypoint' eliminates the need to manually + create and use 'Signal_receiver' objects. Right now, we still rely on the + original signal API as backend of the 'Entrypoint' but we will eventually + remove the current notion of signal receivers. The narrower semantics of the + 'Entrypoint' will then allow for performance optimizations that are not + possible with the traditional signal receivers. Therefore, we discourage the + direct use of 'Signal_receiver'. + + +Low-level OS infrastructure +########################### + +Enhanced GDB support on NOVA +============================ + +During the practical work with the GDB monitor (our Genode port of the GNU +'gdbserver' application) and our nightly automated execution of the +'gdb_monitor.run' test, it turned out that there are still situations that +the GDB monitor cannot handle correctly. Since the error symptoms often occured +sporadically and it was not obvious whether the cause of the error was located +in the Genode-specific adaptations of the gdbserver code or in the platform- +specific functionality of the Genode base system. As a first step to improve the +stability of the debugger we tried to remove existing Genode-specific code +from the gdbserver codebase and emulated the Linux-specific C interface +instead. This involved a GDB-monitor-local implementation of the +'waitpid()' which is documented relatively well. In the +case of an error, there would be a better chance of comparing the GDB monitor- +internal execution sequence with a corresponding test case on the Linux version +of gdbserver. + +The emulation of this interface is not trivial, though, because the behavior of +the Linux kernel often differs from the behavior of the Genode base components. +For example, when debugging a Linux program, a new thread created by the +debug target gets stopped automatically by the Linux kernel, the 'waitpid()' +function then reports a SIGSTOP signal for the new thread and a SIGTRAP signal for +the creating thread to the gdbserver. This behavior does not match at all with +the design of the Genode base system. Therefore, we emulate it in the GDB monitor +with the help of a software breakpoint on the first instruction of the new +thread and an artificial creation of the corresponding SIGSTOP and SIGTRAP +signal reports. + +While implementing this mechanism on the NOVA base platform, we encountered +several NOVA-specific corner cases. On NOVA, an RPC server is implemented by a so-called +"local ECs" - a NOVA thread, which only responds to IPC and has no execution +time of its own. When creating a local EC, the initial instruction pointer as +passed to the 'Cpu_thread::start' function is always 0. The real instruction +pointer is defined by a so-called NOVA portal used for calling the local EC. To +determine the correct start address of the thread - as needed by GDB monitor to +set the initial breakpoint - changes if the NOVA base system were necessary. + +The next show stopper was an attempt by GDB monitor to pause a +thread of the debug target could block for quite some time if the particular +thread was currently blocking in a NOVA syscall. +We also found that GDB monitor could block for quite some time when trying to +pause a debug target. This behavior was caused by the targeted thread being in a +system call, and therefore within the NOVA hypervisor, by the time of pausing. +In that case, the +'Cpu_thread::pause' call returned only after the particular thread got +executed in userland again, because only then the current register state of +the thread can be transferred into userland for retrieval by GDB. +We solved this problem by extending the NOVA kernel, which makes it possible +to obtain the current register state of a to-be-paused thread immediately +whenever possible. + +Furthermore, the NOVA-specific changes for GDB enable the debugger to +modify register values and to debug 64-bit applications. + +As reference, the 'ports/run/gdb_monitor.run' script demonstrates and tests a +selection of the features supported by GDB on Genode. + + +New support for the Rust programming language +============================================= + +[https://www.rust-lang.org/ - Rust] is a systems programming language that +currently gains a lot of popularity. It eliminates entire classes of bugs by +enforcing memory safety. Unlike languages that rely on a garbage-collecting +runtime, compiled Rust programs are able to run on bare-metal hardware. This +makes Rust an attractive language for low-level system components. + +The current Genode release introduces basic support for executing +Rust programs as Genode components. This support includes the +build-system integration, the configuration of the LLVM-based Rust +compiler, and the port of the low-level language runtime. A simple example is +provided via the _libports/run/rust.run_ script and the accompanied code at +_libports/src/test/rust/_. The example runs on the x86 (32 and 64 bit) and +ARM architectures. + +The port uses the nightly-built rust tool chain from 2016-03-03, so the +nightly compiler from that day is guaranteed to work. It can be downloaded +with via the following command: +! curl -sSf https://static.rust-lang.org/rustup.sh |\ +! sh -s -- --channel=nightly --date=2016-03-03 +Alternatively, it can be +[https://static.rust-lang.org/dist/2016-03-03/index.html - manually downloaded]. + +Thanks to Waylon Cude for bringing Rust to Genode! + + +Dynamic linker +============== + +The dynamic linker will now check if the binary pointer is valid before +attempting to lookup a symbol. Shared objects with unresolved symbols and +missing dependencies, e.g., a library that references 'errno' but is not linked +against libc, will now produce an error message when they are loaded by the +dynamic linker instead of triggering an ominous page-fault. + + +New component for writing ROM modules to files +============================================== + +The ROM-to-file component at _repos/os/src/app/rom_to_file_ requests a ROM +session and writes the content of the ROM dataspace to a file of a file-system +session. It is able to respond to configuration and ROM-module updates. The +name of the ROM module must be specified via the 'rom' attribute of the +component's '' node: + +! + +See _run/rom_to_file.run_ for an example. + +Thanks to Johannes Schlatow for this contribution! + + +C runtime +========= + +Sysctl +~~~~~~ + +The libc sysctl was replaced with an extensible implementation that reads +values from the _/.sysctl_ directory when present. This interface is +convergent with the _/proc/sys_ directory on Linux and allows sysctl +values to be modified by the local component or by an external component +through a common file system. + + +libc_pipe plugin +~~~~~~~~~~~~~~~~ + +The new 'libc_pipe' plugin provides a more accurate implementation of pipes +(using a ring buffer) and replaces the existing 'libc_lock_pipe' plugin. + + +Device drivers +############## + +In this release, we updated several device drivers ported from +foreign OSes. In addition, we consolidated all drivers in the _dde_linux_ +repository by utilizing a new modular _lx_kit_ and made sure that each driver +is using the same Linux version now. + + +HDA audio driver update +======================= + +The audio driver was synced with version 5.9 of OpenBSD. In addition to +updating the contrib sources, the driver now uses the new component API +and reports the internal mixer state. + +Reporting of the mixer state is enabled by adding the 'report_mixer' +attribute to the drivers configuration and setting its value to 'yes'. + +The following snippet illustrates the format of the report: + +! +! +! +! +! +! +! + +The mixer state can expose other mixer fields as well, depending on the +used hardware. The naming scheme of the attributes intentionally matches +the naming scheme of OpenBSD's mixerctl(1) program. + +In return, 'mixer' nodes may be used to configure the audio driver by +specifying it in the configuration, e.g.: + +! +! +! + +will set the output volume to the highest possible value. Although it is +now also possible to update the configuration at run time, this should +be done with care. Updating the configuration while the driver is playing +or recording may provoke audible artifacts. For now it is best to use the +mixer component to regulate the volume rather than adjusting the audio +driver directly. + + +Linux kit +========= + +Over the years, the way we handled our DDEs has changed. By now it became +clear that it is easier to manage ported drivers without having to rely a +generic API like dde_kit. Using Genode primitives directly enabled us to +specially tailor each DDE to the driver in question. That being said, +when having four different drivers (intel_fb, lxip, usb and wifi) and each +one with its own specially tailored DDE, the amount of redundant code became huge. +We created the lx_kit that enables us to share code across the drivers to +address this issue. Thereby we reduced the amount of redundant code. + +This modular lx_kit separates the required back-end functionality of the +Linux emulation environment from the front end. Thereby each driver can +reuse generic parts and supply more suitable implementations by itself. +It is split into several layers whose structure is as follows: + +The first layer in _repos/dde_linux/src/include/lx_emul_ contains those +header files that provide the structural definitions and function +declarations of the Linux API, e.g. _errno.h_ provides all error code +values. The second layer in _repos/dde_linux/src/include/lx_emul/impl_ +contains the implementation of selected functions, e.g. _slab.h_ +provides the implementation of 'kmalloc()'. The lx_kit back end API is +the third layer and provides the _Lx::Malloc_ interface +(_repos/dde_linux/src/include/lx_kit/malloc.h_), which is used to +implement 'kmalloc()'. There are several generic implementations of the +lx_kit interfaces that can be used by a driver. + +A driver typically includes a 'lx_emul/impl/xyz.h' header once +directly in its lx_emul compilation unit. The lx_kit interface files +are only included in those compilation units that use or implement the +interface. If a driver wants to use a generic implementation, it must +add the source file to its source file list. The generic +implementations are located in _repos/dde_linux/src/lx_kit/_. + +The modular lx_kit still depends on the private _lx_emul.h_ header file +that is tailored to each driver. Since the lx_kit already contains much +of the declarations and definitions that were originally placed in +these private header files, those files can now omit a large amount +of code. + + +Wifi driver update +================== + +The wifi_drv was updated to Linux version 4.4.3 and thereby adds support for +Intel 8xxx wireless cards. In order to ease debugging, the driver now +enables its debugging messages when the 'verbose' attribute in its '' +node is set to 'yes'. + + +USB driver update +================= + +The USB driver was updated to Linux version 4.4.3 and like the other drivers +incorporates the modular lx_kit. The new driver exposed problems with the +EHCI controller on older systems, namely the Thinkpad X201. Using the new USB +driver on this machine would freeze the system when 'USB legacy Support' is +enabled in the BIOS. The fix is to conduct a so-called USB hand-off that informs +the BIOS that the OS wants to drive the USB host-controller and waits until +the BIOS has acknowledged the request. Unfortunately, applying this quirk +produces problems on certain xHCI host-controllers when using the IOMMU. In +this case the driver tried to perform the hand-off request but got stuck while +writing to the PCI config space. After about 20 seconds, we observed a DMA fault and +the initialization of the USB driver went on. Presumably at this point the BIOS +tries to access certain memory regions that - by now - are protected by the IOMMU. +When using the IOMMU, we already take precautions, i.e., we look at the RMRR +regions and instruct the kernel to configure the IOMMU for specific devices +accordingly. We looked at the ACPI RMRR region of the USB on the machine in +question and could confirm our suspicion: the registered USB RMRR region is +indeed too small. For all we know, that sounds like a bug in BIOS or rather +ACPI tables. To accommodate systems that nonetheless need the hand-off quirk +and the user wants to use the IOMMU, we added the handling of a 'bios_handoff' +attribute to the USB driver configuration. When set to 'no' the driver will not +perform any hand-off request. The default setting is 'yes'. If you experience +any issues with the new USB driver, disabling the hand-off is advised. + +While updating the driver, a regression on the Raspberry Pi was introduced. +USB devices that use IRQ endpoints, e.g. USB HID devices, do not work +reliably. This issue is still unresolved and dealing with it is postponed +until after the release. + +Furthermore, the USB session used for implementing native USB device drivers +propagates an EP stall error to the client and clears the stall condition by +resetting the EP now. + + +Intel graphics driver update +============================ + +The Intel graphics driver introduced in Genode release 15.11 was updated to +Linux version 4.4.3. The most prominent, functional improvement is support for +Intel Skylake graphics cards. +Internally, we slimmed the code parts used from the Linux kernel by resigning +the ancient framebuffer and framebuffer console layer. The new driver only uses +the more modern DRM layer of the Linux kernel. As a side effect, all formerly +available heuristics that were applied at initialization time or whenever a +display got connected are not part of the driver anymore. Now, the driver only +reports any state changes like additional available displays via its report +session. On the other hand it always updates the graphics configuration whenever +its config ROM module changes. + +To automatically control the graphics driver during display connection +changes, an example component named intel_fb_controller is now available at +_repos/dde_linux/src/test/framebuffer/intel_. This component reacts on report +changes of the Intel graphics driver and configures it in a way that all +available displays are showing one and the same framebuffer with their maximum +resolution. Thereby displays with a minor resolution show the upper left corner +of the whole framebuffer. + + +Enhanced ACPI support +===================== + +Modern PCs provide an enormous number of ways to monitor and configure the +system via the Advance Configuration and Power Interface (ACPI) +Specification. +Since version 12.02, we have already a basic ACPI driver in Genode, +which is mainly used to look up low-level data via some clever +pattern-matching heuristics. These information, like interrupt remapping, are +sufficient to bootstrap and setup the Genode user-level part of the system. We +wanted to go beyond this feature set and leverage further - dynamic - +aspects of ACPI such as system state changes of batteries in notebooks or lid +status. + +The [https://acpica.org - ACPI Component Architecture project ACPICA] develops and +maintains an operating-system-independent reference implementation of ACPI, +which can be used by operating systems like Genode to utilize the full +functionality of modern PCs. So we took the reference implementation of +ACPICA and ported it to Genode. The port itself was relative straight forward +and really a pleasure. The interfaces and abstractions to the operating system +are well chosen by the ACPICA project, clearly documented, and a porter is well +guided by extensive explanatory documentation. + +The port is hosted in the libports repository as a standalone library +without any additionally dependencies (beside Genode's base library). To utilize +and experiment with the ported library, we started to develop a Genode +application called app/acpica, which utilizes the library. We experimented and +managed to enable the ACPI lid, ACPI embedded controller (e.g. Fn keys), +ACPI AC adapter, ACPI smart battery subsystem, and ACPI fixed events, +e.g., power button, on some modern Intel Skylake notebook and partly also on +some older Lenovo machines, e.g. X201. Additionally, we added support to reset +and power-off machines via ACPI. + +ACPI state changes are reported by the acpica application by setting the +config attribute 'report' to "yes". + +! +! +! ... + +Whenever such a state change is detected, the application generates the +appropriate report named 'acpi_lid', 'acpi_ac', 'acpi_battery', +'acpi_ec' or 'acpi_fixed'. The detailed content of the reports is +documented in the README of app/acpica or can be manually experienced by +trying out the _acpica.run_ script in the libports repository. + +In order to reset or to power-off machines, the config attribute 'reset' +respectively 'poweroff' must be set to "yes", as shown before. If one of both +attributes is configured, app/acpica opens a ROM session called "system" +and monitors changes of that ROM. The ROM must be XML in the following form: + +! + +If the state attribute is set to "reset" or to "poweroff", app/acpica will +try to reset respectively power-off the machine immediately. The operation may +fail if the hardware resources are owned by some other components in the +Genode system. E.g., on some machines we tested, the reset operation fails +because the required I/O ports are owned and are used by the x86 platform +driver. For such cases, we extended the platform driver by an additionally +config parameter "system" which must be set to "yes", e.g.: + +! +! ... +! +! ... + +With this configuration in place, the platform driver also opens and monitors +the "system" ROM session and reacts upon a state change to "reset". If the +platform driver owns the required I/O ports, it will trigger the ACPI reset. + +In the current state, we still use our old simple ACPI driver to detect +basic necessary information for the x86 platform driver. The ACPI driver +reports all findings in form of a report, which is provided as a +ROM session to the platform driver. Later on, after the platform driver has +announced its service, the acpica application takes over the ACPI +functionality of our old ACPI driver and takes care of all dynamic ACPI events. + +It first looks a bit cumbersome, however the reasons are twofold. First, +we wanted to start to experiment with the acpica library without putting our +ACPI driver at danger. Second, we wanted to see where the complexity of the +additionally ACPI features leads us. If one is using sloccount, or cloc, as +complexity measure and applies the tool to the respectively folders, the +following numbers show up: + +! repos/os/src/driver/acpi/ ~1000 +! contrib/acpica-/ ~120000 ACPICA library +! repos/libports/src/lib/acpica/ ~600 Genode-specific ACPICA libary support code +! repos/libports/src/app/acpica/ ~1000 application using the ACPICA Genode port + +Of course, the numbers are inaccurate and the comparison is unfair since +we do not take into account, which files of the acpica library are actually in +use. Furthermore we can get more functionality with the acpica library, which +we never could achieve with our own basic ACPI driver implementation. However, +the point here to be made is, that we have to add much complexity to get a full +ACPI capable system and that solely a small amount of the complexity actually +is really required to drive an operating system like Genode. + + +Generalized SDHCI driver +======================== + +The SDHCI driver was originally created for the Raspberry Pi. However, the +same host controller is used also in other platforms, in particular Xilinx +Zynq. Hence, the existing driver was generalized to become usable on such +platforms. Thanks to Timo Wischer for this contribution. + + +Libraries and applications +########################## + +LxIP update +=========== + +LxIP is the port of the Linux TCP/IP stack as a library on Genode. +Along with the work described in Section [Linux kit], LxIP was updated to +Linux version 4.4.3 and uses the lx_kit now. + + +Qemu USB +======== + +The QEMU USB library handles EP stalls now. In particular, this fix +enables the use of USB storage devices in VirtualBox that do not support certain +SCSI commands, e.g. READ_FORMAT_CAPACITY, and will stall if they receive +such a command. Windows guests typically use the aforementioned command to +check if the USB storage device in question is in fact an USB floppy drive. + + +Platforms +######### + +Generalization of platform-specific headers +=========================================== + +In anticipation of the planned binary compatibility of Genode components +across different kernels, we unified most parts of Genode's base API and +largely removed the dependency on platform-specific types. The most profound +change is the interface of the IPC library, which used to depend on +platform-specific message-buffer layouts. +Besides unifying the message buffer classes across all platforms, we +reconsidered the roles of the IPC-library classes such as 'Ipc_marhsaller', +'Ipc_server', and 'Ipc_client'. This led to several additional simplifications in +the server-loop implementations, which makes the flow of control and +information much more obvious, yet is also more flexible. I.e., on NOVA, we +don't even have the notion of reply-and-wait. Now, we are no longer forced to +pretend otherwise. + + +NOVA microhypervisor +==================== + +The kernel received minor adjustments because of the ACPI work. One curious +performance issue, we actually detected and hunted before our ACPICA +library work. It happens that a modern Intel Skylake notebook +(Core i 6th generation) running Genode/NOVA scenarios like noux tool-chain or +Virtualbox performed really bad - sometimes it was only as fast as a 1th +generation Intel Core CPU as used in X201 notebooks. After some mysterious +hunting of possible reasons, it finally turned out that the UEFI vendor did +not disable ACPI GPE (General Purpose Events) events properly when handing +over control to the boot loader and kernel. As soon as the NOVA kernel enabled +the ACPI interrupt (normally IRQ 9) because it utilizes the ACPI PM timer +feature, the kernel got a storm of GPE interrupts, which got not handled properly. +Still the system was alive and made progress, but the performance was really +bad. We changed the kernel to disable all event sources enabled in the +ACPI GPE0/1 registers. Beside that, using the acpica application also solves +the performance issue, since the library also resets the GPE registers during +initialization. However, currently the acpica application is optional and not +loaded in all scenarios. + +On 64 bit, NOVA supports the so called PCID feature, aka tagged TLB. The hardware +actually supports up to 4096 processes at a time, which can be used with tagged +TLBs. Unfortunately the original PCID allocator wrapped after 4096 PCIDs, +which caused - beginning with the 4097th process - to accidentally re-use the +same PCIDs and therefore the same TLB entries of long living processes, +like kernel, core, init, and drivers. This leads to the interesting phenomena of +bugs. We changed the allocator from a monotonic increasing number to a bit +allocator, maintaining the used and free PCIDs more accurately. + +Additionally, we extended the kernel to support scenarios on Genode +where capabilities are forwarded from a capability sender to a capability +receiver through one or more intermediary components (like servers). In such +scenarios, the intermediary components don't need the forwarded capability for +some reasons and want to free and re-use the used capability index. +Unfortunately, or actually intentionally, the syscall 'revoke' will not just +revoke the local capability but all subsequent derived capabilities. Because of +this kernel behaviour, we had several quirks in Genode/base-nova, especially in +the user level capability map implementation and in the Genode entrypoint reply +handling code to deal with such situations. With all the Genode base API +changes and unification efforts of all Genode base platforms, the quirks +became obvious obstacles. With this release, we added support to the kernel, to +just locally 'drop' the accessibility to the unneeded capability, but not the +accessibility of the so far subsequent derived capabilities. With the kernel +extension, we were able to remove the mentioned base-nova quirks. + + +Execution on bare hardware (base-hw) +==================================== + +For running Genode scenarios on our custom kernel (base-hw), two hardware +timers are needed. One timer is used by the kernel as the basis for the +preemptive scheduling. The other timer is used by the user-level timer +driver as the timing source for user-level components. + +On NOVA, we gathered good experiences with using the kernel's scheduling +timer as the basis for the user-level timer. Eliminating the need for +a real timer device driver (like for the PIT on x86) reduces the overall +complexity. The interrupt load becomes lower without the userland triggering +timer interrupts. And since the kernel uses CPU-core-local timers (i.e. the +local APIC timer on x86) as opposed to a global timer in the userland, +expensive cross-CPU-communication is avoided. + +With the current release, we applied the lessons learned to our base-hw +kernel. As a further motivation, the removal of the dependency on a +timer device clears the way to run multiple Genode instances on top of +the Muen separation kernel. + +The timeout feature has the form of a new 'timeout' system call that binds +a signal context to a timeout. Hence, timeouts are delivered asynchronously, +like interrupts, to the user-level timer service. The actual time can be +requested via the 'timeout_age_us' system call, which returns the time +since the last timeout was installed. + + +Linux +===== + +The main purpose of Linux as Genode base platform are rapid prototyping and +the development of components that do not depend on specific hardware +properties. During early development (at least with C++) the most prevalent +fatal bugs result in segmentation faults due to invalid pointers or +insufficient stack size. Unfortunately, our platform code for Linux did not +disclose much information about the exceptions that may occur and even +remained silent about errors in some situations. With this release, we improve +the exception-signal handling and use an alternate signal stack. The alternate +stack ensures in almost all cases that Linux applications are able to handle +exceptions including segmentation faults caused by stack overflows. We also +enabled this facility for hybrid Linux applications. + + +Tools and build system +###################### + +Usability improvements of the ports tools +========================================= + +The ports tool set introduced in +[https://genode.org/documentation/release-notes/14.05#Management_of_ported_3rd-party_source_code - Genode 14.05] +has become an integral part of the work flow for Genode developers. +With the current release, we improve the usability of the _prepare_port_ tool +in two respects. First, the tool now accept a list of ports instead of +merely a single argument. This alleviates the need to manually re-execute +the tool with different arguments. Second, if the build system encounters +a missing port, it no longer backs out immediately but collects all the +(potentially more than one) missing ports that are required for the build. +It then presents the user with a ready-to-use command to install all +missing ports at once, which greatly improves the experience of working with +sophisticated system scenarios. For example, when attempting to execute +the _virtualbox.run_ script with a freshly cloned Genode source tree, +the build system produces the following error message: + +!Error: Ports not prepared or outdated: +! dde_linux libc libiconv nova qemu-usb stdcxx virtualbox x86emu +! +!You can prepare respectively update them as follows: +! .../prepare_port dde_linux libc libiconv nova qemu-usb stdcxx virtualbox x86emu + +Furthermore, one may state the number of ports that +shall be prepared in parallel at a max by using the -j parameter. If -j +is not set by the user, the tool acts as with -j1. + +Since the _prepare_ports_ tool has completely replaced the former +"make prepare" mechanism, we finally removed the last traces of the old +mechanism in the form of the makefiles present in the respective source-code +repositories. + + +Updated tool chain +================== + +Genode 16.05 requires a tool-chain update, which can be downloaded as +[https://sourceforge.net/projects/genode/files/genode-toolchain/ - precompiled binary archive] +for 32-bit and 64-bit Linux or built according to the +[https://genode.org/download/tool-chain - tool-chain documentation]. +With the updated tool chain, we enable the '__cxa_demangle()' function to be +able to print user-readable names of uncaught exceptions. In the course of our +GDB improvements, we enhance the x86 debugging support for 64-bit and update +the required GDB tools. Furthermore, we added the RISC-V relevant tools to the +binary archive to ease developing Genode components for this platform. + + +Removal of stale features +######################### + +We originally added chroot support to the Linux version of Genode to +accommodate the use of Genode as middleware on Linux. We enabled the +configuration of custom UIDs, GIDs, and chroot paths for components started by +init. However, apart from a brief period of time when we experimented with +the idea, it is no longer pursued. Now, with our aspiration to attain binary +compatibility across kernels, we removed the Linux-specific chroot support.