9template<di::concepts::ImplicitLifetime T>
10class UserspaceBuffer {
17 explicit UserspaceBuffer(T* pointer,
usize length) : m_buffer(pointer, length) {}
24 return UserspaceBuffer<T> { pointer, length };
30 auto to_write =
di::min(
data.size_bytes(), m_buffer.size_bytes());
36 auto to_read =
di::min(buffer.size_bytes(), m_buffer.size_bytes());
45 TRY(
string.reserve_from_nothing(
size()));
46 string.assume_size(
size());
47 TRY(
copy_to({
reinterpret_cast<byte*
>(
string.span().
data()),
string.size() }));
61 template<usize chunk_size>
63 auto buffer =
di::Array<
byte,
sizeof(Storage) * chunk_size> {};
64 for (
auto offset : di::range(
size_bytes()) | di::stride(
sizeof(Storage) * chunk_size)) {
66 auto userspace_buffer =
reinterpret_cast<byte const*
>(m_buffer.data()) + offset;
68 TRY(process_chunk({
reinterpret_cast<Storage*
>(buffer.data()), to_read /
sizeof(Storage) }));
73 auto size() const ->
usize {
return m_buffer.size(); }
75 [[nodiscard]]
auto empty() const ->
bool {
return m_buffer.empty(); }
79 m_buffer = *m_buffer.subspan(offset);
#define ASSERT_LT_EQ
Definition assert_binary.h:88
Definition function_ref.h:116
Definition span_forward_declaration.h:10
Definition unexpected.h:14
Definition userspace_buffer.h:10
auto copy_to_string() const -> Expected< di::TransparentString > requires(is_byte)
Definition userspace_buffer.h:41
auto empty() const -> bool
Definition userspace_buffer.h:75
auto size() const -> usize
Definition userspace_buffer.h:73
auto write(di::Span< T const > data) const -> Expected< usize > requires(!is_const)
Definition userspace_buffer.h:27
auto copy_to_path() const -> Expected< di::Path > requires(is_byte)
Definition userspace_buffer.h:51
auto copy_in_chunks(di::FunctionRef< Expected< void >(di::Span< Storage >)> process_chunk) const -> Expected< void >
Definition userspace_buffer.h:62
auto size_bytes() const -> usize
Definition userspace_buffer.h:74
auto copy_to(di::Span< Storage > buffer) const -> Expected< usize >
Definition userspace_buffer.h:35
static auto create(T *pointer, usize length) -> Expected< UserspaceBuffer< T > >
Definition userspace_buffer.h:20
void advance(usize offset)
Definition userspace_buffer.h:77
#define TRY
Definition monad_try.h:23
string::StringImpl< string::TransparentEncoding > TransparentString
Definition string.h:12
PathImpl< TransparentString > Path
Definition path.h:10
std::byte byte
Definition byte.h:64
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition zstring_parser.h:9
constexpr auto min
Definition min.h:47
constexpr auto as_bytes
Definition as_bytes.h:16
constexpr auto data
Definition data.h:51
constexpr auto to_uintptr
Definition to_uintptr.h:13
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
Definition cxx_init.cpp:12
@ FilenameTooLong
Definition error.h:27
@ 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
Definition span_fixed_size.h:37