Skip to content

Commit 529c98f

Browse files
committed
fbdev
1 parent 7209ae9 commit 529c98f

4 files changed

Lines changed: 382 additions & 11 deletions

File tree

kernel/interfaces/system/memory/vmm.cppm

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

kernel/source/drivers/fs/dev/mem.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ namespace fs::dev::mem
112112
}
113113
};
114114

115-
// TODO
116115
struct random_dev : vfs::ops
117116
{
118117
static std::shared_ptr<random_dev> singleton()
@@ -194,7 +193,6 @@ namespace fs::dev::mem
194193
}
195194
};
196195

197-
using namespace vfs::dev;
198196
create("null", stat::s_ifchr | 0666, makedev(1, 3));
199197
create("zero", stat::s_ifchr | 0666, makedev(1, 5));
200198
create("full", stat::s_ifchr | 0666, makedev(1, 7));

0 commit comments

Comments
 (0)