From e3ebaeb2c8b84609f44fd696b3c68832b8fc1b50 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Thu, 28 Jan 2021 01:05:21 -0800 Subject: [PATCH] [kernel] Add new vm_area_fixed Add a new vm_area type, vm_area_fixed, which is sharable but not allocatable. Useful for mapping things like MMIO to process spaces. --- src/kernel/objects/vm_area.cpp | 11 +++++++++++ src/kernel/objects/vm_area.h | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/kernel/objects/vm_area.cpp b/src/kernel/objects/vm_area.cpp index f514093..13b1237 100644 --- a/src/kernel/objects/vm_area.cpp +++ b/src/kernel/objects/vm_area.cpp @@ -53,6 +53,17 @@ vm_area_shared::~vm_area_shared() } +vm_area_fixed::vm_area_fixed(size_t size, vm_flags flags) : + m_mapper {*this}, + vm_area {size, flags} +{ +} + +vm_area_fixed::~vm_area_fixed() +{ +} + + vm_area_open::vm_area_open(size_t size, vm_space &space, vm_flags flags) : m_mapper(*this, space), vm_area(size, flags) diff --git a/src/kernel/objects/vm_area.h b/src/kernel/objects/vm_area.h index dbeb18d..3bb7f1c 100644 --- a/src/kernel/objects/vm_area.h +++ b/src/kernel/objects/vm_area.h @@ -108,6 +108,26 @@ private: }; +/// A shareable but non-allocatable memory area (like mmio) +class vm_area_fixed : + public vm_area +{ +public: + /// Constructor. + /// \arg size Initial virtual size of the memory area + /// \arg flags Flags for this memory area + vm_area_fixed(size_t size, vm_flags flags = vm_flags::none); + virtual ~vm_area_fixed(); + + virtual bool allowed(uintptr_t offset) const override { return false; } + virtual vm_mapper & mapper() override { return m_mapper; } + virtual const vm_mapper & mapper() const override { return m_mapper; } + +private: + vm_mapper_multi m_mapper; +}; + + /// Area that allows open allocation (eg, kernel heap) class vm_area_open : public vm_area