ringbuffer, guid, iovec stuff, and mmio

This commit is contained in:
2026-10-14 23:26:30 +02:00
parent 4c781f31ad
commit d7857f18cd
13 changed files with 701 additions and 12 deletions
+16 -5
View File
@@ -8,31 +8,42 @@
typedef struct __iovec iovec_t;
struct iovec_iter {
typedef struct {
iovec_t* iovecs;
size_t iovecs_len;
size_t total_len;
size_t total_offset;
size_t current_idx;
size_t current_offset;
};
// Whether the iovecs point to user memory.
bool user;
} iovec_iter_t;
static inline size_t iovec_iter_len(struct iovec_iter* iter) {
static inline size_t iovec_iter_len(iovec_iter_t* iter) {
return iter->total_len - iter->total_offset;
}
// Creates an iovec iterator over kernel memory.
static inline struct iovec_iter iovec_iter_kernel(iovec_t* iovecs, size_t count) {
static inline iovec_iter_t iovec_iter_kernel(iovec_t* iovecs, size_t count) {
size_t total = 0;
for (size_t i = 0; i < count; i++)
total += iovecs[i].len;
return (struct iovec_iter){
return (iovec_iter_t){
.iovecs = iovecs,
.iovecs_len = count,
.total_len = total,
.total_offset = 0,
.current_idx = 0,
.current_offset = 0,
.user = false,
};
}
// Copies up to `len` bytes from `src` into the iterator and advances it.
// Returns the amount of bytes actually copied in `out_copied`.
errno_t iovec_iter_copy_to(iovec_iter_t* iter, const void* src, size_t len, size_t* out_copied);
// Copies up to `len` bytes out of the iterator into `dst` and advances it.
// Returns the amount of bytes actually copied in `out_copied`.
errno_t iovec_iter_copy_from(iovec_iter_t* iter, void* dst, size_t len, size_t* out_copied);