Iros
 
Loading...
Searching...
No Matches
userspace_ptr.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/util/prelude.h"
4#include "iris/core/error.h"
6
7namespace iris {
8namespace detail {}
9template<di::concepts::ImplicitLifetime T>
10class UserspacePtr {
11private:
12 using Value = di::meta::RemoveConst<T>;
13
14 union Uninit {
15 Uninit() {}
16 ~Uninit() {}
17
18 Value value;
19 };
20
21 explicit UserspacePtr(T* pointer) : m_pointer(pointer) {}
22
23public:
24 static auto create(T* pointer) -> Expected<UserspacePtr<T>> {
25 if (!validate_user_region(mm::VirtualAddress(di::to_uintptr(pointer)), 1, sizeof(T))) {
27 }
28 return UserspacePtr<T>(pointer);
29 }
30
31 auto read() const -> Expected<Value> {
32 Uninit value;
33 TRY(copy_from_user({ reinterpret_cast<byte const*>(m_pointer), sizeof(Value) },
34 reinterpret_cast<byte*>(&value.value)));
35 return di::move(value.value);
36 }
37
38 auto write(Value const& value) const -> Expected<void> {
39 return copy_to_user({ reinterpret_cast<byte const*>(&value), sizeof(Value) },
40 reinterpret_cast<byte*>(m_pointer));
41 }
42
43 auto raw_userspace_pointer() const -> T* { return m_pointer; }
44
45private:
46 T* m_pointer { nullptr };
47};
48
49template<typename T>
51}
Definition unexpected.h:14
Definition userspace_ptr.h:10
auto read() const -> Expected< Value >
Definition userspace_ptr.h:31
auto raw_userspace_pointer() const -> T *
Definition userspace_ptr.h:43
auto write(Value const &value) const -> Expected< void >
Definition userspace_ptr.h:38
static auto create(T *pointer) -> Expected< UserspacePtr< T > >
Definition userspace_ptr.h:24
#define TRY
Definition monad_try.h:23
Type< detail::RemoveConstHelper< T > > RemoveConst
Definition core.h:43
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto to_uintptr
Definition to_uintptr.h:13
Definition object_pool.h:14
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
Definition cxx_init.cpp:12
@ BadAddress
Definition error.h:12
auto copy_to_user(di::Span< byte const > kernel_data, byte *userspace_ptr) -> Expected< void >
Definition userspace_access.cpp:33
auto copy_from_user(di::Span< byte const > userspace_data, byte *kernel_ptr) -> Expected< void >
Definition userspace_access.cpp:42
auto tag_invoke(di::Tag< read_file >, DebugFile &, UserspaceBuffer< byte > buffer) -> di::AnySenderOf< usize >
Definition debug_file.cpp:7
auto validate_user_region(mm::VirtualAddress userspace_address, usize count, usize size) -> Expected< void >
Definition userspace_access.cpp:70
di::vocab::Expected< T, di::platform::GenericCode > Expected
Definition error.h:324
Definition in_place_template.h:5