/* * \brief Core-specific instance of the VM session interface * \author Stefan Kalkowski * \date 2012-10-08 */ /* * Copyright (C) 2012-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. */ #ifndef _CORE__SPEC__ARM_V7__VIRTUALIZATION__VM_SESSION_COMPONENT_H_ #define _CORE__SPEC__ARM_V7__VIRTUALIZATION__VM_SESSION_COMPONENT_H_ /* Genode includes */ #include #include #include #include #include #include /* Core includes */ #include #include #include #include #include #include namespace Genode { class Vm_session_component; } class Genode::Vm_session_component : private Ram_quota_guard, private Cap_quota_guard, public Rpc_object, public Region_map_detach { private: typedef Allocator_avl_tpl Avl_region; /* * Noncopyable */ Vm_session_component(Vm_session_component const &); Vm_session_component &operator = (Vm_session_component const &); using Table = Hw::Level_1_stage_2_translation_table; using Array = Table::Allocator::Array; Rpc_entrypoint &_ep; Constrained_ram_allocator _constrained_md_ram_alloc; Sliced_heap _sliced_heap; Avl_region _map { &_sliced_heap }; Region_map &_region_map; Ram_dataspace_capability _ds_cap { }; Region_map::Local_addr _ds_addr { nullptr }; Table &_table; Array &_table_array; Kernel_object _kobj {}; static size_t _ds_size() { return align_addr(sizeof(Vm_state), get_page_size_log2()); } addr_t _alloc_ds(); void * _alloc_table(); void _attach(addr_t phys_addr, addr_t vm_addr, size_t size); void _attach_vm_memory(Dataspace_component &, addr_t, Attach_attr); void _detach_vm_memory(addr_t, size_t); protected: Ram_quota_guard &_ram_quota_guard() { return *this; } Cap_quota_guard &_cap_quota_guard() { return *this; } public: using Ram_quota_guard::upgrade; using Cap_quota_guard::upgrade; using Rpc_object::cap; Vm_session_component(Rpc_entrypoint &, Resources, Label const &, Diag, Ram_allocator &ram, Region_map &, unsigned, Trace::Source_registry &); ~Vm_session_component(); /********************************* ** Region_map_detach interface ** *********************************/ void detach(Region_map::Local_addr) override; void unmap_region(addr_t, size_t) override; /************************** ** Vm session interface ** **************************/ Dataspace_capability _cpu_state(Vcpu_id) { return _ds_cap; } void _exception_handler(Signal_context_capability, Vcpu_id); void _run(Vcpu_id); void _pause(Vcpu_id); void attach(Dataspace_capability, addr_t, Attach_attr) override; void attach_pic(addr_t) override; void detach(addr_t, size_t) override; Vcpu_id _create_vcpu(Thread_capability) { return 0; } }; #endif /* _CORE__SPEC__ARM_V7__VIRTUALIZATION__VM_SESSION_COMPONENT_H_ */