/* * Copyright (c) 2017 Richard Braun. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * Virtual memory object. * * The purpose of VM objects is to track pages that are resident in * physical memory. They collectively form the page cache. */ #ifndef VM_OBJECT_H #define VM_OBJECT_H #include #include #include #include #include struct vm_object; static inline struct vm_object * vm_object_get_kernel_object(void) { extern struct vm_object vm_object_kernel_object; return &vm_object_kernel_object; } /* * Initialize a VM object. */ void vm_object_init(struct vm_object *object, uint64_t size); /* * Insert a page into a VM object. * * The offset must be page-aligned. * * The page becomes managed, and gains a reference. If successful, * the reference is kept. Otherwise it's dropped. If the page had * no references on entry, and a failure occurs, the page is freed. */ int vm_object_insert(struct vm_object *object, struct vm_page *page, uint64_t offset); /* * Remove pages from a VM object. * * The range boundaries must be page-aligned. * * Holes in the given range are silently skipped. Pages that are removed * become unmanaged and lose a reference. */ void vm_object_remove(struct vm_object *object, uint64_t start, uint64_t end); /* * Look up a page in a VM object. * * The offset must be page-aligned. * * If successful, the returned page gains a reference. Note that, if a valid * page is returned, it may already have been removed from the object, or * moved at a different offset. */ struct vm_page * vm_object_lookup(struct vm_object *object, uint64_t offset); /* * This init operation provides : * - module fully initialized */ INIT_OP_DECLARE(vm_object_setup); #endif /* VM_OBJECT_H */