diff --git a/include/swcr/services/cpu.h b/include/swcr/services/cpu.h new file mode 100644 index 0000000..99b781b --- /dev/null +++ b/include/swcr/services/cpu.h @@ -0,0 +1,53 @@ +#include +#include + +namespace SWCR +{ + class Cpu_session_component; + class Cpu_session_factory; +} + +using namespace Genode; + +class SWCR::Cpu_session_component : public Genode::Rpc_object +{ + public: + Cpu_session_component() { } + ~Cpu_session_component() { } + + Thread_capability create_thread(Capability pd, + Name const &name, + Affinity::Location affinity, + Weight weight, + addr_t utcb = 0) { }; + void kill_thread(Thread_capability thread) { }; + void exception_sigh(Signal_context_capability) { }; + Affinity::Space affinity_space() const { }; + Dataspace_capability trace_control() { }; + int ref_account(Cpu_session_capability cpu_session) { }; + int transfer_quota(Cpu_session_capability cpu_session, size_t amount) { }; + Quota quota() { }; + Capability native_cpu() { }; +}; + +class SWCR::Cpu_session_factory : public Genode::Local_service::Factory +{ + private: + Genode::Allocator &_alloc; + + public: + Cpu_session_factory(Genode::Allocator &alloc) : _alloc(alloc) { } + ~Cpu_session_factory() { } + + Cpu_session_component &create(Args const &, Genode::Affinity) override + { + return *new (_alloc) Cpu_session_component(); + } + + void upgrade(Cpu_session_component &, Args const &) override { } + + void destroy(Cpu_session_component &session) override + { + Genode::destroy(_alloc, &session); + } +}; \ No newline at end of file diff --git a/include/swcr/services/pd.h b/include/swcr/services/pd.h new file mode 100644 index 0000000..921e410 --- /dev/null +++ b/include/swcr/services/pd.h @@ -0,0 +1,200 @@ +#ifndef __swcr_pd_h__ +#define __swcr_pd_h__ + +#include +#include + +namespace SWCR +{ + class Pd_session_component; + class Pd_session_factory; +} + +using namespace Genode; + +class SWCR::Pd_session_component : public Genode::Rpc_object +{ + private: + Genode::Env &_env; + Genode::Pd_connection _real_pd; + + public: + Pd_session_component(Genode::Env &env, const char *label) : _env(env), _real_pd(_env, label) + { + _env.ep().rpc_ep().manage(this); + } + ~Pd_session_component() + { + _env.ep().rpc_ep().dissolve(this); + } + + Ram_dataspace_capability alloc(size_t size, Cache_attribute cached = CACHED) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.alloc(size, cached); + }; + + void free(Ram_dataspace_capability ds) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.free(ds); + }; + + size_t dataspace_size(Ram_dataspace_capability ds) const + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.dataspace_size(ds); + }; + + void assign_parent(Capability parent) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.assign_parent(parent); + }; + + bool assign_pci(addr_t pci_config_memory_address, uint16_t bdf) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.assign_pci(pci_config_memory_address, bdf); + }; + + void map(addr_t virt, addr_t size) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.map(virt, size); + }; + + Signal_source_capability alloc_signal_source() + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.alloc_signal_source(); + }; + + void free_signal_source(Signal_source_capability cap) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.free_signal_source(cap); + }; + + Capability alloc_context(Signal_source_capability source, unsigned long imprint) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.alloc_context(source, imprint); + }; + + void free_context(Capability cap) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.free_context(cap); + }; + + void submit(Capability context, unsigned cnt = 1) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.submit(context, cnt); + }; + + Native_capability alloc_rpc_cap(Native_capability ep) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.alloc_rpc_cap(ep); + }; + + void free_rpc_cap(Native_capability cap) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.free_rpc_cap(cap); + }; + + Capability address_space() + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.address_space(); + }; + + Capability stack_area() + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.stack_area(); + }; + + Capability linker_area() + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.linker_area(); + }; + + void ref_account(Capability pd) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.ref_account(pd); + }; + + void transfer_quota(Capability to, Cap_quota amount) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.transfer_quota(to, amount); + }; + + Cap_quota cap_quota() const + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.cap_quota(); + }; + + Cap_quota used_caps() const + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.used_caps(); + }; + + void transfer_quota(Capability to, Ram_quota amount) + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + _real_pd.transfer_quota(to, amount); + }; + + Ram_quota ram_quota() const + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.ram_quota(); + }; + + Ram_quota used_ram() const + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.used_ram(); + }; + + Capability native_pd() + { + Genode::log("Pd::\033[33m", __func__, "\033[0m"); + return _real_pd.native_pd(); + }; +}; + +class SWCR::Pd_session_factory : public Genode::Local_service::Factory +{ + private: + Genode::Env &_env; + Genode::Allocator &_alloc; + const char *_label; + + public: + Pd_session_factory(Genode::Env &env, Genode::Allocator &alloc, const char *label) : _env(env), _alloc(alloc), _label(label) { } + ~Pd_session_factory() { } + + Pd_session_component &create(Args const &, Genode::Affinity) override + { + return *new (_alloc) Pd_session_component(_env, _label); + } + + void upgrade(Pd_session_component &, Args const &) override { } + + void destroy(Pd_session_component &session) override + { + Genode::destroy(_alloc, &session); + } +}; + +#endif /*__swcr_pd_h__*/ \ No newline at end of file diff --git a/include/swcr/target_child.h b/include/swcr/target_child.h new file mode 100644 index 0000000..b9d5afd --- /dev/null +++ b/include/swcr/target_child.h @@ -0,0 +1,68 @@ +#include +#include + +namespace SWCR +{ + class Target_child; + typedef Genode::Registered Parent_service; + typedef Genode::Registry Parent_services; +} + +class SWCR::Target_child : public Genode::Child_policy +{ + private: + Genode::Env &_env; + Genode::Cap_quota const _cap_quota { 50 }; + Genode::Ram_quota const _ram_quota { 1 * 1024 * 1024 }; + + Parent_services &_parent_services; + + Genode::Local_service &_swcr_pd; + + Genode::Child _child; + + template + static Genode::Service *_find_service(Genode::Registry &services, Genode::Service::Name const &name) + { + Genode::Service *service = nullptr; + services.for_each([&] (T &s) { + if (!service && (s.name() == name)) + service = &s; + }); + return service; + } + + Genode::Child_policy::Route + resolve_session_request(Genode::Service::Name const &service_name, + Genode::Session_label const &label) override + { + Genode::log(__func__, ": ", service_name, " ", label); + auto route = [&] (Genode::Service &service) { + return Genode::Child_policy::Route { .service = service, + .label = label, + .diag = Genode::Session::Diag() }; }; + + Genode::Service *service = nullptr; + if (!Genode::strcmp("PD", service_name.string())) + service = &_swcr_pd; + else + service = _find_service(_parent_services, service_name); + return route(*service); + } + + public: + Target_child(Genode::Env &env, Parent_services &parent_services, Genode::Local_service &swcr_pd) : _env(env), _parent_services(parent_services), _swcr_pd(swcr_pd), _child(_env.rm(), _env.ep().rpc_ep(), *this) { } + ~Target_child() { }; + + Name name() const override { return "hello"; }; + + Genode::Pd_session &ref_pd() override { return _env.pd(); } + Genode::Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); } + + void init(Genode::Pd_session &pd, Genode::Pd_session_capability pd_cap) override + { + pd.ref_account(ref_pd_cap()); + ref_pd().transfer_quota(pd_cap, _cap_quota); + ref_pd().transfer_quota(pd_cap, _ram_quota); + } +}; \ No newline at end of file diff --git a/run/swcr.run b/run/swcr.run new file mode 100644 index 0000000..f093bee --- /dev/null +++ b/run/swcr.run @@ -0,0 +1,96 @@ +# +# Build +# + +set use_usb_driver [expr [have_spec omap4] || [have_spec arndale] || [have_spec rpi]] +set use_nic_driver [expr !$use_usb_driver && ![have_spec odroid_xu] && ![have_spec linux]] + +if {[expr !$use_usb_driver && !$use_nic_driver] || + [expr [have_spec imx53] && [have_spec trustzone]]} { + puts "\n Run script is not supported on this platform. \n"; exit 0 } + +set build_components { + core init + drivers/timer drivers/nic + app/swcr app/hello +} + +lappend_if $use_usb_driver build_components drivers/usb +lappend_if [have_spec gpio] build_components drivers/gpio + +proc gpio_drv { } { if {[have_spec rpi] && [have_spec hw]} { return hw_gpio_drv } + if {[have_spec rpi] && [have_spec foc]} { return foc_gpio_drv } + return gpio_drv } + +source ${genode_dir}/repos/base/run/platform_drv.inc +append_platform_drv_build_components + +build $build_components + +create_boot_directory + +# +# Generate config +# + +set config { + + + + + + + + + + + + + + + + + + + + + + } + +append_if [have_spec gpio] config " + + + + + " + +append_if $use_usb_driver config { + + + + + + + + + } + +append_platform_drv_config + +append config { + +} + +install_config $config + +# +# Boot image +# + +build_boot_image { core ld.lib.so init swcr timer hello } + +append qemu_args " -nographic " + +#append_if [have_spec lan9119] qemu_args " -net nic,macaddr=02:00:00:00:01:03 -net nic,model=lan9118 -net tap,ifname=tap0,script=no " + +run_genode_until forever \ No newline at end of file diff --git a/src/app/swcr/main.cc b/src/app/swcr/main.cc new file mode 100644 index 0000000..accf901 --- /dev/null +++ b/src/app/swcr/main.cc @@ -0,0 +1,40 @@ +#include +#include +#include +//#include + +namespace SWCR +{ + struct Main; +} + +struct SWCR::Main +{ + Genode::Env &_env; + Genode::Heap _heap { _env.ram(), _env.rm() }; + + Parent_services _parent_services { }; + + Main(Genode::Env &env) : _env(env) + { + const char *names[] = { "RM", "PD", "CPU", "IO_MEM", "IO_PORT", "IRQ", "ROM", "LOG", 0 }; + + for (unsigned i = 0; names[i]; i++) + { + new (_heap) Parent_service(_parent_services, env, names[i]); + } + + /* custom services */ + SWCR::Pd_session_factory _psf { _env, _heap, "hello" }; + Genode::Local_service _pls { _psf }; + + Genode::log("creating child..."); + new (_heap) Target_child(_env, _parent_services, _pls); + Genode::log("done"); + } +}; + +void Component::construct(Genode::Env &env) +{ + static SWCR::Main main(env); +} \ No newline at end of file diff --git a/src/app/swcr/target.mk b/src/app/swcr/target.mk new file mode 100644 index 0000000..0f4a9ad --- /dev/null +++ b/src/app/swcr/target.mk @@ -0,0 +1,3 @@ +TARGET = swcr +SRC_CC = main.cc +LIBS = base \ No newline at end of file