Files
zinnia/kernel/include/kernel/vmo.h
T
2026-08-11 17:48:20 +02:00

48 lines
1.4 KiB
C

#pragma once
#include <zinnia/status.h>
#include <kernel/list.h>
#include <kernel/spin.h>
#include <kernel/virt.h>
#include <stddef.h>
#include <stdint.h>
struct vmo {
zn_status_t (*get_page)(struct vmo* vmo, uintptr_t offset_idx, struct page** out);
};
zn_status_t vmo_read(struct vmo* obj, uintptr_t offset, void* buf, size_t len, size_t* actual_read);
zn_status_t vmo_write(struct vmo* obj, uintptr_t offset, const void* buf, size_t len, size_t* actual_written);
zn_status_t vmo_copy(
struct vmo* target,
uintptr_t target_offset,
struct vmo* src,
uintptr_t src_offset,
size_t len,
size_t* actual_copied
);
struct pager_ops {
zn_status_t (*get_page)(struct pager_ops* pager, uintptr_t offset_idx, struct page** out);
zn_status_t (*put_page)(struct pager_ops* pager, uintptr_t offset_idx, struct page* page);
};
struct page_list {
uintptr_t offset;
struct page* value;
list_link(struct page_list*) next;
};
struct paged_vmo {
struct vmo object;
struct pager_ops source;
list_head(struct page_list*) cache;
struct spinlock lock;
};
zn_status_t vmo_new_paged(struct pager_ops ops, struct paged_vmo** out);
zn_status_t vmo_new_phys(struct paged_vmo** out);
// Creates a VMO backed by a specific physical address range (e.g. for MMIO).
zn_status_t vmo_new_phys_range(uintptr_t addr, size_t length, struct vmo** out);