summaryrefslogtreecommitdiff
path: root/vm/vm_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm/vm_object.c')
-rw-r--r--vm/vm_object.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c
index 2fa2caae..9e91aad9 100644
--- a/vm/vm_object.c
+++ b/vm/vm_object.c
@@ -15,19 +15,47 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <kern/assert.h>
+#include <kern/error.h>
+#include <kern/llsync.h>
+#include <kern/mutex.h>
+#include <kern/param.h>
#include <kern/rdxtree.h>
#include <kern/stddef.h>
#include <kern/stdint.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
+int
+vm_object_add(struct vm_object *object, uint64_t offset, struct vm_page *page)
+{
+ int error;
+
+ mutex_lock(&object->lock);
+
+ error = rdxtree_insert(&object->pages, offset >> PAGE_SHIFT, page);
+
+ if (!error)
+ object->nr_pages++;
+
+ mutex_unlock(&object->lock);
+
+ assert(!error || (error == ERROR_NOMEM));
+
+ return error;
+}
+
struct vm_page *
vm_object_get(const struct vm_object *object, uint64_t offset)
{
- (void)object;
- (void)offset;
+ struct vm_page *page;
+
+ llsync_read_enter();
+
+ /* TODO Handle page state changes */
+ page = rdxtree_lookup(&object->pages, offset >> PAGE_SHIFT);
- /* TODO Bump radix tree key size to 64-bits */
+ llsync_read_leave();
- return NULL;
+ return page;
}