diff options
author | Richard Braun <rbraun@sceen.net> | 2013-07-05 14:24:41 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2013-07-06 19:02:10 +0200 |
commit | 4b2687bd96de7600ce2fc9cdea963ab511ac5c37 (patch) | |
tree | 6d60bede3f246a053b930a51adf1c585b5ae3e20 /vm/vm_object.c | |
parent | 1c389aca56725700cf9e99805eb90feb0b94072b (diff) |
actually, it didn't work, but does nowbasic_paging
Diffstat (limited to 'vm/vm_object.c')
-rw-r--r-- | vm/vm_object.c | 36 |
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; } |