mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-18 21:27:56 +00:00
base: de-duplicate src/lib/base/platform.cc
By splitting the 'init_capability_slab()' implementation to a separate compilation unit 'capability_slab.cc', base-hw no longer needs a customized version of 'lib/base/platform.cc'. Related to issue #4784
This commit is contained in:
parent
6e30d00eef
commit
0ab69a2bb8
@ -4,5 +4,6 @@ LIBS += syscall-fiasco base-fiasco-common cxx timeout
|
||||
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
SRC_CC += capability_space.cc
|
||||
SRC_CC += signal_transmitter.cc signal.cc
|
||||
|
@ -4,6 +4,7 @@ LIBS += base-foc-common syscall-foc cxx
|
||||
|
||||
SRC_CC += cap_map_remove.cc cap_alloc.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += signal_transmitter.cc signal.cc
|
||||
SRC_CC += stack_area_addr.cc
|
||||
|
@ -3,6 +3,7 @@ include $(BASE_DIR)/lib/mk/base.inc
|
||||
SRC_CC += log.cc
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += capability.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += raw_write_string.cc
|
||||
SRC_CC += signal_receiver.cc
|
||||
|
64
repos/base-hw/src/lib/base/capability_slab.cc
Normal file
64
repos/base-hw/src/lib/base/capability_slab.cc
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* \brief Capability slab management
|
||||
* \author Norman Feske
|
||||
* \date 2023-06-20
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2023 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#include <util/retry.h>
|
||||
#include <base/internal/globals.h>
|
||||
#include <base/internal/native_env.h>
|
||||
#include <hw_native_pd/client.h>
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
|
||||
static Parent *parent_ptr;
|
||||
static Pd_session::Native_pd *native_pd_ptr;
|
||||
|
||||
|
||||
void Genode::init_cap_slab(Pd_session &pd, Parent &parent)
|
||||
{
|
||||
static Hw_native_pd_client native_pd(pd.native_pd());
|
||||
|
||||
parent_ptr = &parent;
|
||||
native_pd_ptr = &native_pd;
|
||||
}
|
||||
|
||||
|
||||
void Genode::upgrade_capability_slab()
|
||||
{
|
||||
if (!native_pd_ptr || !parent_ptr) {
|
||||
error("missing call of 'init_cap_slab'");
|
||||
return;
|
||||
}
|
||||
|
||||
auto request_resources_from_parent = [&] (Ram_quota ram, Cap_quota caps)
|
||||
{
|
||||
/*
|
||||
* The call of 'resource_request' is handled synchronously by
|
||||
* 'Expanding_parent_client'.
|
||||
*/
|
||||
String<100> const args("ram_quota=", ram, ", cap_quota=", caps);
|
||||
parent_ptr->resource_request(args.string());
|
||||
};
|
||||
|
||||
retry<Genode::Out_of_caps>(
|
||||
[&] () {
|
||||
retry<Genode::Out_of_ram>(
|
||||
[&] () {
|
||||
native_pd_ptr->upgrade_cap_slab(); },
|
||||
[&] () {
|
||||
request_resources_from_parent(Ram_quota{8192}, Cap_quota{0});
|
||||
});
|
||||
},
|
||||
[&] () {
|
||||
request_resources_from_parent(Ram_quota{0}, Cap_quota{2});
|
||||
});
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
/*
|
||||
* \brief Environment initialization
|
||||
* \author Norman Feske
|
||||
* \author Christian Helmuth
|
||||
* \date 2006-07-27
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2006-2017 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#include <deprecated/env.h>
|
||||
#include <base/internal/platform.h>
|
||||
#include <base/internal/globals.h>
|
||||
#include <base/internal/native_env.h>
|
||||
#include <base/connection.h>
|
||||
#include <base/service.h>
|
||||
|
||||
#include <hw_native_pd/client.h>
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
static Platform *_platform_ptr;
|
||||
|
||||
|
||||
Env_deprecated *Genode::env_deprecated()
|
||||
{
|
||||
if (!_platform_ptr) {
|
||||
error("missing call of init_platform");
|
||||
for (;;);
|
||||
}
|
||||
|
||||
struct Impl : Env_deprecated, Noncopyable
|
||||
{
|
||||
Platform &_pf;
|
||||
|
||||
Impl(Platform &pf) : _pf(pf) { }
|
||||
|
||||
Parent *parent() override { return &_pf.parent; }
|
||||
Cpu_session *cpu_session() override { return &_pf.cpu; }
|
||||
Cpu_session_capability cpu_session_cap() override { return _pf.cpu.rpc_cap(); }
|
||||
Region_map *rm_session() override { return &_pf.rm; }
|
||||
Pd_session *pd_session() override { return &_pf.pd; }
|
||||
Pd_session_capability pd_session_cap() override { return _pf.pd.rpc_cap(); }
|
||||
};
|
||||
|
||||
static Impl impl { *_platform_ptr };
|
||||
|
||||
return &impl;
|
||||
}
|
||||
|
||||
|
||||
using Native_pd_capability = Genode::Capability<Genode::Pd_session::Native_pd>;
|
||||
static Native_pd_capability native_pd_cap;
|
||||
|
||||
|
||||
void Genode::init_parent_resource_requests(Genode::Env &env)
|
||||
{
|
||||
/**
|
||||
* Catch up asynchronous resource request and notification
|
||||
* mechanism construction of the expanding parent environment
|
||||
*/
|
||||
using Parent = Expanding_parent_client;
|
||||
static_cast<Parent*>(&env.parent())->init_fallback_signal_handling();
|
||||
native_pd_cap = env.pd().native_pd();
|
||||
}
|
||||
|
||||
|
||||
void Genode::init_platform()
|
||||
{
|
||||
static Genode::Platform platform;
|
||||
|
||||
init_log(platform.parent);
|
||||
init_rpc_cap_alloc(platform.parent);
|
||||
init_thread(platform.cpu, platform.rm);
|
||||
init_thread_start(platform.pd.rpc_cap());
|
||||
init_thread_bootstrap(platform.parent.main_thread_cap());
|
||||
|
||||
env_stack_area_ram_allocator = &platform.pd;
|
||||
env_stack_area_region_map = &platform.stack_area;
|
||||
|
||||
_platform_ptr = &platform;
|
||||
}
|
||||
|
||||
|
||||
void Genode::binary_ready_hook_for_platform() { }
|
||||
|
||||
|
||||
void Genode::upgrade_capability_slab()
|
||||
{
|
||||
if (!native_pd_cap.valid() || !_platform_ptr) {
|
||||
Genode::error("cannot upgrade capability slab, "
|
||||
"not initialized appropriatedly");
|
||||
return;
|
||||
}
|
||||
|
||||
auto request_resources_from_parent = [&] (Ram_quota ram, Cap_quota caps)
|
||||
{
|
||||
/*
|
||||
* The call of 'resource_request' is handled synchronously by
|
||||
* 'Expanding_parent_client'.
|
||||
*/
|
||||
String<100> const args("ram_quota=", ram, ", cap_quota=", caps);
|
||||
_platform_ptr->parent.resource_request(args.string());
|
||||
};
|
||||
|
||||
retry<Genode::Out_of_caps>(
|
||||
[&] () {
|
||||
retry<Genode::Out_of_ram>(
|
||||
[&] () {
|
||||
Genode::Hw_native_pd_client pd(native_pd_cap);
|
||||
pd.upgrade_cap_slab();
|
||||
},
|
||||
[&] () {
|
||||
request_resources_from_parent(Ram_quota{8192}, Cap_quota{0});
|
||||
});
|
||||
},
|
||||
[&] () {
|
||||
request_resources_from_parent(Ram_quota{0}, Cap_quota{2});
|
||||
});
|
||||
}
|
@ -6,5 +6,6 @@
|
||||
include $(BASE_DIR)/lib/mk/base.inc
|
||||
|
||||
SRC_CC += platform.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
|
||||
LIBS += syscall-linux
|
||||
|
@ -4,6 +4,7 @@ LIBS += base-nova-common cxx timeout
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += signal.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
|
||||
#
|
||||
# Prevent the compiler from deleting null pointer checks related to 'this == 0'
|
||||
|
@ -3,6 +3,7 @@ include $(BASE_DIR)/lib/mk/base.inc
|
||||
LIBS += base-okl4-common syscall-okl4 cxx timeout
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
SRC_CC += capability_space.cc
|
||||
SRC_CC += signal_transmitter.cc
|
||||
SRC_CC += signal.cc
|
||||
|
@ -4,6 +4,7 @@ LIBS += base-pistachio-common syscall-pistachio cxx timeout
|
||||
|
||||
SRC_CC += thread_start.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += capability_slab.cc
|
||||
SRC_CC += capability_space.cc
|
||||
SRC_CC += signal_transmitter.cc
|
||||
SRC_CC += signal.cc
|
||||
|
@ -1,6 +1,6 @@
|
||||
include $(BASE_DIR)/lib/mk/base.inc
|
||||
|
||||
SRC_CC += capability_space.cc
|
||||
SRC_CC += capability_space.cc capability_slab.cc
|
||||
SRC_CC += thread_start.cc thread_init.cc
|
||||
SRC_CC += cache.cc
|
||||
SRC_CC += signal_transmitter.cc signal.cc
|
||||
|
@ -31,6 +31,7 @@ namespace Genode {
|
||||
void init_exception_handling(Env &);
|
||||
void init_signal_transmitter(Env &);
|
||||
void init_signal_receiver(Pd_session &, Parent &);
|
||||
void init_cap_slab(Pd_session &, Parent &);
|
||||
void init_cxx_heap(Env &);
|
||||
void init_cxx_guard();
|
||||
void init_ldso_phdr(Env &);
|
||||
|
16
repos/base/src/lib/base/capability_slab.cc
Normal file
16
repos/base/src/lib/base/capability_slab.cc
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* \brief Capability slab init for kernels without an expandable cap space
|
||||
* \author Norman Feske
|
||||
* \date 2023-06-20
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2023 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU Affero General Public License version 3.
|
||||
*/
|
||||
|
||||
#include <base/internal/globals.h>
|
||||
|
||||
void Genode::init_cap_slab(Pd_session &, Parent &) { }
|
@ -67,6 +67,7 @@ void Genode::init_platform()
|
||||
|
||||
init_log(platform.parent);
|
||||
init_rpc_cap_alloc(platform.parent);
|
||||
init_cap_slab(platform.pd, platform.parent);
|
||||
init_thread(platform.cpu, platform.rm);
|
||||
init_thread_start(platform.pd.rpc_cap());
|
||||
init_thread_bootstrap(platform.parent.main_thread_cap());
|
||||
|
Loading…
Reference in New Issue
Block a user