Files
zinnia/include/zinnia/vmo.h
T
2026-10-25 17:49:25 +01:00

66 lines
2.0 KiB
C

// SPDX-License-Identifier: ISC
#pragma once
#include <zinnia/errno.h>
#include <zinnia/iovec.h>
#include <zinnia/mutex.h>
#include <zinnia/pmap.h>
#include <zinnia/radix.h>
#include <zinnia/refcount.h>
#include <zinnia/tailq.h>
#include <zinnia/virt.h>
#include <stddef.h>
#include <stdint.h>
struct vmo;
struct vma_mapping;
struct vmo_pager_ops {
errno_t (*get_pages)(struct vmo* vmo, uint64_t index, struct page** pages, size_t count, size_t* out_valid);
errno_t (*put_pages)(struct vmo* vmo, uint64_t index, struct page** pages, size_t count);
errno_t (*lookup)(struct vmo* vmo, uint64_t index, phys_t* out);
size_t max_cluster;
void (*destroy)(struct vmo* vmo);
};
struct vmo {
struct refcount rc;
const struct vmo_pager_ops* pager;
mutex_t lock;
struct radix_tree pages;
tailq_head(struct vma_mapping) mappings;
uint64_t ra_next;
size_t ra_window;
enum cache_mode cache;
};
enum vmo_access {
VMO_READ,
VMO_WRITE,
};
void vmo_init(struct vmo* vmo, const struct vmo_pager_ops* pager);
void vmo_ref(struct vmo* obj);
void vmo_unref(struct vmo* obj);
errno_t vmo_new_anon(struct vmo** out);
errno_t vmo_get_page(struct vmo* vmo, uint64_t index, enum vmo_access access, struct page** out);
void vmo_put_page(struct page* page);
errno_t vmo_read(struct vmo* obj, uint64_t offset, void* buf, size_t len, size_t* actual_read);
errno_t vmo_write(struct vmo* obj, uint64_t offset, const void* buf, size_t len, size_t* actual_written);
errno_t vmo_read_iter(struct vmo* obj, uint64_t offset, iovec_iter_t* iter, size_t len, size_t* actual_read);
errno_t vmo_write_iter(struct vmo* obj, uint64_t offset, iovec_iter_t* iter, size_t len, size_t* actual_written);
errno_t vmo_copy(
struct vmo* target,
uint64_t target_offset,
struct vmo* src,
uint64_t src_offset,
size_t len,
size_t* actual_copied
);
errno_t vmo_sync(struct vmo* vmo, uint64_t first, uint64_t last);
void vmo_truncate(struct vmo* vmo, uint64_t length);