@@ -40,8 +40,12 @@ export namespace vmm
4040 {
4141 };
4242
43- struct page ;
43+ constexpr page_size default_page_size ()
44+ {
45+ return page_size::small;
46+ }
4447
48+ struct page ;
4549 struct anon
4650 {
4751 page *pg;
@@ -110,7 +114,8 @@ export namespace vmm
110114 enum class object_type : std::uint8_t
111115 {
112116 shmem,
113- file
117+ file,
118+ mmio
114119 };
115120
116121 std::size_t cached_pages (object_type type);
@@ -143,6 +148,13 @@ export namespace vmm
143148 std::size_t write (std::uint64_t offset, lib::maybe_uspan<std::byte> buffer);
144149 std::size_t clear (std::uint64_t offset, std::uint8_t value, std::size_t length);
145150
151+ virtual std::optional<std::uintptr_t > direct_paddr (std::uint64_t offp)
152+ {
153+ lib::unused (offp);
154+ return std::nullopt ;
155+ }
156+ virtual caching cache_attr () const { return caching::normal; }
157+
146158 explicit object (object_type type = object_type::file) : type { type } { }
147159 virtual ~object ();
148160
@@ -167,6 +179,38 @@ export namespace vmm
167179 }
168180 };
169181
182+ struct pmemobject : object
183+ {
184+ std::uintptr_t base;
185+ std::size_t num_pages;
186+ caching cache;
187+
188+ pmemobject (std::uintptr_t base, std::size_t num_pages, caching cache = caching::normal)
189+ : object { object_type::mmio }, base { base }, num_pages { num_pages }, cache { cache } { }
190+
191+ std::optional<std::uintptr_t > direct_paddr (std::uint64_t offp) override
192+ {
193+ if (offp >= num_pages)
194+ return std::nullopt ;
195+ return base + offp * pagemap::from_page_size (default_page_size ());
196+ }
197+
198+ caching cache_attr () const override { return cache; }
199+
200+ private:
201+ lib::expect<void > fetch_pages (std::size_t idx, std::span<page *> pages) override
202+ {
203+ lib::unused (idx, pages);
204+ return std::unexpected { lib::err::invalid_argument };
205+ }
206+
207+ lib::expect<void > write_pages (std::size_t idx, std::span<page *> pages) override
208+ {
209+ lib::unused (idx, pages);
210+ return std::unexpected { lib::err::invalid_argument };
211+ }
212+ };
213+
170214 struct entry
171215 {
172216 std::uintptr_t startp;
@@ -245,11 +289,6 @@ export namespace vmm
245289 }
246290 };
247291
248- constexpr page_size default_page_size ()
249- {
250- return page_size::small;
251- }
252-
253292 page *page_for (std::uintptr_t addr);
254293 std::uintptr_t paddr_from (page *pg);
255294
0 commit comments