kern: fully implement KSharedMemory (and Svcs)

This commit is contained in:
Michael Scire
2020-07-22 02:50:19 -07:00
committed by SciresM
parent 81db43932d
commit 7aa3120f60
7 changed files with 314 additions and 7 deletions

View File

@@ -17,11 +17,43 @@
#include <mesosphere/kern_common.hpp>
#include <mesosphere/kern_k_auto_object.hpp>
#include <mesosphere/kern_slab_helpers.hpp>
#include <mesosphere/kern_select_page_table.hpp>
namespace ams::kern {
class KProcess;
class KResourceLimit;
class KSharedMemory final : public KAutoObjectWithSlabHeapAndContainer<KSharedMemory, KAutoObjectWithList> {
MESOSPHERE_AUTOOBJECT_TRAITS(KSharedMemory, KAutoObject);
private:
KPageGroup page_group;
KResourceLimit *resource_limit;
u64 owner_process_id;
ams::svc::MemoryPermission owner_perm;
ams::svc::MemoryPermission remote_perm;
bool is_initialized;
public:
explicit KSharedMemory()
: page_group(std::addressof(Kernel::GetBlockInfoManager())), resource_limit(nullptr), owner_process_id(std::numeric_limits<u64>::max()),
owner_perm(ams::svc::MemoryPermission_None), remote_perm(ams::svc::MemoryPermission_None), is_initialized(false)
{
/* ... */
}
virtual ~KSharedMemory() { /* ... */ }
Result Initialize(KProcess *owner, size_t size, ams::svc::MemoryPermission own_perm, ams::svc::MemoryPermission rem_perm);
virtual void Finalize() override;
virtual bool IsInitialized() const override { return this->is_initialized; }
static void PostDestroy(uintptr_t arg) { /* ... */ }
Result Map(KProcessPageTable *table, KProcessAddress address, size_t size, KProcess *process, ams::svc::MemoryPermission map_perm);
Result Unmap(KProcessPageTable *table, KProcessAddress address, size_t size, KProcess *process);
u64 GetOwnerProcessId() const { return this->owner_process_id; }
size_t GetSize() const { return this->page_group.GetNumPages() * PageSize; }
public:
/* TODO: This is a placeholder definition. */
};